Personal tools
You are here: Home Zope&Plone Tips EXIF情報表示正常化&簡素化
Document Actions

EXIF情報表示正常化&簡素化

by maru last modified 2006-10-28 00:21

ATPhoto(1.0alpha1)のEXIF情報表示がなんかおかしいので直してみた

【環境】

  • Zope-2.8.6-final (Linux)
  • Plone-2.1.3
  • ATPhoto-1-0-alpha1
  • FileSystemStorage-2.5rc1

 まぁ、alpha版なんでしょーがないんですが使ってみた限り他にもまだまだあったり(;´Д`)。取りあえずEXIF関連の問題点はっと、

  1. 表示するEXIF情報が多杉&全部英語じゃん!ヽ(`Д´)ノウワァン
  2. MakerNoteに記録されているものが出てこない
  3. Slide Show Contolで次のPhoto(前でもなんでも)に移動するとEXIF情報が前の写真のヤツのまま(IEかFirefoxどっちかで出た)
exif_infos.gif

 ヲレ的には結構致命傷ですww  本家のIssue を見ても(和訳スキル不保持なので単語で妄想)似たようなのがない…。3番目は結構出そうな気がするんだが。解析して手を入れますか…。

【表示ロジック解析】

 泣いた…なにこれ…。ヲレにとっては神ソースの嵐でした。”EXIF”のキーワードからgrepしまくってなんとか解析しましたが、JavaScriptでゴリゴリやってるから余計に訳ワカンネ(;´Д⊂)。

---- Javascriptな世界 ----
1. /portal_skins/ATPhoto/atphoto.js: fixHTML()
→ どこからともなくコールされる(その前は解析対象外)

2. /portal_skins/ATPhoto/atphoto.js: getATPhotoInfos()
→ ここでPloneに内蔵されてるSarrisaちうモジュール(Class?)を使って、
”http://(対象PhotoのURL)/atphoto_infos” をたたき、EXIF情報が書かれたXMLを取得。
その後、同モジュールから showATPhotoInfos() がコールバックされる(っぽい)

---- PageTemplate & Pythonな世界 ----
3. /portal_skins/ATPhoto/atphoto_infos
→ 2. でたたいた時に動く(?)PageTemplate。この中で、content.getEXIF()をコールしてHTML(?)生成。
他にもなんかあるが(IPTCとか)見なかったことにしよう。

4. $INSTANCE/Product/ATContentTypes/lib/imagetransform.py: getEXIF()
→ ATPhotoはATImageを継承(?)してるっぽく、探したらここにあった。
ここから exif.process_file()なんて呼ばれてるが、ひょっとしたらこの関数はATPhotoオブジェクトを
登録したとき既に呼ばれてオブジェクトに結果を保存しているのかも。

5. $INSTANCE/Product/ATContentTypes/thirdparty/exif.py: process_file()
→ このモジュールにて画像からEXIF情報を読み込んで返す。
…が、多分4.で登録時の結果を返してるのでここでは動いてない…。

---- 再びJavascriptな世界 ----
6. /portal_skins/ATPhoto/atphoto.js: showATPhotoInfos()
→ 2.で取得したXMLを元に documentなんちゃら を使ってJavaScriptによるHTML書き換え実施

【対策&修正ソース】

 Try & Errorしまくりでしたが、問題点と解析結果をリンクして対策内容を書いてみるとこーなる。あと、対策後のソースはここにべたべた張ってもしょーもないのでファイルとしてうp。変更箇所はdiffでもなんでもして見てくだしぃ。

問題点1=解析結果3
このPageTemplateでgetEXIF()よりとってきたEXIF情報をまんま展開してるのでここらでFilter+ごり押しになるが日本語変換テーブルを設けて、3列になってたリストを1列にした。日本語変換はi18nの機能を使ってやると華麗な修正になると思うのだがメドイので却下w
  • atphoto_infos - /portal_skins/ATPhoto/exif_atphoto_infos をcustomしてコピペ
  • getEXIF_Filter - customにScript(Python)で追加。ID=getEXIF_Filter、Parameter List=data={}。あとはてきとーに。変態ロジック&コメントかつ、関数名と機能が一致してないがキニシナイw
問題点2=解析結果2
このexif.pyはどうも Python Exif Parser (pyexif) から持ってきてPlone用に改装したっぽい。この改装でバグが混入(つか結構お粗末改装のような…)してるっぽく、MakerNoteを抽出するロジックはあるのだが途中でコケてた。あと絞り値とかシャッタースピード等は通常目にする数値ではないのでここに通常フォーマット変換ロジックを埋め込む(ググったらなんか訳の分からん変換数式があった)。ググった結果からついでに分かる範囲でMakerNote(主にCanon)解析データを追加してみた。
  • exif.py - $INSTANCE/Product/ATContentTypes/thirdparty/exif.py 差替え。んでzopectl restart
問題点3=解析結果6
IEとFirefoxとでXML(atphoto_infosでとってきたの)とHTMLのNodeの取得方法が合わないらしく途中でコケてた(っぽい)。IEとMozilla系を分けてやるようにした。Javascriptはほんとーに分からん…google神マンセー!!w
  • atphoto.js - /portal_skins/ATPhoto/atphoto.js をcustomしてコピペ

 取りあえずこれでおkかなと。ちなみに所有しているデジカメはキヤノンとオリンパスしかないのでそれでしか検証してないのでご了承を。他メーカーは…一応やるようにロジック組んでみてますがどうなるか分からんちん状態。

 直して動かしてみたらやっぱりATPhotoオブジェクト登録時にexif.pyが動いてEXIF情報を抜き取って保存してました。よって、既存にあるPhotoは登録し直さないとウマくいってくれませんのでご注意をば。

 あ~あと、問題が一つ残ってて、 バルブ撮影したもののEXIF情報は表示されません ……多分 exif.py のシャッタースピード数値変換時にコケてると思うのですが、対処法が見つからん…。

【参照サイト】

<<EXIF関係>>

<<Javascript関係(XML?)>>