Tommy 碎碎念
https://blog.teatime.com.tw/
Tommy Wu's blog
tommy
2024-03-19T13:51:33Z
-
讓 Gallery2 支援 PHP7
https://blog.teatime.com.tw/1/post/474
<p>原本以為 <a href="http://galleryproject.org/" target="_blank">Gallery2</a> 不用改就可以直接在 <a href="http://php.net/" target="_blank">PHP7</a> 底下使用, 不過.... 跑了一陣子, 發現... 應該只是 cache 的關係, 實際上是會有問題的.</p><p>修改的地方與之前改 LifeType 1.2 差不多, 不過, 由於在我家的 Debian 機器上, 有些模組是直接用系統本身的, 所以, 把 patch 分成了幾個部份.</p><p>主要是以 Gallery 2.3.2 為 base 所做出來的 patch, 一樣.... 也許有些地方不合, 自己就處理一下吧.</p><p>1. Gallery 部份<br /><a href="http://www.teatime.com.tw/~tommy/files/gallery/g2_php7.patch.gz" target="_blank">http://www.teatime.com.tw/~tommy/files/gallery/g2_php7.patch.gz</a> </p><p>2. Smarty 部份<br /><a href="http://www.teatime.com.tw/~tommy/files/gallery/g2_smarty_php7.patch.gz" target="_blank">http://www.teatime.com.tw/~tommy/files/gallery/g2_smarty_php7.patch.gz</a> </p><p>3. getid3 部份<br /><a href="http://www.teatime.com.tw/~tommy/files/gallery/g2_getid3_php7.patch.gz" target="_blank">http://www.teatime.com.tw/~tommy/files/gallery/g2_getid3_php7.patch.gz</a> </p><p>4. ADODB 部份<br /><a href="http://www.teatime.com.tw/~tommy/files/gallery/g2_adodb_php7.patch.gz" target="_blank">http://www.teatime.com.tw/~tommy/files/gallery/g2_adodb_php7.patch.gz</a> </p><p>我只有把我自己會用到的部份所產生的錯誤改掉, 不確定是不是所有的地方都改了, 如果還有問題... 就再說了. </p>
Gallery
Patch
2016-03-28T11:32:56Z
tommy
-
Gallery 由 2.x 升到 3 之後的網址轉換
https://blog.teatime.com.tw/1/post/405
<p>之前說過, 可以把 <a href="http://gallery.menalto.com/" target="_blank">Gallery</a> 2.x 與 3 看成是不同的軟體. G3 可以使用 g2_import 模組把原本 G2 的資料匯入到 G3 裡頭 (所有的檔案都會複製一份, 所以做好後在 G3 的任何動作都不會影響原本在 G2 裡的東西.</p><p>在 import 結束後, 官方的建議是把原本 G2 的網址, 轉給 G3 裡頭的 /g2/map 來處理, 以 nginx 來說, 就是用下面這個 rewrite 的設定 (應該只要轉這幾種就可以):</p><pre class="apache"><div class="insertcode"><pre class="apache" style="font-family: monospace">rewrite ^/((v|d|key|f|p|c)/.*)$ /g2/map?path=$1 last;</pre></div></pre><p>不過.... 要注意的是, 這個 g2 的功能, 是建立在 g2_import 這個模組之下的, 所以... 就算你已經 import 好了, 以後再也不需要用到 import 的功能, 還是不能把這個模組給取消掉, 因為... 沒有啟用這個模組就沒有 /g2/map 這個功能可以用.</p><p>如果你完全不打算用到 g2_import, 但仍想保有 /g2/map 的功能... 可以自己動手把裡頭一些用不到的東西移除... 或用我改的這個小模組 g2map.</p><p>g2map => <a href="http://www.teatime.com.tw/~tommy/files/gallery/g2map.tar.gz" target="_blank">http://www.teatime.com.tw/~tommy/files/gallery/g2map.tar.gz</a> </p><p>這是由 g2_import 裡頭把 g2.php 弄出來用的一個小模組, 就只是做 G2 => G3 的網址轉換工作. </p>
Gallery
2011-12-21T11:49:35Z
tommy
-
ZendGuardLoader + Gallery3 = segmentation fault?
https://blog.teatime.com.tw/1/post/403
<p>如果你在有使用 <a href="http://www.zend.com/en/products/guard/" target="_blank">Zend Guard</a> Loader 的網站中架設 <a href="http://gallery.menalto.com/" target="_blank">Gallery</a> 3 的話, 在跑完 install 的畫面之後, 你就會發現你的 Gallery 3 永遠都出現一個空白畫面. 這問題... 有人<a href="http://sourceforge.net/apps/trac/gallery/ticket/1749" target="_blank">在 Gallery 那邊問</a>, 想當然的.... 得到一個不是我們的問題的答案 (如果我是作者, 我也會這樣回答的), 也有人在 <a href="http://forums.zend.com/viewtopic.php?t=11953&f=57" target="_blank">Zend 那邊問</a>, 結果與我以前問 Zend 問題的經驗一樣.... 完全沒有任何作用.</p><p>解決方法, 其實很簡單, 那就是不要用 ZendGuardLoader.so 就好了 (別罵了, 我也知道這是什麼屁方法....). </p><p>原則上, 這是 ZendGaurdLoader 的問題, 由於這東西是人家賣的某產品的要用到的 loader, 並不是什麼 open source 的東西, 自然... 沒人會知道這東西是怎麼做的, 也沒有辦法自行去修改, 所以.... 有問題的請儘量去找 <a href="http://www.zend.com/en/" target="_blank">Zend</a> 這家公司吧. 不過... 雖然這家公司算是 <a href="http://www.php.net/" target="_blank">PHP</a> 這東西的核心公司 (要說是 PHP 的爸爸也可以), 不過... 我懷疑目前他們到底有多少懂 PHP 底層的開發人員在負責 Zend Guard 這東西, 光一個支援 PHP 5.3 的版本, 可以在一年多後還看不到影子 (別的類似產品的公司, 早就提供這個支援了), 好不容易終於生出了 ZendGuard 5.5 及相關的 loader 可以支援 PHP 5.3, 不過.... 看起來發生 segmentation fault 的情形並不算少數. 所以.... 這問題人家反應至少有半年了, 沒什麼下聞看起來也還算正常吧 (反正沒期待就不會受傷害). </p><p>如果你一定要用到 ZendGaurdLoader.so, 那... 由於這玩意並不能動態的載入, 只能在一開始執行 PHP 時就決定要不要載入這類的模組, 所以.... 如果你是用 Apache 加上 php 使用 module 的方式執行的話, 那.... 無解, 請再弄一台機器, 把需要用到 ZendGuardLoader 的程式與在 ZendGaurdLoader 中會有問題的程式分開來跑吧.</p><p>如果不行.... 那看能不能改成 CGI 或 FPM 的方式來跑 PHP, 把這些 CGI/FPM 的 daemon 指定不同的 port 或 socket file, 然後指定使用不同的 php.ini (在這兒決定要不要載入 ZendGuardLoader.so), 最後... 把需要 ZendGaurdLoader 的往有支援的那一個送, 這樣至少同一台機器中, 可以各取所需.</p><p>如果還是不行.... 那, 就修改你的程式吧, 看能不能避掉這問題.... 以我碰到的例子 (就是 Galley 3 這程式), 通常... 這問題發生在 <a href="http://www.php.net/manual/en/function.spl-autoload-register.php" target="_blank">autoload</a> 的處理上頭, 當搭配 autoload 使用時, 如果要去判斷一個 class 或其中某個 method 是否存在時 (就是使用 <a href="http://www.php.net/manual/en/function.class-exists.php" target="_blank">class_exists()</a> 或 <a href="http://www.php.net/manual/en/function.method-exists.php" target="_blank">method_exists()</a> 去判斷), 這類的程式會做一個 autoload 的動作, 嘗試去載入相關的定義檔.... 但是如果真的沒有那個檔案存在, 在沒有 ZendGaurdLoader 時, 會去執行一次 spl_autoload_register() 的 function, 然後就回覆 false. 但是... 如果有 ZendGuardLoader 時, 會對同一個 class 或 method 去執行那個 autoload 的 function, 且第三次傳入的 class 名稱是一個亂數, 然後.... 程式就會出現 segmentation fault 就掛了.</p><p>要避免這問題, 一個就是大幅改寫程式, 儘量不要用 autoload 的方式處理. (我知道很難... 比重寫還麻煩)</p><p>另一個是偷吃步.... 在 autoload 處理時, 如果那個 class 的定義檔案是不存在的, 就產生一個 dummy 的 class 給系統 (反正不存在表示之後也不會用到), 讓系統以為有這個 class (只是沒有任何 property 與 method), 這樣就可以避開這個 bug.</p><p>以 Gallery 3 來說:</p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">--- gallery3.orig/system/core/Kohana.php 2011-05-25 12:04:04.000000000 +0800<br /><span class="re4">+++ gallery3/system/core/Kohana.php <span class="nu0">2011</span>-<span class="nu0">12</span>-<span class="nu0">20</span> <span class="nu0">21</span>:<span class="nu0">59</span>:<span class="nu0">20.901236982</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">698</span>,<span class="nu0">6</span> +<span class="nu0">698</span>,<span class="nu0">26</span> @@</span><br /> else<br /> <span class="br0">{</span><br /> // The class could not be found<br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // avoid segmentation fault in Zend Guard</span><br /><span class="re8">+ // because when ZendGuardLoader enable, it will try to load the same class again if it's not exist, then... it will try a random name, then segmentation fault</span><br /><span class="re8">+ // so we keep the name first, then if it try again</span><br /><span class="re8">+ // create a dummy class for it</span><br /><span class="re8">+ //</span><br /><span class="re8">+ // only check this if ZendGuardLoader exist</span><br /><span class="re8">+ if <span class="br0">(</span>extension_loaded<span class="br0">(</span>'Zend Guard Loader'<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ static $last_name = '';</span><br /><span class="re8">+</span><br /><span class="re8">+ // reject it first</span><br /><span class="re8">+ if <span class="br0">(</span>$last_name !== $class<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ $last_name = $class;</span><br /><span class="re8">+ return FALSE;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ // create dummy one if try again</span><br /><span class="re8">+ Kohana_Log::add<span class="br0">(</span>'debug', 'create dummy class: '.$class<span class="br0">)</span>;</span><br /><span class="re8">+ eval<span class="br0">(</span>"class $class <span class="br0">{</span> <span class="br0">}</span>"<span class="br0">)</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ // twu2 end</span><br /> return FALSE;<br /> <span class="br0">}</span></pre></div></pre><p>這個改法, 可以在不存在該 class 定義時, 建一個空的 class 來用. 這樣子的處理, 就可以讓 Gallery 3 避開 ZendGuardLoader 的 bug 了. 不過... 最好的方法, 還是不要一起用吧.</p><p>PS. 上頭的改法, 原本直接產生的方式, 會造成 g2_import 不正常, 因為 g2_import 會載入的 class 並不放在 G3 這系統下, 所以... 解決方法是不去處理 G2 的 class (只能碰到一個就加一個), 或... 改成目前的方式, 反正出問題時, 會連續對同一個 class 做兩次這動作 (正常情形下, 不過有沒有都應該只做一次), 最後一個奇怪名字的 class 後才 segmentation fault. 所以... 就把名字記下來, 重複的第二次才去產生那個 dummy class, 這樣子看起來就正常了. (也許之後還會有問題.... 所以最好是分開來, 不要一起用吧, 把 ZendGuardLoader 用在只需要它的地方就好了)</p>
Gallery
PHP
2011-12-20T12:36:36Z
tommy
-
Gallery 3 的 Search 中文修正
https://blog.teatime.com.tw/1/post/401
<p>在 <a href="http://gallery.menalto.com/" target="_blank">Gallery</a> 3 的 <a href="http://codex.gallery2.org/Gallery3:Modules:search" target="_blank">Search 模組</a>中, 是透過 <a href="http://www.mysql.com/" target="_blank">MySQL</a> 的 <a href="http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html" target="_blank">full-text search</a> 方式來處理, 不過... 這個方式對於 CJK 之類的文字, 由於無法分辨詞的斷點, 是無法正常運作的. 這個修改, 是把有非英文的 search, 改成 like 來處理 (東西一多, 也許效能會很差, 所以... 如果你的系統這樣子改之後, 找東西變很慢的話, 就不要用了).</p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">diff -Nur gallery3.orig/modules/search/helpers/search.php gallery3/modules/search/helpers/search.php<br /><span class="re3">--- gallery3.orig/modules/search/helpers/search.php <span class="nu0">2011</span>-05-<span class="nu0">25</span> <span class="nu0">12</span>:04:<span class="nu0">04.000000000</span> +0800</span><br /><span class="re4">+++ gallery3/modules/search/helpers/search.php <span class="nu0">2011</span>-<span class="nu0">12</span>-<span class="nu0">16</span> <span class="nu0">15</span>:<span class="nu0">10</span>:<span class="nu0">51.490772461</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">36</span>,<span class="nu0">6</span> +<span class="nu0">36</span>,<span class="nu0">14</span> @@</span><br /> <br /> static function search<span class="br0">(</span>$q, $limit, $offset<span class="br0">)</span> <span class="br0">{</span><br /> $db = Database::instance<span class="br0">(</span><span class="br0">)</span>;<br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // mysql full-text search is not work for CJK, so we won't do it</span><br /><span class="re8">+ $not_ascii = false;</span><br /><span class="re8">+ $x = preg_replace<span class="br0">(</span>'/<span class="br0">[</span>\x80-\xFFFFFF<span class="br0">]</span>/', '', $q<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>$x !== $q<span class="br0">)</span></span><br /><span class="re8">+ $not_ascii = true; </span><br /><span class="re8">+ else</span><br /><span class="re8">+ // twu2 end</span><br /> $q = $db->escape<span class="br0">(</span>$q<span class="br0">)</span>;<br /> <br /> if <span class="br0">(</span>!identity::active_user<span class="br0">(</span><span class="br0">)</span>->admin<span class="br0">)</span> <span class="br0">{</span><br /><span class="re6">@@ -<span class="nu0">47</span>,<span class="nu0">6</span> +<span class="nu0">55</span>,<span class="nu0">34</span> @@</span><br /> $access_sql = "";<br /> <span class="br0">}</span><br /> <br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ if <span class="br0">(</span>$not_ascii<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ $data_filter = '';</span><br /><span class="re8">+ $items = explode<span class="br0">(</span>' ', $q<span class="br0">)</span>;</span><br /><span class="re8">+ foreach <span class="br0">(</span>$items as $v<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ $s = rtrim<span class="br0">(</span>$v, '*'<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>$s === ''<span class="br0">)</span> continue;</span><br /><span class="re8">+ $s = str_replace<span class="br0">(</span>'%', '\%', $s<span class="br0">)</span>;</span><br /><span class="re8">+ $s = str_replace<span class="br0">(</span>'_', '\_', $s<span class="br0">)</span>;</span><br /><span class="re8">+ $s = $db->escape<span class="br0">(</span>$s<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>$data_filter == ''<span class="br0">)</span></span><br /><span class="re8">+ $data_filter = "<span class="br0">(</span><span class="br0">{</span>search_records<span class="br0">}</span>.`data` LIKE '%$s%'<span class="br0">)</span>";</span><br /><span class="re8">+ else</span><br /><span class="re8">+ $data_filter .= " OR <span class="br0">(</span><span class="br0">{</span>search_records<span class="br0">}</span>.`data` LIKE '%$s%'<span class="br0">)</span>";</span><br /><span class="re8">+ <span class="br0">}</span> </span><br /><span class="re8">+ if <span class="br0">(</span>$data_filter == ''<span class="br0">)</span></span><br /><span class="re8">+ $data_filter = "<span class="br0">(</span><span class="br0">{</span>search_records<span class="br0">}</span>.`id` IS NULL<span class="br0">)</span>";</span><br /><span class="re8">+ $query =</span><br /><span class="re8">+ "SELECT SQL_CALC_FOUND_ROWS <span class="br0">{</span>items<span class="br0">}</span>.*, " .</span><br /><span class="re8">+ " <span class="nu0">1</span> AS `score` " .</span><br /><span class="re8">+ "FROM <span class="br0">{</span>items<span class="br0">}</span> JOIN <span class="br0">{</span>search_records<span class="br0">}</span> ON <span class="br0">(</span><span class="br0">{</span>items<span class="br0">}</span>.`id` = <span class="br0">{</span>search_records<span class="br0">}</span>.`item_id`<span class="br0">)</span> " .</span><br /><span class="re8">+ "WHERE <span class="br0">(</span>$data_filter<span class="br0">)</span> " .</span><br /><span class="re8">+ $access_sql .</span><br /><span class="re8">+ "ORDER BY `name` DESC " .</span><br /><span class="re8">+ "LIMIT $limit OFFSET $offset";</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ else </span><br /><span class="re8">+ // twu2 end</span><br /> $query =<br /> "SELECT SQL_CALC_FOUND_ROWS <span class="br0">{</span>items<span class="br0">}</span>.*, " .<br /> " MATCH<span class="br0">(</span><span class="br0">{</span>search_records<span class="br0">}</span>.`data`<span class="br0">)</span> AGAINST <span class="br0">(</span>'$q'<span class="br0">)</span> AS `score` " .</pre></div></pre><p>這樣子改, 是可以找到資料.... 資料少的時候,速度應該也不會有問題. 等以後資料多的時候, 再看看會不會有什麼重大的效能影響吧. </p>
Gallery
PHP
2011-12-16T15:13:00Z
tommy
-
Gallery 3 模組: imageblock2
https://blog.teatime.com.tw/1/post/398
<p>這個模組修改自 <a href="http://gallery.menalto.com/" target="_blank">Gallery</a> 3 的 <a href="http://codex.gallery2.org/Gallery3:Modules:imageblockex" target="_blank">imageblockex</a> 模組.</p><p>因為 imageblockex 有部份的功能無法滿足我的需求:</p><ul><li>RSS Type 選擇 Current Album 會造成程式無法正常運作 (就是寫錯了, 某個變數沒有傳入).</li><li><a href="http://www.flashyourweb.com/article.php?story=mini_slideshow" target="_blank">minislideshow</a> 的參數有些不滿意. (當然我改了之後, 也許別人拿去用也會不滿意)</li><li>沒有支援 flash 時就看不到東西 (改成靜態的隨機圖片)</li><li>選擇要不要用 minislideshow (變成跟原本的 image_block 類似, 不過仍可以依據 RSS Type 來取得資料) </li><li>加上之前<a href="http://blog.teatime.com.tw/1/post/393" target="_blank">修正的 RSS 亂數選擇參數</a>.</li></ul><p>使用的方式可以參考 imageblockex 的說明.</p><p>檔案放這兒: <a href="http://www.teatime.com.tw/~tommy/files/gallery/imageblock2.tgz" target="_blank">http://www.teatime.com.tw/~tommy/files/gallery/imageblock2.tgz</a> </p><p>有需要的自己抓回去用吧. </p>
Gallery
PHP
2011-12-16T12:18:53Z
tommy
-
Gallery 3 模組: randimgex
https://blog.teatime.com.tw/1/post/397
<p>這個模組是修改自 <a href="http://gallery.menalto.com/" target="_blank">Gallery</a> 3 的 <a href="http://codex.gallery2.org/Gallery3:Modules:randimg" target="_blank">randimg </a> 模組.</p><p>因為 randimg 只會由整個 Gallery 3 的照片去亂數選擇一張, 無法指定只要某個相簿與其子相簿內的照片 (這是我要的功能), 所以就把這個模組改一改來用了.</p><p>使用的方法可以參考 randimg, 用法是一樣的, 差別在於 url 由 /randimg 改成 /randimgex, 另外允許用 item 這個變數來選擇要抓那一個相簿的內容.</p><p>例如, 我有一個相簿的路徑是 tommy/tommy_baby, 而這個相簿代碼是 12345, 就可以用 </p><p>http://mygallery3/index.php/randimgex?item=12345</p><p>或 </p><p>http://mygallery3/index.php/randimgex?item=tommy/tommy_baby</p><p>來隨機抓取這相簿的一張縮圖出來用. 如果傳入的 item 是相片而不是相簿, 則會抓該相片所在的相簿, 如果 item 不存在, 就會隨機抓整個 Gallery 3 的內容.</p><p>檔案放這兒: <a href="http://www.teatime.com.tw/~tommy/files/gallery/randimgex.tgz" target="_blank">http://www.teatime.com.tw/~tommy/files/gallery/randimgex.tgz</a> </p><p>有需要的就自己抓回去用吧. </p>
Gallery
PHP
2011-12-16T12:04:32Z
tommy
-
讓 Gallery 3 接受更多種類的影片格式
https://blog.teatime.com.tw/1/post/396
<p>由於 <a href="http://gallery.menalto.com/" target="_blank">Gallery</a> 3 使用 <a href="http://flowplayer.org/" target="_blank">flowplayer</a> 這一個 flash player 的原因, 所以只接受 flv 與 mp4 (只能播 h.264, 不過有時會有影無聲) 這兩種檔案. 而在 Gallery 2 的時候, 是透過 <a href="http://www.apple.com/quicktime/download/" target="_blank">QuickTime</a> 的 plugin 來播放, 所以支援的格式似乎多了一些.</p><p>基本上, Gallery 對於影片檔案的處理, 是透過 <a href="http://ffmpeg.org/" target="_blank">ffmpeg</a> 去抓縮圖, 然後透過一小段 html/javascript 的碼去播放. 而 ffmpeg 幾乎通吃所有的影片格式, 所以縮圖的處理應該不會有問題. 至於播放的指令, 我們也可以針對不同的格式來使用不同的指令去處理, 如果該格式真的沒有任何 player 或 plugin 可以線上播放, 也可以選擇讓使用者可以直接下載那個檔案回去. 所以... 直接在程式裡頭限制只接受 flv 與 mp4 兩種格式, 對我來說是件很奇怪的事.... 尤其是, 目前使用的 Gallery 2 上頭除了 .mp4 之外, 還有 .mov, .avi 的檔案, 總不能到時要轉換到 Gallery 3 時, 要使用者放棄這些原本可以正常使用的檔案吧.</p><p>Gallery 3 對於檔案種類接受的選擇, 目前看來並沒有統一的判斷程式碼去處理 (似乎在目前的 git 裡頭, 因為 <a href="http://codex.gallery2.org/Gallery3:Modules:rawphoto" target="_blank">rawphoto</a> 的關係, 看來會有個 event 可以讓人比較容易的擴充, 到時加一種格式應該就不用每一個用到的模組都要去改了), 所以... 相關的程式碼分散在各個不同處理的模組內, 只能一個個去修改.</p><blockquote><p>PS: 提到 rawphoto, 這應該是我目前打算由 Gallery 2 轉到 Gallery 3 時, 沒辦法處理的地方, 它的新版本只能在 Gallery 目前的開發版本上使用, 而且看來並不怎麼好用, 而且開發版本目前有些功能會有問題 (如相片的搬移與排序會失敗), 所以... 可能會先不管這部份, 等 3.1 出來後再看看能不能放上去. </p></blockquote><p>至於要加入那些格式呢? 除了一般 flash player 支援的 .flv 與 .mp4 外, 我們可以使用 <a href="http://www.longtailvideo.com/players/jw-wmv-player/" target="_blank">JW WMV Player</a> , 這樣就可以支援 .asf 與 .wmv 的格式, 再來一樣用 QuickTime 的 plugin, 所以 .mov, .avi, .mpg/.mpeg 也可以支援. 所以, 下面的修正就是加上這幾類的格式. </p><p>首先是 Galley 對於 item 的處理:</p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">--- gallery3.orig/modules/gallery/models/item.php 2011-05-25 12:04:04.000000000 +0800<br /><span class="re4">+++ gallery3/modules/gallery/models/item.php <span class="nu0">2011</span>-<span class="nu0">12</span>-<span class="nu0">13</span> <span class="nu0">12</span>:<span class="nu0">55</span>:<span class="nu0">47.737415378</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">785</span>,<span class="nu0">7</span> +<span class="nu0">785</span>,<span class="nu0">11</span> @@</span><br /> return;<br /> <span class="br0">}</span><br /> <br /><span class="re7">- if <span class="br0">(</span>$this->is_movie<span class="br0">(</span><span class="br0">)</span> && !preg_match<span class="br0">(</span>"/^<span class="br0">(</span>flv|mp4|m4v<span class="br0">)</span>$/i", $ext<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // add more movie type</span><br /><span class="re8">+ if <span class="br0">(</span>$this->is_movie<span class="br0">(</span><span class="br0">)</span> && !preg_match<span class="br0">(</span>"/^<span class="br0">(</span>flv|mp4|m4v|mov|mpg|mpeg|avi|asf|wmv<span class="br0">)</span>$/i", $ext<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ //if <span class="br0">(</span>$this->is_movie<span class="br0">(</span><span class="br0">)</span> && !preg_match<span class="br0">(</span>"/^<span class="br0">(</span>flv|mp4|m4v<span class="br0">)</span>$/i", $ext<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ // twu2 end</span><br /> $v->add_error<span class="br0">(</span>"name", "illegal_data_file_extension"<span class="br0">)</span>;<br /> <span class="br0">}</span> else if <span class="br0">(</span>$this->is_photo<span class="br0">(</span><span class="br0">)</span> && !preg_match<span class="br0">(</span>"/^<span class="br0">(</span>gif|jpg|jpeg|png<span class="br0">)</span>$/i", $ext<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span><br /> $v->add_error<span class="br0">(</span>"name", "illegal_data_file_extension"<span class="br0">)</span>;<br /><span class="re6">@@ -<span class="nu0">877</span>,<span class="nu0">7</span> +<span class="nu0">881</span>,<span class="nu0">13</span> @@</span><br /> switch<span class="br0">(</span>$field<span class="br0">)</span> <span class="br0">{</span><br /> case "mime_type":<br /> if <span class="br0">(</span>$this->is_movie<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span><br /><span class="re7">- $legal_values = array<span class="br0">(</span>"video/flv", "video/x-flv", "video/mp4"<span class="br0">)</span>;</span><br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // add more type</span><br /><span class="re8">+ $legal_values = array<span class="br0">(</span>"video/flv", "video/x-flv", "video/mp4",</span><br /><span class="re8">+ "video/quicktime", "video/mpeg", "video/avi", "video/msvideo",</span><br /><span class="re8">+ "video/x-msvideo", "video/x-ms-asf", "video/x-ms-wmv"<span class="br0">)</span>;</span><br /><span class="re8">+ //$legal_values = array<span class="br0">(</span>"video/flv", "video/x-flv", "video/mp4"<span class="br0">)</span>;</span><br /><span class="re8">+ // twu2 end</span><br /> <span class="br0">}</span> if <span class="br0">(</span>$this->is_photo<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span><br /> $legal_values = array<span class="br0">(</span>"image/jpeg", "image/gif", "image/png"<span class="br0">)</span>;<br /> <span class="br0">}</span></pre></div></pre><p>對於 movie 格式的處理:</p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">--- gallery3.orig/modules/gallery/helpers/movie.php 2011-05-25 12:04:04.000000000 +0800<br /><span class="re4">+++ gallery3/modules/gallery/helpers/movie.php <span class="nu0">2011</span>-<span class="nu0">12</span>-<span class="nu0">12</span> <span class="nu0">14</span>:<span class="nu0">44</span>:<span class="nu0">18.310190863</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">114</span>,<span class="nu0">8</span> +<span class="nu0">114</span>,<span class="nu0">45</span> @@</span><br /> <br /> $pi = pathinfo<span class="br0">(</span>$file_path<span class="br0">)</span>;<br /> $extension = isset<span class="br0">(</span>$pi<span class="br0">[</span>"extension"<span class="br0">]</span><span class="br0">)</span> ? $pi<span class="br0">[</span>"extension"<span class="br0">]</span> : "flv"; // No extension? Assume FLV.<br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // add more mime type here</span><br /><span class="re8">+ /*</span><br /> $mime_type = in_array<span class="br0">(</span>strtolower<span class="br0">(</span>$extension<span class="br0">)</span>, array<span class="br0">(</span>"mp4", "m4v"<span class="br0">)</span><span class="br0">)</span> ?<br /> "video/mp4" : "video/x-flv";<br /><span class="re8">+ */</span><br /><span class="re8">+ switch <span class="br0">(</span>strtolower<span class="br0">(</span>$extension<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ case "mp4":</span><br /><span class="re8">+ case "m4v":</span><br /><span class="re8">+ $mime_type = "video/mp4";</span><br /><span class="re8">+ break;</span><br /><span class="re8">+</span><br /><span class="re8">+ case "mov":</span><br /><span class="re8">+ $mime_type = "video/quicktime";</span><br /><span class="re8">+ break;</span><br /><span class="re8">+</span><br /><span class="re8">+ case "mpg":</span><br /><span class="re8">+ case "mpeg":</span><br /><span class="re8">+ $mime_type = "video/mpeg";</span><br /><span class="re8">+ break;</span><br /><span class="re8">+</span><br /><span class="re8">+ case "avi":</span><br /><span class="re8">+ $mime_type = "video/avi";</span><br /><span class="re8">+ break;</span><br /><span class="re8">+</span><br /><span class="re8">+ case "asf":</span><br /><span class="re8">+ $mime_type = "video/x-ms-asf";</span><br /><span class="re8">+ break;</span><br /><span class="re8">+</span><br /><span class="re8">+ case "wmv":</span><br /><span class="re8">+ $mime_type = "video/x-ms-wmv";</span><br /><span class="re8">+ break;</span><br /><span class="re8">+</span><br /><span class="re8">+ case "flv":</span><br /><span class="re8">+ default:</span><br /><span class="re8">+ $mime_type = "video/x-flv";</span><br /><span class="re8">+ break;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ // twu2 end</span><br /> <br /> return array<span class="br0">(</span>$width, $height, $mime_type, $extension<span class="br0">)</span>;<br /> <span class="br0">}</span></pre></div></pre><p>接著是在 /file_proxy/ 對於這些檔案格式的存取:</p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">--- gallery3.orig/modules/gallery/controllers/file_proxy.php 2011-05-25 12:04:04.000000000 +0800<br /><span class="re4">+++ gallery3/modules/gallery/controllers/file_proxy.php <span class="nu0">2011</span>-<span class="nu0">12</span>-<span class="nu0">12</span> <span class="nu0">14</span>:<span class="nu0">31</span>:<span class="nu0">18.971974159</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">64</span>,<span class="nu0">7</span> +<span class="nu0">64</span>,<span class="nu0">12</span> @@</span><br /> // requesting the thumbnail for a movie. In that case, the .flv, .mp4 or .m4v file would<br /> // have been converted to a .jpg. So try some alternate types:<br /> if <span class="br0">(</span>preg_match<span class="br0">(</span>'/.jpg$/', $path<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span><br /><span class="re7">- foreach <span class="br0">(</span>array<span class="br0">(</span>"flv", "mp4", "m4v"<span class="br0">)</span> as $ext<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // add more movie extension</span><br /><span class="re8">+ $movie_ext = array<span class="br0">(</span>"flv", "mp4", "m4v", "mov", "mpg", "mpeg", "avi", "asf", "wmv"<span class="br0">)</span>;</span><br /><span class="re8">+ foreach <span class="br0">(</span>$movie_ext as $ext<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ //foreach <span class="br0">(</span>array<span class="br0">(</span>"flv", "mp4", "m4v"<span class="br0">)</span> as $ext<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ // twu2 end</span><br /> $movie_path = preg_replace<span class="br0">(</span>'/.jpg$/', ".$ext", $path<span class="br0">)</span>;<br /> $item = item::find_by_path<span class="br0">(</span>$movie_path<span class="br0">)</span>;<br /> if <span class="br0">(</span>$item->loaded<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></pre></div></pre><p>上傳的 form 接受的檔案格式 filter:</p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">--- gallery3.orig/modules/gallery/views/form_uploadify.html.php 2011-05-25 12:04:04.000000000 +0800<br /><span class="re4">+++ gallery3/modules/gallery/views/form_uploadify.html.php <span class="nu0">2011</span>-<span class="nu0">12</span>-<span class="nu0">13</span> <span class="nu0">13</span>:<span class="nu0">11</span>:<span class="nu0">40.976149205</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">28</span>,<span class="nu0">7</span> +<span class="nu0">28</span>,<span class="nu0">7</span> @@</span><br /> uploader: "<?= url::file<span class="br0">(</span>"lib/uploadify/uploadify.swf"<span class="br0">)</span> ?>",<br /> script: "<?= url::site<span class="br0">(</span>"uploader/add_photo/<span class="br0">{</span>$album->id<span class="br0">}</span>"<span class="br0">)</span> ?>",<br /> scriptData: <?= json_encode<span class="br0">(</span>$script_data<span class="br0">)</span> ?>,<br /><span class="re7">- fileExt: "*.gif;*.jpg;*.jpeg;*.png;*.GIF;*.JPG;*.JPEG;*.PNG<? if <span class="br0">(</span>$movies_allowed<span class="br0">)</span>: ?>;*.flv;*.mp4;*.m4v;*.FLV;*.MP4;*.M4V<? endif ?>",</span><br /><span class="re8">+ fileExt: "*.gif;*.jpg;*.jpeg;*.png;*.GIF;*.JPG;*.JPEG;*.PNG<? if <span class="br0">(</span>$movies_allowed<span class="br0">)</span>: ?>;*.flv;*.mp4;*.m4v;*.mov;*.mpg;*.mpeg;*.avi;*.asf;*.wmv;*.FLV;*.MP4;*.M4V;*.MOV;*.MPG;*.MPEG;*.AVI;*.ASF;*.WMV<? endif ?>",</span><br /> fileDesc: <?= t<span class="br0">(</span>"Photos and movies"<span class="br0">)</span>->for_js<span class="br0">(</span><span class="br0">)</span> ?>,<br /> cancelImg: "<?= url::file<span class="br0">(</span>"lib/uploadify/cancel.png"<span class="br0">)</span> ?>",<br /> simUploadLimit: <?= $simultaneous_upload_limit ?>,</pre></div></pre><p>上傳檔案後對檔案的處理:</p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">--- gallery3.orig/modules/gallery/controllers/uploader.php 2011-05-25 12:04:04.000000000 +0800<br /><span class="re4">+++ gallery3/modules/gallery/controllers/uploader.php <span class="nu0">2011</span>-<span class="nu0">12</span>-<span class="nu0">12</span> <span class="nu0">14</span>:<span class="nu0">35</span>:<span class="nu0">57.473710457</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">51</span>,<span class="nu0">7</span> +<span class="nu0">51</span>,<span class="nu0">11</span> @@</span><br /> $file_validation = new Validation<span class="br0">(</span>$_FILES<span class="br0">)</span>;<br /> $file_validation->add_rules<span class="br0">(</span><br /> "Filedata", "upload::valid", "upload::required",<br /><span class="re7">- "upload::type<span class="br0">[</span>gif,jpg,jpeg,png,flv,mp4,m4v<span class="br0">]</span>"<span class="br0">)</span>;</span><br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // add more movie extension</span><br /><span class="re8">+ "upload::type<span class="br0">[</span>gif,jpg,jpeg,png,flv,mp4,m4v,mov,mpg,mpeg,avi,asf,wmv<span class="br0">]</span>"<span class="br0">)</span>;</span><br /><span class="re8">+ //"upload::type<span class="br0">[</span>gif,jpg,jpeg,png,flv,mp4,m4v<span class="br0">]</span>"<span class="br0">)</span>;</span><br /><span class="re8">+ // twu2 end</span><br /> <br /> if <span class="br0">(</span>$form->validate<span class="br0">(</span><span class="br0">)</span> && $file_validation->validate<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span><br /> $temp_filename = upload::save<span class="br0">(</span>"Filedata"<span class="br0">)</span>;<br /><span class="re6">@@ -<span class="nu0">63</span>,<span class="nu0">8</span> +<span class="nu0">67</span>,<span class="nu0">14</span> @@</span><br /> $item->set_data_file<span class="br0">(</span>$temp_filename<span class="br0">)</span>;<br /> <br /> $path_info = @pathinfo<span class="br0">(</span>$temp_filename<span class="br0">)</span>;<br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // add more movie extension</span><br /><span class="re8">+ $movie_ext = array<span class="br0">(</span>"flv", "mp4", "m4v", "mov", "mpg", "mpeg", "avi", "asf", "wmv"<span class="br0">)</span>;</span><br /> if <span class="br0">(</span>array_key_exists<span class="br0">(</span>"extension", $path_info<span class="br0">)</span> &&<br /><span class="re7">- in_array<span class="br0">(</span>strtolower<span class="br0">(</span>$path_info<span class="br0">[</span>"extension"<span class="br0">]</span><span class="br0">)</span>, array<span class="br0">(</span>"flv", "mp4", "m4v"<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ in_array<span class="br0">(</span>strtolower<span class="br0">(</span>$path_info<span class="br0">[</span>"extension"<span class="br0">]</span><span class="br0">)</span>, $movie_ext<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ //if <span class="br0">(</span>array_key_exists<span class="br0">(</span>"extension", $path_info<span class="br0">)</span> &&</span><br /><span class="re8">+ // in_array<span class="br0">(</span>strtolower<span class="br0">(</span>$path_info<span class="br0">[</span>"extension"<span class="br0">]</span><span class="br0">)</span>, array<span class="br0">(</span>"flv", "mp4", "m4v"<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ // twu2 end</span><br /> $item->type = "movie";<br /> $item->save<span class="br0">(</span><span class="br0">)</span>;<br /> log::success<span class="br0">(</span>"content", t<span class="br0">(</span>"Added a movie"<span class="br0">)</span>,</pre></div></pre><p>經由 <a href="http://codex.gallery2.org/Gallery3:Modules:serveradd" target="_blank">serveradd</a> 模組匯入的處理:</p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">--- gallery3.orig/modules/server_add/controllers/server_add.php 2011-05-25 12:04:04.000000000 +0800<br /><span class="re4">+++ gallery3/modules/server_add/controllers/server_add.php <span class="nu0">2011</span>-<span class="nu0">12</span>-<span class="nu0">12</span> <span class="nu0">14</span>:<span class="nu0">42</span>:<span class="nu0">18.386101239</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">61</span>,<span class="nu0">7</span> +<span class="nu0">61</span>,<span class="nu0">11</span> @@</span><br /> <span class="br0">}</span><br /> if <span class="br0">(</span>!is_dir<span class="br0">(</span>$file<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span><br /> $ext = strtolower<span class="br0">(</span>pathinfo<span class="br0">(</span>$file, PATHINFO_EXTENSION<span class="br0">)</span><span class="br0">)</span>;<br /><span class="re7">- if <span class="br0">(</span>!in_array<span class="br0">(</span>$ext, array<span class="br0">(</span>"gif", "jpeg", "jpg", "png", "flv", "mp4", "m4v"<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // add more extension</span><br /><span class="re8">+ if <span class="br0">(</span>!in_array<span class="br0">(</span>$ext, array<span class="br0">(</span>"gif", "jpeg", "jpg", "png", "flv", "mp4", "m4v", "mov", "mpg", "mpeg", "avi", "asf", "wmv"<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ //if <span class="br0">(</span>!in_array<span class="br0">(</span>$ext, array<span class="br0">(</span>"gif", "jpeg", "jpg", "png", "flv", "mp4", "m4v"<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ // twu2 end</span><br /> continue;<br /> <span class="br0">}</span><br /> <span class="br0">}</span><br /><span class="re6">@@ -<span class="nu0">169</span>,<span class="nu0">7</span> +<span class="nu0">173</span>,<span class="nu0">11</span> @@</span><br /> foreach <span class="br0">(</span>$child_paths as $child_path<span class="br0">)</span> <span class="br0">{</span><br /> if <span class="br0">(</span>!is_dir<span class="br0">(</span>$child_path<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span><br /> $ext = strtolower<span class="br0">(</span>pathinfo<span class="br0">(</span>$child_path, PATHINFO_EXTENSION<span class="br0">)</span><span class="br0">)</span>;<br /><span class="re7">- if <span class="br0">(</span>!in_array<span class="br0">(</span>$ext, array<span class="br0">(</span>"gif", "jpeg", "jpg", "png", "flv", "mp4", "m4v"<span class="br0">)</span><span class="br0">)</span> ||</span><br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // add more extension</span><br /><span class="re8">+ if <span class="br0">(</span>!in_array<span class="br0">(</span>$ext, array<span class="br0">(</span>"gif", "jpeg", "jpg", "png", "flv", "mp4", "m4v", "mov", "mpg", "mpeg", "avi", "asf", "wmv"<span class="br0">)</span><span class="br0">)</span> ||</span><br /><span class="re8">+ //if <span class="br0">(</span>!in_array<span class="br0">(</span>$ext, array<span class="br0">(</span>"gif", "jpeg", "jpg", "png", "flv", "mp4", "m4v"<span class="br0">)</span><span class="br0">)</span> ||</span><br /><span class="re8">+ // twu2 end</span><br /> !filesize<span class="br0">(</span>$child_path<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span><br /> // Not importable, skip it.<br /> continue;<br /><span class="re6">@@ -<span class="nu0">266</span>,<span class="nu0">7</span> +<span class="nu0">274</span>,<span class="nu0">11</span> @@</span><br /> $photo->owner_id = $owner_id;<br /> $photo->save<span class="br0">(</span><span class="br0">)</span>;<br /> $entry->item_id = $photo->id;<br /><span class="re7">- <span class="br0">}</span> else if <span class="br0">(</span>in_array<span class="br0">(</span>$extension, array<span class="br0">(</span>"flv", "mp4", "m4v"<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // add more extension</span><br /><span class="re8">+ <span class="br0">}</span> else if <span class="br0">(</span>in_array<span class="br0">(</span>$extension, array<span class="br0">(</span>"flv", "mp4", "m4v", "mov", "mpg", "mpeg", "avi", "asf", "wmv"<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ //<span class="br0">}</span> else if <span class="br0">(</span>in_array<span class="br0">(</span>$extension, array<span class="br0">(</span>"flv", "mp4", "m4v"<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ // twu2 end</span><br /> $movie = ORM::factory<span class="br0">(</span>"item"<span class="br0">)</span>;<br /> $movie->type = "movie";<br /> $movie->parent_id = $parent->id;</pre></div></pre><p>經由 <a href="http://codex.gallery2.org/Gallery3:Modules:g2_import" target="_blank">g2_import</a> 模組由 Gallery 2 匯入的處理:</p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">diff -Nur gallery3.orig/modules/g2_import//helpers/g2_import.php gallery3/modules/g2_import//helpers/g2_import.php<br /><span class="re3">--- gallery3.orig/modules/g2_import//helpers/g2_import.php <span class="nu0">2011</span>-05-<span class="nu0">25</span> <span class="nu0">12</span>:04:<span class="nu0">04.000000000</span> +0800</span><br /><span class="re4">+++ gallery3/modules/g2_import//helpers/g2_import.php <span class="nu0">2011</span>-<span class="nu0">12</span>-<span class="nu0">12</span> <span class="nu0">14</span>:<span class="nu0">20</span>:<span class="nu0">56.994794072</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">678</span>,<span class="nu0">7</span> +<span class="nu0">678</span>,<span class="nu0">14</span> @@</span><br /> <br /> case "GalleryMovieItem":<br /> // @todo we should transcode other types into FLV<br /><span class="re7">- if <span class="br0">(</span>in_array<span class="br0">(</span>$g2_item->getMimeType<span class="br0">(</span><span class="br0">)</span>, array<span class="br0">(</span>"video/mp4", "video/x-flv"<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // add more movie type</span><br /><span class="re8">+ $movie_mimetype = array<span class="br0">(</span>"video/flv", "video/x-flv", "video/mp4", </span><br /><span class="re8">+ "video/quicktime", "video/mpeg", "video/avi", "video/msvideo",</span><br /><span class="re8">+ "video/x-msvideo", "video/x-ms-asf", "video/x-ms-wmv"<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>in_array<span class="br0">(</span>$g2_item->getMimeType<span class="br0">(</span><span class="br0">)</span>, $movie_mimetype<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ //if <span class="br0">(</span>in_array<span class="br0">(</span>$g2_item->getMimeType<span class="br0">(</span><span class="br0">)</span>, array<span class="br0">(</span>"video/mp4", "video/x-flv"<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ // twu2 end</span><br /> try <span class="br0">{</span><br /> $item = ORM::factory<span class="br0">(</span>"item"<span class="br0">)</span>;<br /> $item->type = "movie";<br /><span class="re6">@@ -<span class="nu0">700</span>,<span class="nu0">8</span> +<span class="nu0">707</span>,<span class="nu0">8</span> @@</span><br /> $item = null;<br /> <span class="br0">}</span><br /> <span class="br0">}</span> else <span class="br0">{</span><br /><span class="re7">- Kohana_Log::add<span class="br0">(</span>"alert", "$g2_path is an unsupported movie type"<span class="br0">)</span>;</span><br /><span class="re7">- $messages<span class="br0">[</span><span class="br0">]</span> = t<span class="br0">(</span>"'%path' is an unsupported movie type", array<span class="br0">(</span>"path" => $g2_path<span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+ Kohana_Log::add<span class="br0">(</span>"alert", "$g2_path is an unsupported movie type: ".$g2_item->getMimeType<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+ $messages<span class="br0">[</span><span class="br0">]</span> = t<span class="br0">(</span>"'%path' is an unsupported movie type: '%type'", array<span class="br0">(</span>"path" => $g2_path, "type" => $g2_item->getMimeType<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span>;</span><br /> $corrupt = <span class="nu0">1</span>;<br /> <span class="br0">}</span></pre></div></pre><p>最後是對於 movie 格式在產生播放頁面的處理:</p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">diff -Nur gallery3.orig/modules/gallery/views//movieplayer.flowplayer.html.php gallery3/modules/gallery/views//movieplayer.flowplayer.html.php<br /><span class="re3">--- gallery3.orig/modules/gallery/views//movieplayer.flowplayer.html.php <span class="nu0">1970</span>-01-01 08:00:<span class="nu0">00.000000000</span> +0800</span><br /><span class="re4">+++ gallery3/modules/gallery/views//movieplayer.flowplayer.html.php <span class="nu0">2011</span>-05-<span class="nu0">25</span> <span class="nu0">12</span>:04:<span class="nu0">04.000000000</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">0</span>,<span class="nu0">0</span> +<span class="nu0">1</span>,<span class="nu0">26</span> @@</span><br /><span class="re8">+<?php defined<span class="br0">(</span>"SYSPATH"<span class="br0">)</span> or die<span class="br0">(</span>"No direct script access."<span class="br0">)</span> ?></span><br /><span class="re8">+<?= html::anchor<span class="br0">(</span>$item->file_url<span class="br0">(</span>true<span class="br0">)</span>, "", $attrs<span class="br0">)</span> ?></span><br /><span class="re8">+<script type="text/javascript"></span><br /><span class="re8">+ flowplayer<span class="br0">(</span></span><br /><span class="re8">+ "<?= $attrs<span class="br0">[</span>"id"<span class="br0">]</span> ?>",</span><br /><span class="re8">+ <span class="br0">{</span></span><br /><span class="re8">+ src: "<?= url::abs_file<span class="br0">(</span>"lib/flowplayer.swf"<span class="br0">)</span> ?>",</span><br /><span class="re8">+ wmode: "transparent",</span><br /><span class="re8">+ provider: "pseudostreaming"</span><br /><span class="re8">+ <span class="br0">}</span>,</span><br /><span class="re8">+ <span class="br0">{</span></span><br /><span class="re8">+ clip: <span class="br0">{</span></span><br /><span class="re8">+ scaling: 'fit'</span><br /><span class="re8">+ <span class="br0">}</span>,</span><br /><span class="re8">+ plugins: <span class="br0">{</span></span><br /><span class="re8">+ pseudostreaming: <span class="br0">{</span></span><br /><span class="re8">+ url: "<?= url::abs_file<span class="br0">(</span>"lib/flowplayer.pseudostreaming.swf"<span class="br0">)</span> ?>"</span><br /><span class="re8">+ <span class="br0">}</span>,</span><br /><span class="re8">+ controls: <span class="br0">{</span></span><br /><span class="re8">+ autoHide: 'always',</span><br /><span class="re8">+ hideDelay: 2000</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ <span class="br0">)</span>.ipad<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+</script></span><br />diff -Nur gallery3.orig/modules/gallery/views//movieplayer.html.php gallery3/modules/gallery/views//movieplayer.html.php<br /><span class="re3">--- gallery3.orig/modules/gallery/views//movieplayer.html.php <span class="nu0">2011</span>-05-<span class="nu0">25</span> <span class="nu0">12</span>:04:<span class="nu0">04.000000000</span> +0800</span><br /><span class="re4">+++ gallery3/modules/gallery/views//movieplayer.html.php <span class="nu0">2011</span>-<span class="nu0">12</span>-<span class="nu0">14</span> <span class="nu0">14</span>:<span class="nu0">10</span>:<span class="nu0">06.420400577</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">1</span>,<span class="nu0">26</span> +<span class="nu0">1</span>,<span class="nu0">82</span> @@</span><br /> <?php defined<span class="br0">(</span>"SYSPATH"<span class="br0">)</span> or die<span class="br0">(</span>"No direct script access."<span class="br0">)</span> ?><br /><span class="re7">-<?= html::anchor<span class="br0">(</span>$item->file_url<span class="br0">(</span>true<span class="br0">)</span>, "", $attrs<span class="br0">)</span> ?></span><br /><span class="re7">-<script type="text/javascript"></span><br /><span class="re7">- flowplayer<span class="br0">(</span></span><br /><span class="re7">- "<?= $attrs<span class="br0">[</span>"id"<span class="br0">]</span> ?>",</span><br /><span class="re7">- <span class="br0">{</span></span><br /><span class="re7">- src: "<?= url::abs_file<span class="br0">(</span>"lib/flowplayer.swf"<span class="br0">)</span> ?>",</span><br /><span class="re7">- wmode: "transparent",</span><br /><span class="re7">- provider: "pseudostreaming"</span><br /><span class="re7">- <span class="br0">}</span>,</span><br /><span class="re7">- <span class="br0">{</span></span><br /><span class="re7">- clip: <span class="br0">{</span></span><br /><span class="re7">- scaling: 'fit'</span><br /><span class="re7">- <span class="br0">}</span>,</span><br /><span class="re7">- plugins: <span class="br0">{</span></span><br /><span class="re7">- pseudostreaming: <span class="br0">{</span></span><br /><span class="re7">- url: "<?= url::abs_file<span class="br0">(</span>"lib/flowplayer.pseudostreaming.swf"<span class="br0">)</span> ?>"</span><br /><span class="re7">- <span class="br0">}</span>,</span><br /><span class="re7">- controls: <span class="br0">{</span></span><br /><span class="re7">- autoHide: 'always',</span><br /><span class="re7">- hideDelay: 2000</span><br /><span class="re7">- <span class="br0">}</span></span><br /><span class="re7">- <span class="br0">}</span></span><br /><span class="re8">+<?</span><br /><span class="re8">+$done = false;</span><br /><span class="re8">+$mime_type = $item->mime_type;</span><br /><span class="re8">+if <span class="br0">(</span>$mime_type == 'video/flv' || $mime_type == 'video/x-flv' ||</span><br /><span class="re8">+ $mime_type == 'video/mp4'<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ // flv/mp4 format, we can use the flash player</span><br /><span class="re8">+ //$flash_player_view = dirname<span class="br0">(</span>__FILE__<span class="br0">)</span>.'/movieplayer.flowplayer.html.php';</span><br /><span class="re8">+ //or you want jwplayer</span><br /><span class="re8">+ $flash_player_view = dirname<span class="br0">(</span>__FILE__<span class="br0">)</span>.'/movieplayer.jwplayer.html.php';</span><br /><span class="re8">+ if <span class="br0">(</span>file_exists<span class="br0">(</span>$flash_player_view<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ include<span class="br0">(</span>$flash_player_view<span class="br0">)</span>;</span><br /><span class="re8">+ $done = true;</span><br /> <span class="br0">}</span><br /><span class="re7">- <span class="br0">)</span>.ipad<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re7">-</script></span><br /><span class="re8">+<span class="br0">}</span></span><br /><span class="re8">+if <span class="br0">(</span>!$done && </span><br /><span class="re8">+ <span class="br0">(</span>$mime_type == 'video/x-ms-asf' || $mime_type == 'video/x-ms-asx' ||</span><br /><span class="re8">+ $mime_type == 'video/x-ms-wmv'<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ // asf/wmv format, we can use the flash player</span><br /><span class="re8">+ $flash_player_view = dirname<span class="br0">(</span>__FILE__<span class="br0">)</span>.'/movieplayer.wmvplayer.html.php';</span><br /><span class="re8">+ if <span class="br0">(</span>file_exists<span class="br0">(</span>$flash_player_view<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ include<span class="br0">(</span>$flash_player_view<span class="br0">)</span>;</span><br /><span class="re8">+ $done = true;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+<span class="br0">}</span></span><br /><span class="re8">+if <span class="br0">(</span>!$done<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ $width = $item->width;</span><br /><span class="re8">+ $src = $item->file_url<span class="br0">(</span>true<span class="br0">)</span>;</span><br /><span class="re8">+ switch <span class="br0">(</span>$mime_type<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ case 'video/quicktime':</span><br /><span class="re8">+ case 'video/x-quicktime':</span><br /><span class="re8">+ $height = $item->height + <span class="nu0">16</span>;</span><br /><span class="re8">+ print <<<QUICKTIME</span><br /><span class="re8">+<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B"</span><br /><span class="re8">+ codebase="http://www.apple.com/qtactivex/qtplugin.cab"</span><br /><span class="re8">+ width="$width"" height="$height" id="move"></span><br /><span class="re8">+ <param name="src" value="$src"/></span><br /><span class="re8">+ <param name="controller" value="true"/></span><br /><span class="re8">+ <param name="autoplay" value="true"/></span><br /><span class="re8">+ <param name="loop" value="false"/></span><br /><span class="re8">+ <embed src="$src" width="$width" height="$height" type="$mime_type"</span><br /><span class="re8">+ pluginspage="http://www.apple.com/quicktime/download/"</span><br /><span class="re8">+ controller="true" autoplay="true" loop="false"/></span><br /><span class="re8">+ <noembed><a href="$src">Download Movie</a></noembed></span><br /><span class="re8">+</object></span><br /><span class="re8">+QUICKTIME;</span><br /><span class="re8">+ break;</span><br /><span class="re8">+</span><br /><span class="re8">+ case 'video/x-ms-asf':</span><br /><span class="re8">+ case 'video/x-ms-asx':</span><br /><span class="re8">+ if <span class="br0">(</span>!isset<span class="br0">(</span>$classId<span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ $classId = 'CLSID:22D6F312-B0F6-11D0-94AB-0080C74C7E95';</span><br /><span class="re8">+ case 'video/mpeg':</span><br /><span class="re8">+ //case 'video/mp4':</span><br /><span class="re8">+ case 'video/msvideo':</span><br /><span class="re8">+ case 'video/x-msvideo':</span><br /><span class="re8">+ case 'video/x-ms-wmv':</span><br /><span class="re8">+ case 'video/avi':</span><br /><span class="re8">+ default:</span><br /><span class="re8">+ if <span class="br0">(</span>!isset<span class="br0">(</span>$classId<span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ $classId = 'CLSID:05589FA1-C356-11CE-BF01-00AA0055595A';</span><br /><span class="re8">+ $height = $item->height + <span class="nu0">50</span>;</span><br /><span class="re8">+ // in my site, I need to use video/mpeg for avi file</span><br /><span class="re8">+ if <span class="br0">(</span>$mime_type == 'video/avi'<span class="br0">)</span></span><br /><span class="re8">+ $mime_type = 'video/mpeg';</span><br /><span class="re8">+ print <<<OTHERS</span><br /><span class="re8">+<object classid="$classId" width="$width" height="$height" id="movie"></span><br /><span class="re8">+ <param name="ShowDisplay" value="<span class="nu0">0</span>"/></span><br /><span class="re8">+ <param name="ShowControls" value="<span class="nu0">1</span>"/></span><br /><span class="re8">+ <param name="AutoStart" value="<span class="nu0">1</span>"/></span><br /><span class="re8">+ <param name="AutoRewind" value="-<span class="nu0">1</span>"/></span><br /><span class="re8">+ <param name="Volume" value="<span class="nu0">0</span>"/></span><br /><span class="re8">+ <param name="FileName" value="$src"/></span><br /><span class="re8">+ <embed src="$src" width="$width" height="$height" type="$mime_type"</span><br /><span class="re8">+ controller="true" autoplay="true" loop="false"/></span><br /><span class="re8">+ <noembed><a href="$src">Download Movie</a></noembed></span><br /><span class="re8">+</object></span><br /><span class="re8">+OTHERS;</span><br /><span class="re8">+ break;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+<span class="br0">}</span></span><br /><span class="re8">+?></span><br />diff -Nur gallery3.orig/modules/gallery/views//movieplayer.jwplayer.html.php gallery3/modules/gallery/views//movieplayer.jwplayer.html.php<br /><span class="re3">--- gallery3.orig/modules/gallery/views//movieplayer.jwplayer.html.php <span class="nu0">1970</span>-01-01 08:00:<span class="nu0">00.000000000</span> +0800</span><br /><span class="re4">+++ gallery3/modules/gallery/views//movieplayer.jwplayer.html.php <span class="nu0">2011</span>-<span class="nu0">12</span>-<span class="nu0">14</span> <span class="nu0">10</span>:00:<span class="nu0">54.048671918</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">0</span>,<span class="nu0">0</span> +<span class="nu0">1</span>,<span class="nu0">23</span> @@</span><br /><span class="re8">+<?php defined<span class="br0">(</span>"SYSPATH"<span class="br0">)</span> or die<span class="br0">(</span>"No direct script access."<span class="br0">)</span> ?></span><br /><span class="re8">+<script type="text/javascript" src="<?= url::abs_file<span class="br0">(</span>"lib/jwplayer.js"<span class="br0">)</span> ?>"></script></span><br /><span class="re8">+<div id="<?= $attrs<span class="br0">[</span>"id"<span class="br0">]</span> ?>">Loading JW Player...</div></span><br /><span class="re8">+<script type="text/javascript"></span><br /><span class="re8">+ jwplayer<span class="br0">(</span>"<?= $attrs<span class="br0">[</span>"id"<span class="br0">]</span> ?>"<span class="br0">)</span>.setup<span class="br0">(</span></span><br /><span class="re8">+ <span class="br0">{</span></span><br /><span class="re8">+ 'height': '<?= $item->height+<span class="nu0">20</span> ?>',</span><br /><span class="re8">+ 'width': '<?= $item->width ?>',</span><br /><span class="re8">+ 'file': '<?= $item->file_url<span class="br0">(</span>true<span class="br0">)</span> ?>',</span><br /><span class="re8">+ 'title': '<?= htmlspecialchars<span class="br0">(</span>$item->title<span class="br0">)</span> ?>',</span><br /><span class="re8">+ 'autostart': 'true',</span><br /><span class="re8">+ 'bufferlength': '<span class="nu0">10</span>',</span><br /><span class="re8">+ 'controlbar': 'bottom',</span><br /><span class="re8">+ 'display.showmute': 'true',</span><br /><span class="re8">+ 'stretching': 'uniform',</span><br /><span class="re8">+ 'wmode': 'transparent',</span><br /><span class="re8">+ 'modes': <span class="br0">[</span></span><br /><span class="re8">+ <span class="br0">{</span> 'type': 'flash', 'src': '<?= url::abs_file<span class="br0">(</span>"lib/player.swf"<span class="br0">)</span> ?>' <span class="br0">}</span>,</span><br /><span class="re8">+ <span class="br0">{</span> 'type': 'html5' <span class="br0">}</span>,</span><br /><span class="re8">+ <span class="br0">{</span> 'type': 'download' <span class="br0">}</span></span><br /><span class="re8">+ <span class="br0">]</span></span><br /><span class="re8">+ <span class="br0">}</span><span class="br0">)</span>;</span><br /><span class="re8">+</script></span><br />diff -Nur gallery3.orig/modules/gallery/views//movieplayer.wmvplayer.html.php gallery3/modules/gallery/views//movieplayer.wmvplayer.html.php<br /><span class="re3">--- gallery3.orig/modules/gallery/views//movieplayer.wmvplayer.html.php <span class="nu0">1970</span>-01-01 08:00:<span class="nu0">00.000000000</span> +0800</span><br /><span class="re4">+++ gallery3/modules/gallery/views//movieplayer.wmvplayer.html.php <span class="nu0">2011</span>-<span class="nu0">12</span>-<span class="nu0">14</span> <span class="nu0">14</span>:<span class="nu0">14</span>:<span class="nu0">31.625509462</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">0</span>,<span class="nu0">0</span> +<span class="nu0">1</span>,<span class="nu0">16</span> @@</span><br /><span class="re8">+<?php defined<span class="br0">(</span>"SYSPATH"<span class="br0">)</span> or die<span class="br0">(</span>"No direct script access."<span class="br0">)</span> ?></span><br /><span class="re8">+<script type="text/javascript" src="<?= url::abs_file<span class="br0">(</span>"lib/silverlight.js"<span class="br0">)</span> ?>"></script></span><br /><span class="re8">+<script type="text/javascript" src="<?= url::abs_file<span class="br0">(</span>"lib/wmvplayer.js"<span class="br0">)</span> ?>"></script></span><br /><span class="re8">+<div id="<?= $attrs<span class="br0">[</span>"id"<span class="br0">]</span> ?>">Loading JW Player...</div></span><br /><span class="re8">+<script type="text/javascript"></span><br /><span class="re8">+ var elm = document.getElementById<span class="br0">(</span>"<?= $attrs<span class="br0">[</span>"id"<span class="br0">]</span> ?>"<span class="br0">)</span>;</span><br /><span class="re8">+ var src = '<?= url::abs_file<span class="br0">(</span>"lib/wmvplayer.xaml"<span class="br0">)</span> ?>';</span><br /><span class="re8">+ var cfg = <span class="br0">{</span></span><br /><span class="re8">+ file:'<?= $item->file_url<span class="br0">(</span>true<span class="br0">)</span> ?>',</span><br /><span class="re8">+ width:'<?= $item->width ?>',</span><br /><span class="re8">+ height:'<?= $item->height+<span class="nu0">20</span> ?>'',</span><br /><span class="re8">+ windowless: 'true',</span><br /><span class="re8">+ autostart: 'true'</span><br /><span class="re8">+ <span class="br0">}</span>;</span><br /><span class="re8">+ var ply = new jeroenwijering.Player<span class="br0">(</span>elm,src,cfg<span class="br0">)</span>;</span><br /><span class="re8">+</script></span></pre></div></pre><p>這個 player 頁面的修改, 會使用到 <a href="http://www.longtailvideo.com/players/" target="_blank">JW Player</a> (優先使用 flash, 如果不支援就改用 html5, 如果都沒有就是下載的方式) 與 JW WMV Player, 所以, 請自行下載這兩個 player, 把 JW Player 使用的 jwplayer.js 與 player.swf, 以及 JW WMV Player 使用的 silverlight.js, wmvplayer.js 與 wmvplayer.xaml 這幾個檔案放到 Gallery 的 lib 目錄底下.</p><p>經過這樣子的處理之後, 至少常用的幾種格式都可以正常的加入 Gallery 裡頭了.</p>
Gallery
2011-12-16T10:54:06Z
tommy
-
Gallery 3 中文修正 part 2
https://blog.teatime.com.tw/1/post/395
<p>之前提過 <a href="http://gallery.menalto.com/" target="_blank">Gallery</a> 3 內部是使用 utf-8 在處理 (實際上, 討論區與官網的文章似乎也多次提到要傳入參數時要用 utf-8 編碼的字串才可以), 不過... 另人不解的是, 為什麼一個說是用 utf-8 字串來處理資料的程式, 反而不能處理 utf-8 的中文路徑與檔名呢? </p><p>在不小心使用 <a href="http://php.net/manual/en/function.pathinfo.php" target="_blank">pathinfo()</a> 來取得檔名時, 發現只抓到英文的字元, 所有的中文字都不見了, 而 php 中對 pathinfo() 的解釋是這個函式會依據 <a href="http://www.php.net/manual/en/function.setlocale.php" target="_blank">setlocale()</a> 而有不同的結果, 所以.... 看起來應該是 Gallery 之前有使用 setlocale(), 但設定了錯誤的參數吧.</p><p>試著在 local.php 中加上 setlocale(LC_ALL, "zh_TW.UTF-8"); 不過... 似乎沒有作用, 看來是先跑 local.php 之後才去另外做了這個設定.</p><p>找一下程式碼, 發現在<a href="http://kohanaframework.org/" target="_blank"> kohana</a> 這個 framework 的 system/core/Kohana.php 有執行一次 setlocale(), 而且是設成 en_US.UTF-8, 應該也可以才對, 試著直接改成 zh_TW.UTF-8, 發現一樣不行, 所以應該在這之後還會執行一次.</p><p>接著在 modules/gallery/libraries/Gallery_I18n.php 發現有好幾次執行 setlocale() 的動作, 直接在這之後再做一次 setlocale(LC_ALL, "zh_TW.UTF-8"); 或 setlocale(LC_ALL, "en_US.UTF-8"); 之後, 果然在 Gallery 3 中就可以正確的處理 UTF-8 的路徑與檔案名稱了. 看起來, 雖然 Gallery 會試著傳入一堆 locale 的值去設定, 不過.... 它的第一個值並不包含字元集, 也就是當預設的 locale 是 zh_TW 時, 會變成去做 setlocale(LC_ALL, "zh_TW"); 結果, php 在嘗試第一個 locale 就會成功, 也就不會再去試後而的 zh_TW.UTF-8 了, 這時... 反而不能正確的處理 UTF-8 字元了.</p><p>修改的方法, 看是要直接把這段改掉, 直接去設定, 或把沒有指定字元集的那個放到陣列後頭, 都可以修正這個問題:</p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">--- gallery3.orig/modules/gallery/libraries/Gallery_I18n.php 2011-05-25 12:04:04.000000000 +0800<br /><span class="re4">+++ gallery3/modules/gallery/libraries/Gallery_I18n.php <span class="nu0">2011</span>-<span class="nu0">12</span>-<span class="nu0">14</span> <span class="nu0">16</span>:<span class="nu0">12</span>:<span class="nu0">26.500087463</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">77</span>,<span class="nu0">7</span> +<span class="nu0">77</span>,<span class="nu0">11</span> @@</span><br /> list <span class="br0">(</span>$php_locale, $unused<span class="br0">)</span> = explode<span class="br0">(</span>'.', $php_locale . '.'<span class="br0">)</span>;<br /> if <span class="br0">(</span>$php_locale != $locale<span class="br0">)</span> <span class="br0">{</span><br /> // Attempt to set PHP's locale as well <span class="br0">(</span>for number formatting, collation, etc.<span class="br0">)</span><br /><span class="re7">- $locale_prefs = array<span class="br0">(</span>$locale<span class="br0">)</span>;</span><br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // move the locale without CHARSET to latest... we prefer to use UTF-8</span><br /><span class="re8">+ //$locale_prefs = array<span class="br0">(</span>$locale<span class="br0">)</span>;</span><br /><span class="re8">+ $locale_prefs = array<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ // twu2 end</span><br /> // Try appending some character set names; some systems <span class="br0">(</span>like FreeBSD<span class="br0">)</span> need this.<br /> // Some systems require a format with hyphen <span class="br0">(</span>eg. Gentoo<span class="br0">)</span> and others without <span class="br0">(</span>eg. FreeBSD<span class="br0">)</span>.<br /> $charsets = array<span class="br0">(</span>'utf8', 'UTF-8', 'UTF8', 'ISO8859-1', 'ISO-8859-1'<span class="br0">)</span>;<br /><span class="re6">@@ -<span class="nu0">89</span>,<span class="nu0">8</span> +<span class="nu0">93</span>,<span class="nu0">14</span> @@</span><br /> foreach <span class="br0">(</span>$charsets as $charset<span class="br0">)</span> <span class="br0">{</span><br /> $locale_prefs<span class="br0">[</span><span class="br0">]</span> = $locale . '.' . $charset;<br /> <span class="br0">}</span><br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // try the one without CHARSET only all CHARSET failed</span><br /><span class="re8">+ $locale_prefs<span class="br0">[</span><span class="br0">]</span> = $locale;</span><br /><span class="re8">+ // twu2 end</span><br /> $locale_prefs<span class="br0">[</span><span class="br0">]</span> = 'en_US';<br /> $php_locale = setlocale<span class="br0">(</span>LC_ALL, $locale_prefs<span class="br0">)</span>;<br /><span class="re8">+ //$php_locale = setlocale<span class="br0">(</span>LC_ALL, 'zh_TW.UTF-8'<span class="br0">)</span>;</span><br /><span class="re8">+ //$php_locale = setlocale<span class="br0">(</span>LC_ALL, 'en_US.UTF-8'<span class="br0">)</span>;</span><br /> <span class="br0">}</span><br /> if <span class="br0">(</span>is_string<span class="br0">(</span>$php_locale<span class="br0">)</span> && substr<span class="br0">(</span>$php_locale, <span class="nu0">0</span>, <span class="nu0">2</span><span class="br0">)</span> == 'tr'<span class="br0">)</span> <span class="br0">{</span><br /> // Make PHP <span class="nu0">5</span> work with Turkish <span class="br0">(</span>the localization results are mixed though<span class="br0">)</span>.</pre></div></pre><p>經過這個修改後, 使用中文的路徑與檔名就不會有問題了.</p><p>不過接下去與<a href="http://blog.teatime.com.tw/1/post/389" target="_blank">之前的 part 1</a> 相同, 那幾個地方一樣要更改, 只是並不用去針對 name 也做更改, 只要更改 slug (這個完全不接受非英文字元, 看不出有何用意) 的部份就可以.</p><p>首先是相簿的部份: </p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">--- gallery3.orig/modules/gallery/controllers/albums.php 2011-05-25 12:04:04.000000000 +0800<br /><span class="re4">+++ gallery3/modules/gallery/controllers/albums.php <span class="nu0">2011</span>-<span class="nu0">12</span>-<span class="nu0">14</span> <span class="nu0">19</span>:<span class="nu0">30</span>:<span class="nu0">12.914153944</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">90</span>,<span class="nu0">10</span> +<span class="nu0">90</span>,<span class="nu0">29</span> @@</span><br /> $album->type = "album";<br /> $album->parent_id = $parent_id;<br /> $album->name = $form->add_album->inputs<span class="br0">[</span>"name"<span class="br0">]</span>->value;<br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // avoid non-english name</span><br /><span class="re8">+/*</span><br /><span class="re8">+ // we don't need this any more, if we can have correct setlocale<span class="br0">(</span><span class="br0">)</span> with utf-<span class="nu0">8</span> charset</span><br /><span class="re8">+ $album->name = item::convert_filename_to_slug<span class="br0">(</span>$album->name<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>$album->name == ''<span class="br0">)</span></span><br /><span class="re8">+ $album->name = 'album'.strftime<span class="br0">(</span>"%Y%m%d%H%M%S"<span class="br0">)</span>.'-'.rand<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+*/</span><br /><span class="re8">+ // twu2 end</span><br /> $album->title = $form->add_album->title->value ?<br /> $form->add_album->title->value : $form->add_album->inputs<span class="br0">[</span>"name"<span class="br0">]</span>->value;<br /> $album->description = $form->add_album->description->value;<br /> $album->slug = $form->add_album->slug->value;<br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // also copy from name if slug is empty</span><br /><span class="re8">+ $album->slug = item::convert_filename_to_slug<span class="br0">(</span>$album->slug<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>$album->slug == ''<span class="br0">)</span></span><br /><span class="re8">+ $album->slug = item::convert_filename_to_slug<span class="br0">(</span>$album->name<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>$album->slug == ''<span class="br0">)</span></span><br /><span class="re8">+ $album->slug = 'album'.strftime<span class="br0">(</span>"%Y%m%d%H%M%S"<span class="br0">)</span>.'-'.rand<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ // convert for title</span><br /><span class="re8">+ $album->title = item::convert_filename_to_title<span class="br0">(</span>$album->title<span class="br0">)</span>;</span><br /><span class="re8">+ // twu2 end</span><br /> $album->validate<span class="br0">(</span><span class="br0">)</span>;<br /> <span class="br0">}</span> catch <span class="br0">(</span>ORM_Validation_Exception $e<span class="br0">)</span> <span class="br0">{</span><br /> // Translate ORM validation errors into form error messages</pre></div></pre><p>接著是 <a href="http://codex.gallery2.org/Gallery3:API:REST" target="_blank">REST</a> 的部份:</p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">--- gallery3.orig/modules/gallery/helpers/item_rest.php 2011-05-25 12:04:04.000000000 +0800<br /><span class="re4">+++ gallery3/modules/gallery/helpers/item_rest.php <span class="nu0">2011</span>-<span class="nu0">12</span>-<span class="nu0">14</span> <span class="nu0">16</span>:<span class="nu0">23</span>:<span class="nu0">05.504784462</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">159</span>,<span class="nu0">9</span> +<span class="nu0">159</span>,<span class="nu0">24</span> @@</span><br /> $item->type = "album";<br /> $item->parent_id = $parent->id;<br /> $item->name = $entity->name;<br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // avoid non-english name</span><br /><span class="re8">+ //$item->name = item::convert_filename_to_slug<span class="br0">(</span>$item->name<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>$item->name == ''<span class="br0">)</span></span><br /><span class="re8">+ $item->name = 'album'.strftime<span class="br0">(</span>"%Y%m%d%H%M%S"<span class="br0">)</span>.'-'.rand<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ // twu2 end</span><br /> $item->title = isset<span class="br0">(</span>$entity->title<span class="br0">)</span> ? $entity->title : $entity->name;<br /> $item->description = isset<span class="br0">(</span>$entity->description<span class="br0">)</span> ? $entity->description : null;<br /> $item->slug = isset<span class="br0">(</span>$entity->slug<span class="br0">)</span> ? $entity->slug : null;<br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // copy from name if empty</span><br /><span class="re8">+ $item->slug = item::convert_filename_to_slug<span class="br0">(</span>$item->slug<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>$item->slug == ''<span class="br0">)</span></span><br /><span class="re8">+ $item->slug = item::convert_filename_to_slug<span class="br0">(</span>$item->name<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>$item->slug == ''<span class="br0">)</span></span><br /><span class="re8">+ $item->slug = item::convert_filename_to_slug<span class="br0">(</span>base64_encode<span class="br0">(</span>$item->name<span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+ $item->title = item::convert_filename_to_title<span class="br0">(</span>$item->title<span class="br0">)</span>;</span><br /><span class="re8">+ // twu2 end</span><br /> $item->save<span class="br0">(</span><span class="br0">)</span>;<br /> break;<br /> <br /><span class="re6">@@ -<span class="nu0">175</span>,<span class="nu0">9</span> +<span class="nu0">190</span>,<span class="nu0">37</span> @@</span><br /> $item->parent_id = $parent->id;<br /> $item->set_data_file<span class="br0">(</span>$request->file<span class="br0">)</span>;<br /> $item->name = $entity->name;<br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // avoid non-english name</span><br /><span class="re8">+ $name = $item->name;</span><br /><span class="re8">+ $ext = '';</span><br /><span class="re8">+ $pos = strrpos<span class="br0">(</span>$item->name, '.'<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>$pos !== false<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ $ext = substr<span class="br0">(</span>$item->name, $pos<span class="br0">)</span>;</span><br /><span class="re8">+ $name = substr<span class="br0">(</span>$item->name, 0, $pos<span class="br0">)</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ //$item->name = item::convert_filename_to_slug<span class="br0">(</span>$name<span class="br0">)</span>;</span><br /><span class="re8">+ $item->name = $name;</span><br /><span class="re8">+ if <span class="br0">(</span>$item->name == ''<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ if <span class="br0">(</span>$item->type == 'photo'<span class="br0">)</span></span><br /><span class="re8">+ $item->name = 'photo'.strftime<span class="br0">(</span>"%Y%m%d%H%M%S"<span class="br0">)</span>.'-'.rand<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ else</span><br /><span class="re8">+ $item->name = 'movie'.strftime<span class="br0">(</span>"%Y%m%d%H%M%S"<span class="br0">)</span>.'-'.rand<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ $item->name .= $ext;</span><br /><span class="re8">+ // twu2 end</span><br /> $item->title = isset<span class="br0">(</span>$entity->title<span class="br0">)</span> ? $entity->title : $entity->name;<br /> $item->description = isset<span class="br0">(</span>$entity->description<span class="br0">)</span> ? $entity->description : null;<br /> $item->slug = isset<span class="br0">(</span>$entity->slug<span class="br0">)</span> ? $entity->slug : null;<br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // copy from name if empty</span><br /><span class="re8">+ $item->slug = item::convert_filename_to_slug<span class="br0">(</span>$item->slug<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>$item->slug == ''<span class="br0">)</span></span><br /><span class="re8">+ $item->slug = item::convert_filename_to_slug<span class="br0">(</span>$item->name<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>$item->slug == ''<span class="br0">)</span></span><br /><span class="re8">+ $item->slug = item::convert_filename_to_slug<span class="br0">(</span>base64_encode<span class="br0">(</span>$item->name<span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+ $item->title = item::convert_filename_to_title<span class="br0">(</span>$item->title<span class="br0">)</span>;</span><br /><span class="re8">+ // twu2 end</span><br /> $item->save<span class="br0">(</span><span class="br0">)</span>;<br /> break;</pre></div></pre><p>最後是 <a href="http://codex.gallery2.org/Gallery_Remote" target="_blank">Gallery Remote</a> 的部份:</p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">--- gallery3.orig/modules/remote/controllers/gallery_remote.php 2011-06-29 15:47:43.000000000 +0800<br /><span class="re4">+++ gallery3/modules/remote/controllers/gallery_remote.php <span class="nu0">2011</span>-<span class="nu0">12</span>-<span class="nu0">15</span> <span class="nu0">16</span>:<span class="nu0">12</span>:<span class="nu0">29.422343598</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">181</span>,<span class="nu0">6</span> +<span class="nu0">181</span>,<span class="nu0">14</span> @@</span><br /> $name = trim<span class="br0">(</span>$input->post<span class="br0">(</span>'newAlbumName'<span class="br0">)</span><span class="br0">)</span>;<br /> $title = trim<span class="br0">(</span>$input->post<span class="br0">(</span>'newAlbumTitle'<span class="br0">)</span><span class="br0">)</span>;<br /> $desc = trim<span class="br0">(</span>$input->post<span class="br0">(</span>'newAlbumDesc'<span class="br0">)</span><span class="br0">)</span>;<br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // GR will strip all non-ascii char for name?</span><br /><span class="re8">+ $xtitle = preg_replace<span class="br0">(</span>'/<span class="br0">[</span>\x80-\xffffff<span class="br0">]</span>/', '', $title<span class="br0">)</span>;</span><br /><span class="re8">+ // for empty name or name = strip of title, we copy it from title again</span><br /><span class="re8">+ if <span class="br0">(</span>$name == '' || $name == $xtitle<span class="br0">)</span></span><br /><span class="re8">+ $name = $title;</span><br /><span class="re8">+ if <span class="br0">(</span>$name == ''<span class="br0">)</span> $name = 'album'.strftime<span class="br0">(</span>'%Y%m%d%H%M%S'<span class="br0">)</span>.'-'.rand<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ // twu2 end</span><br /> <br /> if<span class="br0">(</span>$album=='0'<span class="br0">)</span> $parent = item::root<span class="br0">(</span><span class="br0">)</span>;<br /> else $parent = ORM::factory<span class="br0">(</span>"item"<span class="br0">)</span>->where<span class="br0">(</span>"slug", "=", $album<span class="br0">)</span>->find<span class="br0">(</span><span class="br0">)</span>;<br /><span class="re6">@@ -<span class="nu0">192</span>,<span class="nu0">20</span> +<span class="nu0">200</span>,<span class="nu0">30</span> @@</span><br /> <br /> $album->name = $name;<br /> $album->slug = item::convert_filename_to_slug<span class="br0">(</span>$name<span class="br0">)</span>; // <= verification fails if this property has not been set!!!<br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // if slug is empty <span class="br0">(</span>after convert name, might be empty<span class="br0">)</span>, use base64</span><br /><span class="re8">+ if <span class="br0">(</span>$album->slug == ''<span class="br0">)</span></span><br /><span class="re8">+ $album->slug = item::convert_filename_to_slug<span class="br0">(</span>base64_encode<span class="br0">(</span>$name<span class="br0">)</span><span class="br0">)</span>; // <= verification fails if this property has not been set!!!</span><br /><span class="re8">+ $title = item::convert_filename_to_title<span class="br0">(</span>$title<span class="br0">)</span>;</span><br /><span class="re8">+ // twu2 end</span><br /> $album->title = $title;<br /> $album->title or $album->title = $album->name;<br /> $album->description = $desc;<br /> $album->view_count = <span class="nu0">0</span>;<br /> $album->sort_column = 'weight';<br /> $album->sort_order = 'ASC';<br /><span class="re7">-</span><br /> try <span class="br0">{</span><br /> $album->validate<span class="br0">(</span><span class="br0">)</span>;<br /> <br /> try <span class="br0">{</span><br /> $album->save<span class="br0">(</span><span class="br0">)</span>;<br /> <br /><span class="re7">- $reply->set<span class="br0">(</span>'album_name', $album->name<span class="br0">)</span>;</span><br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // return slug instead of name</span><br /><span class="re8">+ // because name might include non-english char, it will make GR fail</span><br /><span class="re8">+ //$reply->set<span class="br0">(</span>'album_name', $album->name<span class="br0">)</span>;</span><br /><span class="re8">+ $reply->set<span class="br0">(</span>'album_name', $album->slug<span class="br0">)</span>;</span><br /><span class="re8">+ // twu2 end</span><br /> $reply->set<span class="br0">(</span>'status_text', 'New album created successfuly.'<span class="br0">)</span>;<br /> $reply->send<span class="br0">(</span><span class="br0">)</span>;<br /> <br /><span class="re6">@@ -<span class="nu0">274</span>,<span class="nu0">7</span> +<span class="nu0">292</span>,<span class="nu0">29</span> @@</span><br /> else if<span class="br0">(</span>$userfilename!=''<span class="br0">)</span> $filename = $userfilename;<br /> else $filename = $_FILES<span class="br0">[</span>'userfile'<span class="br0">]</span><span class="br0">[</span>'name'<span class="br0">]</span>;<br /> <br /><span class="re7">- $slug = $filename;</span><br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // GR will change the non-english char to '?'? so we get it from title</span><br /><span class="re8">+ // fix for non-english name?</span><br /><span class="re8">+ if <span class="br0">(</span>strchr<span class="br0">(</span>$filename, '?'<span class="br0">)</span> !== false<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ // non english name?</span><br /><span class="re8">+ // the pathinfo<span class="br0">(</span><span class="br0">)</span> might not work setlocale<span class="br0">(</span><span class="br0">)</span> for non utf-<span class="nu0">8</span> locale... </span><br /><span class="re8">+ // so we use strrpos to find filename and extension</span><br /><span class="re8">+ $name = $title;</span><br /><span class="re8">+ $ext = '';</span><br /><span class="re8">+ $pos = strrpos<span class="br0">(</span>$title, '.'<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>$pos !== false<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ $ext = substr<span class="br0">(</span>$title, $pos<span class="br0">)</span>;</span><br /><span class="re8">+ $name = substr<span class="br0">(</span>$title, 0, $pos<span class="br0">)</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ if <span class="br0">(</span>$name === ''<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ $name = 'photo'.strftime<span class="br0">(</span>"%Y%m%d%H%M%S"<span class="br0">)</span>.'-'.rand<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ $filename = $name.$ext;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ $slug = item::convert_filename_to_slug<span class="br0">(</span>$filename<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>$slug == ''<span class="br0">)</span> $slug = item::convert_filename_to_slug<span class="br0">(</span>base64_encode<span class="br0">(</span>$filename<span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+ // $slug = $filename;</span><br /><span class="re8">+ // twu2 end</span><br /> $pos = strpos<span class="br0">(</span>$slug, '.'<span class="br0">)</span>;<br /> if<span class="br0">(</span>$pos!==false<span class="br0">)</span><br /> $slug = substr<span class="br0">(</span>$slug, 0, $pos<span class="br0">)</span>;<br /><span class="re6">@@ -<span class="nu0">285</span>,<span class="nu0">7</span> +<span class="nu0">325</span>,<span class="nu0">11</span> @@</span><br /> $item->parent_id = $parent->id;<br /> $item->set_data_file<span class="br0">(</span>$_FILES<span class="br0">[</span>'userfile'<span class="br0">]</span><span class="br0">[</span>'tmp_name'<span class="br0">]</span><span class="br0">)</span>;<br /> $item->name = $filename;<br /><span class="re7">- $item->slug = item::convert_filename_to_slug<span class="br0">(</span>$slug<span class="br0">)</span>;</span><br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // we already convert it</span><br /><span class="re8">+ $item->slug = $slug;</span><br /><span class="re8">+ //$item->slug = item::convert_filename_to_slug<span class="br0">(</span>$slug<span class="br0">)</span>;</span><br /><span class="re8">+ // twu2 end</span><br /> $item->mime_type = $type;<br /> $item->title = $title;<br /> $item->title or $item->title = ' '; //don't use $item->name as this clutters up the UI</pre></div></pre><p>經過這樣的處理, 應該就能正確的使用中文名稱了.</p><p>另外, 建議改用 REST 的 client 來連線, 因為 Gallery Remote 在我測試的時候, 有時候對中文處理會有問題, 不過有時候又正常... 還看不出來是為什麼.</p>
Gallery
2011-12-15T17:22:54Z
tommy
-
Gallery 3 無法刪除 serveradd 中指定的路徑的問題
https://blog.teatime.com.tw/1/post/394
<p><a href="https://sourceforge.net/apps/trac/gallery/ticket/1740" target="_blank">這問題</a>應該很久之前就有了 (七個多月了), 修正的方法很簡單也很直覺, 不過, 不清楚為什麼一直沒被接受.</p><p>如果你想刪除這個資料, 可以選擇的進階的設定去直接修改 server_add 的那一個變數 (那是 php serialize 之後的變數值), 或者用這個 patch:</p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">diff -Nur gallery3.orig/modules/server_add//views/admin_server_add.html.php gallery3/modules/server_add//views/admin_server_add.html.php<br /><span class="re3">--- gallery3.orig/modules/server_add//views/admin_server_add.html.php <span class="nu0">2011</span>-05-<span class="nu0">25</span> <span class="nu0">12</span>:04:<span class="nu0">04.000000000</span> +0800</span><br /><span class="re4">+++ gallery3/modules/server_add//views/admin_server_add.html.php <span class="nu0">2011</span>-<span class="nu0">12</span>-<span class="nu0">12</span> <span class="nu0">13</span>:<span class="nu0">48</span>:<span class="nu0">12.465883402</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">26</span>,<span class="nu0">7</span> +<span class="nu0">26</span>,<span class="nu0">7</span> @@</span><br /> <? foreach <span class="br0">(</span>$paths as $id => $path<span class="br0">)</span>: ?><br /> <li><br /> <?= html::clean<span class="br0">(</span>$path<span class="br0">)</span> ?><br /><span class="re7">- <a href="<?= url::site<span class="br0">(</span>"admin/server_add/remove_path?path=" . urlencode<span class="br0">(</span>$path<span class="br0">)</span> . "&amp;csrf=<?= access::csrf_token<span class="br0">(</span><span class="br0">)</span> ?>"<span class="br0">)</span> ?>"</span><br /><span class="re8">+ <a href="<?= url::site<span class="br0">(</span>"admin/server_add/remove_path?path=" . urlencode<span class="br0">(</span>$path<span class="br0">)</span> . "&amp;csrf=".access::csrf_token<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> ?>"</span><br /> id="icon_<?= $id ?>"<br /> class="g-remove-dir g-button"><br /> <span class="ui-icon ui-icon-trash"></pre></div></pre><p>修正後就可以正常的刪除不要的路徑了. </p>
Gallery
2011-12-15T14:36:42Z
tommy
-
修改 Gallery 3 的 RSS, 新增用路徑取代 ID 的選擇方式與資料亂數選擇的方式
https://blog.teatime.com.tw/1/post/393
<p>當我們利用 <a href="http://www.flashyourweb.com/article.php?story=mini_slideshow" target="_blank">minislideshow</a> 之類的小東西在顯示某個相簿的照片時, 是直接利用 RSS 的方式來取得要顯示的照片. 不過, 在 <a href="http://gallery.menalto.com/" target="_blank">Gallery</a> 3 裡頭, 對於 RSS 中指定要某個相簿的時候, 是使用相簿的 ID 來選取, 利如, 我有個相簿放在 /var/albums/tommy/tommy_photo 這個目錄下, 我必需要知道這個相簿在 Gallery 資料庫中的 ID (例如是 6), 才能用 /rss/feed/gallery/album/6 的方式來取得資料. 這個對於一般的使用者來說, 要知道那個 ID 是多少, 是比較有難度的, 並不如 tommy/tommy_photo 來的直覺. 所以... 改一下程式允許用路徑來選擇, 會比較方便些.</p><p><a href="https://sourceforge.net/apps/trac/gallery/ticket/1806" target="_blank">這個修正</a>, 讓我們改用參數的方式來傳送路徑取代項目, 如 /rss/feed/gallery/album/6 改成 /rss/feed/gallery/album/path?path=tommy/tommy_photo 來使用:</p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">--- gallery3.orig/modules/gallery/helpers/gallery_rss.php 2011-05-25 12:04:04.000000000 +0800<br /><span class="re4">+++ gallery3/modules/gallery/helpers/gallery_rss.php <span class="nu0">2011</span>-<span class="nu0">12</span>-<span class="nu0">15</span> <span class="nu0">14</span>:<span class="nu0">14</span>:<span class="nu0">47.838235321</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">45</span>,<span class="nu0">6</span> +<span class="nu0">45</span>,<span class="nu0">17</span> @@</span><br /> return $feed;<br /> <br /> case "album":<br /><span class="re8">+ // twu2 begin</span><br /><span class="re8">+ // use path instead if id</span><br /><span class="re8">+ if <span class="br0">(</span>$id == 'path'<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ $my_item = item::find_by_path<span class="br0">(</span>Input::instance<span class="br0">(</span><span class="br0">)</span>->get<span class="br0">(</span>"path"<span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+ $id = $my_item->id;</span><br /><span class="re8">+ if <span class="br0">(</span>$id < <span class="nu0">1</span><span class="br0">)</span></span><br /><span class="re8">+ $id = <span class="nu0">1</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ else if <span class="br0">(</span>!is_numeric<span class="br0">(</span>$id<span class="br0">)</span> || $id < <span class="nu0">1</span><span class="br0">)</span></span><br /><span class="re8">+ $id = <span class="nu0">1</span>;</span><br /><span class="re8">+ // twu2 end</span><br /> $item = ORM::factory<span class="br0">(</span>"item", $id<span class="br0">)</span>;<br /> access::required<span class="br0">(</span>"view", $item<span class="br0">)</span>;</pre></div></pre><p>另外, 由於每次 minislideshow 只會取得最多 20 張圖片的資料, 雖然 minislideshow 自己有 shuffle 的功能, 不過, 每次 RSS 取得的都是同樣的那 20 張圖片, 再怎麼亂數播放, 都覺得是固定的那 20 張圖.</p><p>所以, 我們會希望這個亂數選擇的動作在 RSS 那邊就直接處理, 這樣子至少每次去 RSS 抓的資料會有所不同. </p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">--- gallery3.orig/modules/gallery/helpers/gallery_rss.php 2011-05-25 12:04:04.000000000 +0800<br /><span class="re4">+++ gallery3/modules/gallery/helpers/gallery_rss.php <span class="nu0">2011</span>-<span class="nu0">12</span>-<span class="nu0">12</span> <span class="nu0">14</span>:<span class="nu0">27</span>:<span class="nu0">17.507144041</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">46</span>,<span class="nu0">13</span> +<span class="nu0">46</span>,<span class="nu0">39</span> @@</span><br /> <br /> case "album":<br /> $item = ORM::factory<span class="br0">(</span>"item", $id<span class="br0">)</span>;<br /><span class="re8">+ if <span class="br0">(</span>!$item->is_album<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ $item = $item->parent;</span><br /> access::required<span class="br0">(</span>"view", $item<span class="br0">)</span>;<br /> <br /><span class="re7">- $feed->items = $item</span><br /><span class="re7">- ->viewable<span class="br0">(</span><span class="br0">)</span></span><br /><span class="re7">- ->descendants<span class="br0">(</span>$limit, $offset, array<span class="br0">(</span>array<span class="br0">(</span>"type", "=", "photo"<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re7">- $feed->max_pages = ceil<span class="br0">(</span></span><br /><span class="re7">- $item->viewable<span class="br0">(</span><span class="br0">)</span>->descendants_count<span class="br0">(</span>array<span class="br0">(</span>array<span class="br0">(</span>"type", "=", "photo"<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span> / $limit<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>Input::instance<span class="br0">(</span><span class="br0">)</span>->get<span class="br0">(</span>"random"<span class="br0">)</span> == "<span class="nu0">1</span>"<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ $where = array<span class="br0">(</span></span><br /><span class="re8">+ array<span class="br0">(</span>"rand_key", "<", random::percent<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>,</span><br /><span class="re8">+ array<span class="br0">(</span>"type", "<>", "album"<span class="br0">)</span></span><br /><span class="re8">+ <span class="br0">)</span>;</span><br /><span class="re8">+ $order<span class="br0">[</span>"rand_key"<span class="br0">]</span> = "DESC";</span><br /><span class="re8">+ $feed->items = $item</span><br /><span class="re8">+ ->viewable<span class="br0">(</span><span class="br0">)</span></span><br /><span class="re8">+ ->descendants<span class="br0">(</span>$limit, 0, $where, $order<span class="br0">)</span>;</span><br /><span class="re8">+ $feed->max_pages = <span class="nu0">1</span>;</span><br /><span class="re8">+ $cnt = $item->viewable<span class="br0">(</span><span class="br0">)</span>->descendants_count<span class="br0">(</span>$where<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>$cnt < $limit<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ $item = ORM::factory<span class="br0">(</span>"item", $id<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>!$item->is_album<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ $item = $item->parent;</span><br /><span class="re8">+ $feed->items = $item</span><br /><span class="re8">+ ->viewable<span class="br0">(</span><span class="br0">)</span></span><br /><span class="re8">+ ->descendants<span class="br0">(</span>$limit, 0, array<span class="br0">(</span>array<span class="br0">(</span>"type", "<>", "album"<span class="br0">)</span><span class="br0">)</span>, $order<span class="br0">)</span>;</span><br /><span class="re8">+ $feed->max_pages = ceil<span class="br0">(</span></span><br /><span class="re8">+ $item->viewable<span class="br0">(</span><span class="br0">)</span>->descendants_count<span class="br0">(</span>array<span class="br0">(</span>array<span class="br0">(</span>"type", "<>", "album"<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span> / $limit<span class="br0">)</span>;</span><br /><span class="re8">+ <span class="br0">}</span> </span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ else <span class="br0">{</span></span><br /><span class="re8">+ $feed->items = $item</span><br /><span class="re8">+ ->viewable<span class="br0">(</span><span class="br0">)</span></span><br /><span class="re8">+ ->descendants<span class="br0">(</span>$limit, $offset, array<span class="br0">(</span>array<span class="br0">(</span>"type", "=", "photo"<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+ $feed->max_pages = ceil<span class="br0">(</span></span><br /><span class="re8">+ $item->viewable<span class="br0">(</span><span class="br0">)</span>->descendants_count<span class="br0">(</span>array<span class="br0">(</span>array<span class="br0">(</span>"type", "=", "photo"<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span> / $limit<span class="br0">)</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /> if <span class="br0">(</span>$item->id == item::root<span class="br0">(</span><span class="br0">)</span>->id<span class="br0">)</span> <span class="br0">{</span><br /> $feed->title = html::purify<span class="br0">(</span>$item->title<span class="br0">)</span>;<br /> <span class="br0">}</span> else <span class="br0">{</span></pre></div></pre><p>使用時, 只要加上 random=1 這個變數就可以. 例如: /rss/feed/gallery/album/path?path=tommy/tommy_photo&random=1</p><p>這樣子取到的圖片會變比較多樣化一些. </p>
Gallery
2011-12-15T14:17:46Z
tommy