« [applescript] ExifToolインストール(ちょっと修正) | トップページ | [exiftool] exiftoolのhtmlDumpの内容をHTMLで保存する(画像系専用) »

[exiftool] exiftoolで取得したメタデータをHTML表示(少し修正)


【スクリプトエディタで開く】 |

Exif2HTMLv4.applescript
ソース
001#!/usr/bin/env osascript
002----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
003(*
004
005exiftoolが別途必要です
006[applescript]exiftoolインストール
007https://quicktimer.cocolog-nifty.com/icefloe/2024/07/post-a2a84b.html
008
009インストール先が ~/bin/exiftool になっています
010一般的な/usr/local/binにインストールするには
011管理者権限が必要です
012管理者の方にご相談ください
013
014exiftoolの出力をHTMLにします
015
016com.cocolog-nifty.quicktimer.icefloe *)
017----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
018use AppleScript version "2.8"
019use framework "Foundation"
020use framework "AppKit"
021use framework "UniformTypeIdentifiers"
022use scripting additions
023
024property refMe : a reference to current application
025
026on run
027   tell application "Finder"
028      set aliasDesktopPath to path to desktop folder from user domain as alias
029   end tell
030   set listAliasFilePath to (choose file with prompt "ファイルを選んでください" default location aliasDesktopPath of type {"public.item"} with multiple selections allowed and showing package contents without invisibles) as list
031   open listAliasFilePath
032end run
033
034
035on open listAliasFilePath
036   #一般的にはパスはこちら
037   #   set strExifPath to "/usr/local/bin/exiftool/exiftool" as text
038   #自分用
039   set strExifPath to "~/bin/exiftool/exiftool" as text
040   #exiftoolパス処理
041   set ocidExifPathStr to refMe's NSString's stringWithString:(strExifPath)
042   set ocidExifPath to ocidExifPathStr's stringByStandardizingPath()
043   set ocidExifPathURL to (refMe's NSURL's alloc()'s initFileURLWithPath:(ocidExifPath) isDirectory:false)
044   set strExifPath to ocidExifPathURL's |path| as text
045   #
046   set appFileManager to refMe's NSFileManager's defaultManager()
047   set boolDirExists to appFileManager's fileExistsAtPath:(ocidExifPath) isDirectory:(false)
048   if boolDirExists = true then
049      log "インストール済み"
050   else if boolDirExists = false then
051      log "インストールされていません"
052      doInstallBin()
053   end if
054   ####出力先/var/folders/XX/(再起動時に削除されます)
055   set ocidTemporaryDirPathURL to appFileManager's temporaryDirectory
056   set ocidVarFoldersDirURL to ocidTemporaryDirPathURL's URLByDeletingLastPathComponent()
057   set ocidTemporaryItemsPathURL to ocidVarFoldersDirURL's URLByAppendingPathComponent:"TemporaryItems"
058   #set aliasTemporaryItems to (ocidTemporaryItemsPathURL's absoluteURL()) as alias
059   set strTempDirPath to ocidTemporaryItemsPathURL's absoluteString() as text
060   
061   ##フォルダがなければ作る
062   set boolDirExists to appFileManager's fileExistsAtPath:(ocidTemporaryItemsPathURL's |path|()) isDirectory:(true)
063   if boolDirExists = true then
064      log "起動時に削除されるフォルダはすでにあります"
065   else if boolDirExists = false then
066      log "起動時に削除されるフォルダを作ります"
067      set ocidAttrDict to refMe's NSMutableDictionary's alloc()'s initWithCapacity:0
068      ocidAttrDict's setValue:(511) forKey:(refMe's NSFilePosixPermissions)
069      set listDone to appFileManager's createDirectoryAtURL:(ocidTemporaryItemsPathURL) withIntermediateDirectories:(true) attributes:(ocidAttrDict) |error|:(reference)
070   end if
071   
072   repeat with itemAliasFilePath in listAliasFilePath
073      ##パス
074      set strFilePath to (POSIX path of itemAliasFilePath) as text
075      set ocidFilePathStr to (refMe's NSString's stringWithString:(strFilePath))
076      set ocidFilePath to ocidFilePathStr's stringByStandardizingPath()
077      set ocidFilePathURL to (refMe's NSURL's alloc()'s initFileURLWithPath:(ocidFilePath) isDirectory:false)
078      set ocidFileName to ocidFilePathURL's lastPathComponent()
079      #保存先
080      set ocidBaseFilePathURL to (ocidTemporaryItemsPathURL's URLByAppendingPathComponent:(ocidFileName))
081      set ocidSaveFilePathURL to (ocidBaseFilePathURL's URLByAppendingPathExtension:("html"))
082      #コマンド整形
083      set strCommandText to ("\"" & strExifPath & "\"  -lang ja   \"" & strFilePath & "\"") as text
084      #コマンド実行
085      try
086         set strResponseExif to (do shell script strCommandText) as text
087      on error
088         set strResponseExif to ("エラーが発生しました : Unknown file type")
089      end try
090      #戻り値
091      set ocidExifStrings to (refMe's NSString's stringWithString:(strResponseExif))
092      ##インテント除去
093      set ocidReplacedStrings to (ocidExifStrings's stringByReplacingOccurrencesOfString:("    ") withString:(""))
094      #改行をUNIXに強制
095      set ocidExifStrings to (ocidReplacedStrings's stringByReplacingOccurrencesOfString:("\n\r") withString:("\n"))
096      set ocidExifStrings to (ocidExifStrings's stringByReplacingOccurrencesOfString:("\r") withString:("\n"))
097      set ocidExifStrings to (ocidExifStrings's stringByReplacingOccurrencesOfString:("\n\n") withString:("\n"))
098      #改行でリストに
099      set ocidChrSet to (refMe's NSCharacterSet's characterSetWithCharactersInString:("\n"))
100      set ocidMainArray to (ocidExifStrings's componentsSeparatedByCharactersInSet:(ocidChrSet))
101      #出力用のDICT
102      set ocidExifDict to (refMe's NSMutableDictionary's alloc()'s initWithCapacity:0)
103      #リストの数だけ繰り返し
104      repeat with itemArray in ocidMainArray
105         set ocidSubArray to (itemArray's componentsSeparatedByString:(": "))
106         set ocidSetKey to (ocidSubArray's objectAtIndex:(0))
107         set ocidSetValue to (ocidSubArray's objectAtIndex:(1))
108         (ocidExifDict's setValue:(ocidSetValue) forKey:(ocidSetKey))
109      end repeat
110      #DICTからキーを取得して
111      set ocidAllKey to ocidExifDict's allKeys()
112      #ソートしておく
113      set ocidSortedKeyArray to (ocidAllKey's sortedArrayUsingSelector:("localizedStandardCompare:"))
114      
115      ##############################
116      # XML 生成開始
117      ##############################
118      # タイトル
119      set strTitleText to ("ExifTool: " & (ocidFileName as text) & " :メタデータ一覧") as text
120      ########################################
121      #headerに渡すエレメント
122      set ocidSetHeaderElement to (refMe's NSXMLElement's elementWithName:("div"))
123      set ocidH3Element to (refMe's NSXMLElement's elementWithName:("h3"))
124      (ocidH3Element's setStringValue:(strTitleText))
125      (ocidSetHeaderElement's addChild:(ocidH3Element))
126      
127      ########################################
128      #footerに渡すエレメント
129      set ocidSetFooterElement to (refMe's NSXMLElement's elementWithName:("div"))
130      set ocidAElement to (refMe's NSXMLElement's elementWithName:("a"))
131      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("href") stringValue:("https://quicktimer.cocolog-nifty.com/"))
132      (ocidAElement's addAttribute:(ocidAddNode))
133      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("target") stringValue:("_blank"))
134      (ocidAElement's addAttribute:(ocidAddNode))
135      set strContents to ("AppleScriptで生成しました") as text
136      (ocidAElement's setStringValue:(strContents))
137      (ocidSetFooterElement's addChild:(ocidAElement))
138      
139      ########################################
140      #articleに渡すエレメント
141      set ocidSetArticleElement to (refMe's NSXMLElement's elementWithName:("div"))
142      set ocidH3Element to (refMe's NSXMLElement's elementWithName:("h5"))
143      (ocidH3Element's setStringValue:(strCommandText))
144      (ocidSetArticleElement's addChild:(ocidH3Element))
145      ########################################
146      #テーブル部生成開始
147      set ocidTableElement to (refMe's NSXMLElement's elementWithName:("table"))
148      #########caption
149      set ocidCaptionElement to (refMe's NSXMLElement's elementWithName:("caption"))
150      set strCaptionText to ((ocidFileName as text) & " : メタデータ一覧") as text
151      (ocidCaptionElement's setStringValue:(strCaptionText))
152      (ocidTableElement's addChild:(ocidCaptionElement))
153      #########colgroup
154      set ocidColgroupElement to (refMe's NSXMLElement's elementWithName:("colgroup"))
155      #########colcol生成
156      #項目番号
157      set ocidAddElement to (refMe's NSXMLElement's elementWithName:("col"))
158      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("title") stringValue:("LineNo"))
159      (ocidAddElement's addAttribute:(ocidAddNode))
160      (ocidColgroupElement's addChild:(ocidAddElement))
161      #キー
162      set ocidAddElement to (refMe's NSXMLElement's elementWithName:("col"))
163      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("title") stringValue:("キー名"))
164      (ocidAddElement's addAttribute:(ocidAddNode))
165      (ocidColgroupElement's addChild:(ocidAddElement))
166      #
167      set ocidAddElement to (refMe's NSXMLElement's elementWithName:("col"))
168      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("title") stringValue:(""))
169      (ocidAddElement's addAttribute:(ocidAddNode))
170      (ocidColgroupElement's addChild:(ocidAddElement))
171      #テーブルエレメントに追加
172      (ocidTableElement's addChild:(ocidColgroupElement))
173      #########thead
174      set ocidTheadElement to (refMe's NSXMLElement's elementWithName:("thead"))
175      set ocidTrElement to (refMe's NSXMLElement's elementWithName:("tr"))
176      #項目番号
177      set ocidAddElement to (refMe's NSXMLElement's elementWithName:("th"))
178      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("title") stringValue:("lineNo"))
179      (ocidAddElement's addAttribute:(ocidAddNode))
180      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("id") stringValue:("lineNo"))
181      (ocidAddElement's addAttribute:(ocidAddNode))
182      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("scope") stringValue:("col"))
183      (ocidAddElement's addAttribute:(ocidAddNode))
184      (ocidAddElement's setStringValue:(""))
185      (ocidTrElement's addChild:(ocidAddElement))
186      #キー
187      set ocidAddElement to (refMe's NSXMLElement's elementWithName:("th"))
188      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("title") stringValue:("key"))
189      (ocidAddElement's addAttribute:(ocidAddNode))
190      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("id") stringValue:("key"))
191      (ocidAddElement's addAttribute:(ocidAddNode))
192      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("scope") stringValue:("col"))
193      (ocidAddElement's addAttribute:(ocidAddNode))
194      (ocidAddElement's setStringValue:("キー名"))
195      (ocidTrElement's addChild:(ocidAddElement))
196      #
197      set ocidAddElement to (refMe's NSXMLElement's elementWithName:("th"))
198      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("title") stringValue:("value"))
199      (ocidAddElement's addAttribute:(ocidAddNode))
200      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("id") stringValue:("value"))
201      (ocidAddElement's addAttribute:(ocidAddNode))
202      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("scope") stringValue:("col"))
203      (ocidAddElement's addAttribute:(ocidAddNode))
204      (ocidAddElement's setStringValue:(""))
205      (ocidTrElement's addChild:(ocidAddElement))
206      #TRTHEADにセット
207      (ocidTheadElement's addChild:(ocidTrElement))
208      #THEADをテーブルにセット
209      (ocidTableElement's addChild:(ocidTheadElement))
210      ########################################
211      set numLineNo to 1 as integer
212      #tbody
213      set ocidTbodyElement to (refMe's NSXMLElement's elementWithName:("tbody"))
214      repeat with itemArray in ocidSortedKeyArray
215         set ocidExifValue to (ocidExifDict's valueForKey:(itemArray))
216         #TRの開始
217         set ocidTrElement to (refMe's NSXMLElement's elementWithName:("tr"))
218         ####項番処理
219         set ocidThElement to (refMe's NSXMLElement's elementWithName:("th"))
220         set strSetValue to ("項目番号:" & numLineNo) as text
221         set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("title") stringValue:(strSetValue))
222         (ocidThElement's addAttribute:(ocidAddNode))
223         set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("headers") stringValue:("LineNo"))
224         (ocidThElement's addAttribute:(ocidAddNode))
225         set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("scope") stringValue:("col"))
226         (ocidThElement's addAttribute:(ocidAddNode))
227         (ocidThElement's setStringValue:(numLineNo as text))
228         (ocidTrElement's addChild:(ocidThElement))
229         ####キー
230         set ocidThElement to (refMe's NSXMLElement's elementWithName:("th"))
231         set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("title") stringValue:(itemArray as text))
232         (ocidThElement's addAttribute:(ocidAddNode))
233         set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("headers") stringValue:("key"))
234         (ocidThElement's addAttribute:(ocidAddNode))
235         set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("scope") stringValue:("col"))
236         (ocidThElement's addAttribute:(ocidAddNode))
237         set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("class") stringValue:("tbody_th_title"))
238         (ocidThElement's addAttribute:(ocidAddNode))
239         (ocidThElement's setStringValue:(itemArray as text))
240         (ocidTrElement's addChild:(ocidThElement))
241         ####
242         set ocidTdElement to (refMe's NSXMLElement's elementWithName:("td"))
243         set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("title") stringValue:(ocidExifValue as text))
244         (ocidTdElement's addAttribute:(ocidAddNode))
245         set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("headers") stringValue:("value"))
246         (ocidTdElement's addAttribute:(ocidAddNode))
247         (ocidTdElement's setStringValue:(ocidExifValue as text))
248         (ocidTrElement's addChild:(ocidTdElement))
249         #
250         (ocidTbodyElement's addChild:(ocidTrElement))
251         set numLineNo to numLineNo + 1 as integer
252      end repeat
253      #TBODYをテーブルにセット
254      (ocidTableElement's addChild:(ocidTbodyElement))
255      #tfoot TR
256      set ocidTfootElement to (refMe's NSXMLElement's elementWithName:("tfoot"))
257      set ocidTrElement to (refMe's NSXMLElement's elementWithName:("tr"))
258      #colspan指定して1行でセット
259      set ocidThElement to (refMe's NSXMLElement's elementWithName:("th"))
260      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("title") stringValue:("テーブルの終わり"))
261      (ocidThElement's addAttribute:(ocidAddNode))
262      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("colspan") stringValue:(3))
263      (ocidThElement's addAttribute:(ocidAddNode))
264      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("scope") stringValue:("row"))
265      (ocidThElement's addAttribute:(ocidAddNode))
266      #
267      set strContents to ("項目数 : " & (numLineNo as text)) as text
268      (ocidThElement's setStringValue:(strContents))
269      #THTRにセットして
270      (ocidTrElement's addChild:(ocidThElement))
271      #TRTFOOTにセット
272      (ocidTfootElement's addChild:(ocidTrElement))
273      #TFOOTをテーブルにセット
274      (ocidTableElement's addChild:(ocidTfootElement))
275      #テーブルをアーティクルにセット
276      (ocidSetArticleElement's addChild:(ocidTableElement))
277      ##############################
278      #HTMLにする
279      ##############################
280      set ocidHTML to doMakeRootElement({ocidSetHeaderElement, ocidSetArticleElement, ocidSetFooterElement, strTitleText})
281      ##############################
282      #保存
283      ##############################
284      #読み取りやすい表示
285      set ocidXMLdata to (ocidHTML's XMLDataWithOptions:(refMe's NSXMLNodePrettyPrint))
286      #保存
287      set listDone to (ocidXMLdata's writeToURL:(ocidSaveFilePathURL) options:(refMe's NSDataWritingAtomic) |error|:(reference))
288      set aliasFilePath to (ocidSaveFilePathURL's absoluteURL()) as alias
289      ####【6】ブラウザで開く
290      tell application "Finder"
291         open location aliasFilePath
292      end tell
293      (*
294      ####【6】   テキストエディットで開く
295      tell application "TextEdit"
296         activate
297         open file aliasFilePath
298      end tell
299            *)
300      
301   end repeat
302end open
303
304
305
306
307############################################################
308# 基本的なHTMLの構造
309(*
310doMakeRootElement({argHeaderContents, argArticleContents, argFooterContents,argTitleText})
311HTMLBODY
312header
313article
314footerにそれぞれAddchildするデータをリストで渡す
315戻り値はRootエレメントにセットされた
316NSXMLDocumentを戻すので 保存すればOK
317*)
318############################################################
319to doMakeRootElement({argHeaderContents, argArticleContents, argFooterContents, argTitleText})
320   #XML初期化
321   set ocidXMLDoc to refMe's NSXMLDocument's alloc()'s init()
322   ocidXMLDoc's setDocumentContentKind:(refMe's NSXMLDocumentHTMLKind)
323   # DTD付与
324   set ocidDTD to refMe's NSXMLDTD's alloc()'s init()
325   ocidDTD's setName:("html")
326   ocidXMLDoc's setDTD:(ocidDTD)
327   #
328   set ocidRootElement to refMe's NSXMLElement's elementWithName:("html")
329   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("lang") stringValue:("ja")
330   ocidRootElement's addAttribute:(ocidAddNode)
331   #
332   set ocidHeadElement to refMe's NSXMLElement's elementWithName:("head")
333   #
334   set ocidAddElement to refMe's NSXMLElement's elementWithName:("title")
335   ocidAddElement's setStringValue:(argTitleText)
336   ocidHeadElement's addChild:(ocidAddElement)
337   # http-equiv
338   set ocidAddElement to refMe's NSXMLElement's elementWithName:("meta")
339   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("http-equiv") stringValue:("Content-Type")
340   ocidAddElement's addAttribute:(ocidAddNode)
341   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("content") stringValue:("text/html; charset=UTF-8")
342   ocidAddElement's addAttribute:(ocidAddNode)
343   ocidHeadElement's addChild:(ocidAddElement)
344   #
345   set ocidAddElement to refMe's NSXMLElement's elementWithName:("meta")
346   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("http-equiv") stringValue:("Content-Style-Type")
347   ocidAddElement's addAttribute:(ocidAddNode)
348   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("content") stringValue:("text/css")
349   ocidAddElement's addAttribute:(ocidAddNode)
350   ocidHeadElement's addChild:(ocidAddElement)
351   #
352   set ocidAddElement to refMe's NSXMLElement's elementWithName:("meta")
353   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("http-equiv") stringValue:("Content-Script-Type")
354   ocidAddElement's addAttribute:(ocidAddNode)
355   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("content") stringValue:("text/javascript")
356   ocidAddElement's addAttribute:(ocidAddNode)
357   ocidHeadElement's addChild:(ocidAddElement)
358   #
359   set ocidAddElement to refMe's NSXMLElement's elementWithName:("meta")
360   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("name") stringValue:("viewport")
361   ocidAddElement's addAttribute:(ocidAddNode)
362   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("content") stringValue:("width=720")
363   ocidAddElement's addAttribute:(ocidAddNode)
364   ocidHeadElement's addChild:(ocidAddElement)
365   #
366   set ocidAddElement to refMe's NSXMLElement's elementWithName:("style")
367   ocidAddElement's setStringValue:("body { margin: 10px; background-color: #FFFFFF; } table { border-spacing: 0; caption-side: top; font-family: system-ui; } thead th { border: solid 1px #666666; padding: .5ch 1ch; border-block-width: 1px 0; border-inline-width: 1px 0; &:first-of-type { border-start-start-radius: .5em } &:last-of-type { border-start-end-radius: .5em; border-inline-end-width: 1px } } tbody td { word-wrap: break-word;max-width: 360px;border-spacing: 0; border: solid 1px #666666; padding: .5ch 1ch; border-block-width: 1px 0; border-inline-width: 1px 0; &:last-of-type { border-inline-end-width: 1px } } tbody th { border-spacing: 0; border: solid 1px #666666; padding: .5ch 1ch; border-block-width: 1px 0; border-inline-width: 1px 0; } tbody tr:nth-of-type(odd) { background: #F2F2F2; } .kind_string { font-size: 0.75em; } .date_string { font-size: 0.5em; } .tbody_th_title{text-align: left;} tfoot th { border: solid 1px #666666; padding: .5ch 1ch; &:first-of-type { border-end-start-radius: .5em } &:last-of-type { border-end-end-radius: .5em; border-inline-end-width: 1px } }")
368   ocidHeadElement's addChild:(ocidAddElement)
369   ocidRootElement's addChild:(ocidHeadElement)
370   #   
371   #ボディエレメント
372   set ocidBodyElement to refMe's NSXMLElement's elementWithName:("body")
373   #ヘッダー
374   set ocidHeaderElement to refMe's NSXMLElement's elementWithName:("header")
375   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("id") stringValue:("header")
376   ocidHeaderElement's addAttribute:(ocidAddNode)
377   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("class") stringValue:("body_header")
378   ocidHeaderElement's addAttribute:(ocidAddNode)
379   ocidHeaderElement's addChild:(argHeaderContents)
380   ocidBodyElement's addChild:(ocidHeaderElement)
381   #アーティクル
382   set ocidArticleElement to refMe's NSXMLElement's elementWithName:("article")
383   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("id") stringValue:("article")
384   ocidArticleElement's addAttribute:(ocidAddNode)
385   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("class") stringValue:("body_article")
386   ocidArticleElement's addAttribute:(ocidAddNode)
387   ocidArticleElement's addChild:(argArticleContents)
388   ocidBodyElement's addChild:(ocidArticleElement)
389   #フッター
390   set ocidFooterElement to refMe's NSXMLElement's elementWithName:("footer")
391   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("id") stringValue:("footer")
392   ocidFooterElement's addAttribute:(ocidAddNode)
393   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("class") stringValue:("body_footer")
394   ocidFooterElement's addAttribute:(ocidAddNode)
395   ocidFooterElement's addChild:(argFooterContents)
396   ocidBodyElement's addChild:(ocidFooterElement)
397   #ボディをROOTエレメントにセット
398   ocidRootElement's addChild:(ocidBodyElement)
399   #ROOTXMLにセット
400   ocidXMLDoc's setRootElement:(ocidRootElement)
401   #値を戻す
402   return ocidXMLDoc
403end doMakeRootElement
404
405##############################
406# exiftoolインストール
407##############################
408to doInstallBin()
409   set strVerURL to ("https://exiftool.org/ver.txt") as text
410   set strInstrallDirPath to ("~/bin/exiftool") as text
411   ###インストール先
412   set ocidInstrallDirPathStr to refMe's NSString's stringWithString:(strInstrallDirPath)
413   set ocidInstrallDirPath to ocidInstrallDirPathStr's stringByStandardizingPath()
414   set ocidInstrallDirPathURL to (refMe's NSURL's alloc()'s initFileURLWithPath:(ocidInstrallDirPath) isDirectory:true)
415   ###フォルダを作る
416   set appFileManager to refMe's NSFileManager's defaultManager()
417   set ocidAttrDict to refMe's NSMutableDictionary's alloc()'s initWithCapacity:0
418   ocidAttrDict's setValue:(448) forKey:(refMe's NSFilePosixPermissions)
419   set listBoolMakeDir to appFileManager's createDirectoryAtURL:(ocidInstrallDirPathURL) withIntermediateDirectories:true attributes:(ocidAttrDict) |error|:(reference)
420   set strInstrallDirPath to (ocidInstrallDirPathURL's |path|()) as text
421   ###バージョンテキストURL
422   set ocidVerURLStr to refMe's NSString's stringWithString:(strVerURL)
423   set ocidVerURL to refMe's NSURL's alloc()'s initWithString:(ocidVerURLStr)
424   set ocidVerText to refMe's NSString's stringWithContentsOfURL:(ocidVerURL) encoding:(refMe's NSUTF8StringEncoding) |error|:(reference)
425   set strVer to (item 1 of ocidVerText) as text
426   ###URLとファイル名の整形
427   set strDmgName to ("ExifTool-" & strVer & ".dmg") as text
428   set strPkgName to ("ExifTool-" & strVer & ".pkg") as text
429   set strVoluemPath to ("/Volumes/ExifTool-" & strVer & "") as text
430   set strPkgPath to ("" & strVoluemPath & "/" & strPkgName & "/Contents/Archive.pax.gz") as text
431   set strURL to ("https://exiftool.org/" & strDmgName & "") as text
432   set ocidURLStr to refMe's NSString's stringWithString:(strURL)
433   set ocidURL to refMe's NSURL's alloc()'s initWithString:(ocidURLStr)
434   ###ダウンロードディレクトリ
435   set appFileManager to refMe's NSFileManager's defaultManager()
436   set ocidTempDirURL to appFileManager's temporaryDirectory()
437   set ocidUUID to refMe's NSUUID's alloc()'s init()
438   set ocidUUIDString to ocidUUID's UUIDString
439   set ocidSaveDirPathURL to ocidTempDirURL's URLByAppendingPathComponent:(ocidUUIDString) isDirectory:true
440   ###フォルダを作る
441   set appFileManager to refMe's NSFileManager's defaultManager()
442   set ocidAttrDict to refMe's NSMutableDictionary's alloc()'s initWithCapacity:0
443   ocidAttrDict's setValue:(511) forKey:(refMe's NSFilePosixPermissions)
444   set listBoolMakeDir to appFileManager's createDirectoryAtURL:(ocidSaveDirPathURL) withIntermediateDirectories:true attributes:(ocidAttrDict) |error|:(reference)
445   ###保存URL
446   set ocidSaveDmgFilePathURL to ocidSaveDirPathURL's URLByAppendingPathComponent:(strDmgName)
447   set strSaveDmgFilePathURL to (ocidSaveDmgFilePathURL's |path|()) as text
448   ###ダウンロード
449   set ocidOption to refMe's NSDataReadingMappedAlways
450   set listDone to refMe's NSData's alloc()'s initWithContentsOfURL:(ocidURL) options:(ocidOption) |error|:(reference)
451   set ocidDmgData to (item 1 of listDone)
452   ###保存
453   set ocidOption to refMe's NSDataWritingAtomic
454   set listDone to ocidDmgData's writeToURL:(ocidSaveDmgFilePathURL) options:(ocidOption) |error|:(reference)
455   log item 1 of listDone
456   ####ディスクイメージマウント
457   strSaveDmgFilePathURL
458   set strCommandText to ("/usr/bin/hdiutil attach \"" & strSaveDmgFilePathURL & "\" -noverify -nobrowse -noautoopen") as text
459   do shell script strCommandText
460   ###解凍先ディレクトリを作成
461   set ocidExpandPkgDirPathURL to ocidSaveDirPathURL's URLByAppendingPathComponent:("Expand")
462   set ocidAttrDict to refMe's NSMutableDictionary's alloc()'s initWithCapacity:0
463   ocidAttrDict's setValue:(448) forKey:(refMe's NSFilePosixPermissions)
464   set listBoolMakeDir to appFileManager's createDirectoryAtURL:(ocidExpandPkgDirPathURL) withIntermediateDirectories:true attributes:(ocidAttrDict) |error|:(reference)
465   set strExpandPkgDirPathURL to (ocidExpandPkgDirPathURL's |path|()) as text
466   ###解凍
467   set strCoommandText to "/usr/bin/bsdtar  -xzf  \"" & strPkgPath & "\" -C \"" & strExpandPkgDirPathURL & "\"" as text
468   do shell script strCoommandText
469   ###ディスクイメージアンマウンド
470   set strCoommandText to "/usr/bin/hdiutil detach  \"" & strVoluemPath & "\"  -force" as text
471   do shell script strCoommandText
472   ###ユーザーディレクトリにコピー
473   set ocidDittoDirPathURL to ocidExpandPkgDirPathURL's URLByAppendingPathComponent:("usr/local/bin")
474   set strDittoDirPathURL to (ocidDittoDirPathURL's |path|()) as text
475   set strCoommandText to "/usr/bin/ditto  \"" & strDittoDirPathURL & "\"  \"" & strInstrallDirPath & "\"" as text
476   do shell script strCoommandText
477end doInstallBin
AppleScriptで生成しました

【スクリプトエディタで開く】|

#!/usr/bin/env osascript
----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
#
(* HTMLの保存先のデフォルトは再起動時に削除されるディレクトリですので
生成されたファイルを保存したい場合は別途保存してください
exiftoolのインストールはこちらをどうぞ
https://quicktimer.cocolog-nifty.com/icefloe/2024/01/post-e7e51d.html
*)
# com.cocolog-nifty.quicktimer.icefloe
----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
use AppleScript version "2.8"
use framework "Foundation"
use framework "AppKit"
use scripting additions

property refMe : a reference to current application
set appFileManager to refMe's NSFileManager's defaultManager()

########################################
### 設定項目
### exiftoolへのパス
########################################
set strExifPath to "~/bin/exiftool/exiftool" as text

#
set ocidExifPathStr to refMe's NSString's stringWithString:(strExifPath)
set ocidExifPath to ocidExifPathStr's stringByStandardizingPath()
set ocidExifPathURL to (refMe's NSURL's alloc()'s initFileURLWithPath:(ocidExifPath) isDirectory:false)
set strExifPath to ocidExifPathURL's |path| as text

########################################
####出力先(再起動時に削除されます)
set ocidTemporaryDirPathURL to appFileManager's temporaryDirectory
set ocidVarFoldersDirURL to ocidTemporaryDirPathURL's URLByDeletingLastPathComponent()
set ocidTemporaryItemsPathURL to ocidVarFoldersDirURL's URLByAppendingPathComponent:"TemporaryItems"
##フォルダを作る
set appFileManager to refMe's NSFileManager's defaultManager()
set ocidAttrDict to refMe's NSMutableDictionary's alloc()'s initWithCapacity:0
# 777-->511 755-->493 700-->448 766-->502
ocidAttrDict's setValue:(448) forKey:(refMe's NSFilePosixPermissions)
set listDone to appFileManager's createDirectoryAtURL:(ocidTemporaryItemsPathURL) withIntermediateDirectories:(true) attributes:(ocidAttrDict) |error|:(reference)
set aliasTemporaryItems to (ocidTemporaryItemsPathURL's absoluteURL()) as alias
########################################
#######ファイル選択
#####ダイアログを前面に
tell current application
  set strName to name as text
end tell
####スクリプトメニューから実行したら
if strName is "osascript" then
  tell application "Finder" to activate
else
  tell current application to activate
end if
##
set appFileManager to refMe's NSFileManager's defaultManager()
set ocidURLsArray to (appFileManager's URLsForDirectory:(refMe's NSDesktopDirectory) inDomains:(refMe's NSUserDomainMask))
set ocidDesktopDirPathURL to ocidURLsArray's firstObject()
set aliasDefaultLocation to (ocidDesktopDirPathURL's absoluteURL()) as alias
set listUTI to {"public.data"}
set strPromptText to "ファイルを選んでください" as text
set strMesText to "ファイルを選んでください" as text
set aliasFilePath to (choose file strMesText with prompt strPromptText default location (aliasDefaultLocation) of type listUTI with invisibles without multiple selections allowed and showing package contents) as alias
####入力ファイル関連
set strFilePath to POSIX path of aliasFilePath as text
###NSストリングに
set ocidFilePath to refMe's NSString's stringWithString:(strFilePath)
###NSURLに
set ocidFilePathURL to refMe's NSURL's fileURLWithPath:(ocidFilePath)
##ファイル名取得
set strFileName to (ocidFilePathURL's lastPathComponent) as text
##コンテナ
set ocidContainerPathURL to ocidFilePathURL's URLByDeletingLastPathComponent()
set aliasContainerDirPath to (ocidContainerPathURL's absoluteURL()) as alias

########################################
######出力ファイル
##ファイル名
set strFileName to (strFileName & ".html") as text
set aliasSaveFilePath to (choose file name with prompt "htmlのファイル名を付けてください" default name strFileName default location aliasTemporaryItems) as «class furl»
set strSaveFilePath to (POSIX path of aliasSaveFilePath) as text
###NSストリングに
set ocidSaveFilePath to refMe's NSString's stringWithString:(strSaveFilePath)
###NSURLに
set ocidSaveFilePathURL to refMe's NSURL's fileURLWithPath:(ocidSaveFilePath)
##拡張子
set strFileExtension to (ocidSaveFilePathURL's pathExtension) as text
###拡張子つけ忘れ対策
if strFileExtension is not "html" then
  set strSaveFilePath to (POSIX path of aliasSaveFilePath & ".html") as text
end if

########################################
###【1】データ取得 JSON出力
try
  set theCommandText to ("\"" & strExifPath & "\" -json \"" & strFilePath & "\"") as text
  set strResponseJosn to (do shell script theCommandText) as text
on error
return "たぶんexiftoolの非対応のファイルタイプです"
end try
###【2】NSStringにテキストに格納して
set ocidReadDataJson to refMe's NSString's stringWithString:strResponseJosn
###【3】NSConcreteMutableDataに変換
set ocidReadDataUTF to ocidReadDataJson's dataUsingEncoding:(refMe's NSUTF8StringEncoding)
###【4】NSInlineDataデータ初期化
set ocidReadData to (refMe's NSData's alloc()'s initWithData:(ocidReadDataUTF))
###【5】NSJSONSerialization
set listJSONSerialization to (refMe's NSJSONSerialization's JSONObjectWithData:ocidReadData options:0 |error|:(reference))
set ocidJsonData to (item 1 of listJSONSerialization)
-->(*__NSSingleObjectArrayI*)
####解説
(*
exiftoolの書き出すJSONはrootがArray構造から始まっているので
PlistにするにはDictに変換なりする必要がある
幸い『[{}]』といったシングルArray構造なので
Arrayから最初のOBJECTを取り出せばDICTレコード構造になる
*)
set ocidJsonDict to (ocidJsonData's firstObject())
-->(*__NSDictionaryI*)
###【6】レコードをNSDictionaryとして格納
set ocidJsonDict to (refMe's NSDictionary's alloc()'s initWithDictionary:ocidJsonDict)
###【7】NSPropertyListSerialization's
set ocidFromat to (refMe's NSPropertyListXMLFormat_v1_0)
set listPlistData to refMe's NSPropertyListSerialization's dataWithPropertyList:(ocidJsonDict) format:(ocidFromat) options:0 |error|:(reference)
set ocidPlistData to item 1 of listPlistData

###保存先
set ocidSaveDirPathURL to ocidSaveFilePathURL's URLByDeletingLastPathComponent()
set aliasSaveDirPath to ocidSaveDirPathURL's absoluteURL() as alias

set strPlistFileName to (strFileName & ".plist") as text
set ocidPlistFilePathURL to ocidTemporaryItemsPathURL's URLByAppendingPathComponent:(strPlistFileName)
###【8】保存
set ocidOption to (refMe's NSDataWritingAtomic)
set boolWritetoUrlArray to ocidPlistData's writeToURL:(ocidPlistFilePathURL) options:(ocidOption) |error|:(reference)


########################################
#######HTML 基本構造
###スタイル
set strStylle to "<style>#bordertable {padding: 10px;width: 100%;margin: 0;border-collapse: collapse;border-spacing: 0;word-wrap: break-word;} #bordertable table { width: 580px;margin: 0px;padding: 0px;border: 0px;border-spacing:0px;border-collapse: collapse;} #bordertable caption { font-weight: 900;} #bordertable thead { font-weight: 600;border-spacing:0px;} #bordertable td {border: solid 1px #666666;padding: 3px;margin: 0px;word-wrap: break-word;border-spacing:0px;} #bordertable tr {border: solid 1px #666666;padding: 0px;margin: 0px;border-spacing:0px;} #bordertable th {border: solid 1px #666666;padding: 0px;margin: 0px;border-spacing:0px;}</style>"
###ヘッダー部
set strHead to "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"utf-8\"><title>[Exif]" & strFileName & "</title>" & strStylle & "</head><body>"
###ボディ
set strBody to ""
###最後
set strHtmlEndBody to "</body></html>"
###HTML書き出し用のテキスト初期化
set ocidHTMLString to refMe's NSMutableString's alloc()'s initWithCapacity:0
####
(ocidHTMLString's appendString:strHead)
###テーブル構造
set strTableHeader to "<div id=\"bordertable\"><table><caption>Exif情報:" & strFileName & "</caption><thead title=\"表の項目について\"><tr><th title=\"項目の番号が最初\" style=\"width: 36px;\" scope=\"row\" >項番</th><th title=\"キーの名前が2番目\" scope=\"col\">キーの名前</th><th title=\"キーの値は3番目になっています\" scope=\"col\">キーの値</th></thead><tbody title=\"表の始まりです\">" as text
(ocidHTMLString's appendString:strTableHeader)

####JSONの全てのキーを取得して
set ocidAllKeys to ocidJsonDict's allKeys()
set numLineNO to 0
####キーの種類だけ繰り返し
repeat with objKey in ocidAllKeys
  set strKey to objKey as text
  ####キーの値を取り出し
  set ocidValue to (ocidJsonDict's objectForKey:(strKey))
  set strClass to className() of ocidValue as text
  if strClass contains "Array" then
    set strArray to (ocidValue's componentsJoinedByString:(","))
    set strKey to doHtmlEntitiesEnc(strKey)
    set strValue to doHtmlEntitiesEnc(strArray)
  else
    set strKey to doHtmlEntitiesEnc(strKey)
    set strValue to doHtmlEntitiesEnc(ocidValue)
  end if
  ####内容によって表示させるための分岐
  if strKey is "ExifToolVersion" then
    ###キーと値を保存
    set strHTMLTagFooterKey to strKey as text
    set strHTMLTagFooterValue to strValue as text
    ####例外処理
  else if strKey is "Directory" then
    set numLineNO to numLineNO + 1 as number
    set strHTMLTag to "<tr><th title=\"項番:" & strKey & "\" scope=\"row\">" & numLineNO & "</th><td title=\"キー:" & strKey & "について\">" & strKey & "</td><td title=\"キー:" & strKey & "の値\">非表示にしています</td></tr>" as text
  else if strKey is "SourceFile" then
    set numLineNO to numLineNO + 1 as number
    set strHTMLTag to "<tr><th title=\"項番:" & strKey & "\" scope=\"row\">" & numLineNO & "</th><td title=\"キー:" & strKey & "について\">" & strKey & "</td><td title=\"キー:" & strKey & "の値\">非表示にしています</td></tr>" as text
  else
    ###普通はこの処理
    set numLineNO to numLineNO + 1 as number
    set strHTMLTag to "<tr><th title=\"項番:" & strKey & "\" scope=\"row\">" & numLineNO & "</th><td title=\"キー:" & strKey & "について\">" & strKey & "</td><td title=\"キー:" & strKey & "の値\">" & strValue & "</td></tr>" as text
  end if
  ####できたタグを追加
(ocidHTMLString's appendString:strHTMLTag)
  
end repeat
###最後にバージョンを入れる
set numLineNO to numLineNO + 1 as number
###最後のtfoot項目
set strHTMLTagFooter to "</tbody><tfoot title=\"表の終わりです\"><tr><th title=\"項番:" & numLineNO & "\" scope=\"row\">" & numLineNO & "</th><td title=\"キーの名前\">ExifToolVersion</td><td title=\"キー:" & strHTMLTagFooterKey & "の値\">ExifTool:" & strHTMLTagFooterValue & "で作成しました</td></tr></tfoot></table></div>" as text
###タグを全部追加して
(ocidHTMLString's appendString:strHTMLTagFooter)
ocidHTMLString's appendString:strHtmlEndBody
###ファイルに書き出し
set boolWritetoUrlArray to ocidHTMLString's writeToFile:strSaveFilePath atomically:true encoding:(refMe's NSUTF8StringEncoding) |error|:(reference)
(*
####テキストエディタで開く
log strSaveFilePath
tell application "TextEdit"
activate
open (POSIX file strSaveFilePath as alias)
end tell
*)
####サファリで開く
set strOpenURL to ocidSaveFilePathURL's absoluteString() as text
tell application "Safari"
activate
make new document with properties {name:"MDLS2HTMLv2"}
  tell window 1
open location strOpenURL
  end tell
end tell
########################################
### キー名と値にHTMLの要素があるケースがあるので
### HtmlEntities変換
########################################

to doHtmlEntitiesEnc(argTEXT)
  
  ###置換レコード
  ## set recordEntityMap to {|&|:"&amp;", |<|:"&lt;", |>|:"&gt;", |"|:"&quot;", |'|:"&apos;", |=|:"&#x3D;", |+|:"&#x2B;"} as record
  set recordEntityMap to {|<|:"&lt;", |>|:"&gt;", |"|:"&quot;", |'|:"&apos;", |=|:"&#x3D;", |+|:"&#x2B;", |©|:"&copy;", |®|:"&reg;", |™|:"&trade;", |€|:"&euro;", |£|:"&pound;", |¥|:"&yen;", |...|:"&hellip;"} as record
  ###ディクショナリにして
  set ocidEntityMap to refMe's NSDictionary's alloc()'s initWithDictionary:(recordEntityMap)
  ###キーの一覧を取り出します
  set ocidAllKeys to ocidEntityMap's allKeys()
  
  ##通常テキストの場合
  set strText to argTEXT as text
  ###選択中テキスト
  set ocidText to refMe's NSString's stringWithString:(strText)
  ###可変テキストにして
  set ocidTextM to refMe's NSMutableString's alloc()'s initWithCapacity:0
ocidTextM's setString:(ocidText)
  ###&だけ先に処理しておく
  set ocidTextM to (ocidTextM's stringByReplacingOccurrencesOfString:("&") withString:("&amp;"))
  ###取り出したキー一覧を順番に処理
  repeat with itemAllKey in ocidAllKeys
    set strItemKey to itemAllKey as text
    ##キーの値を取り出して
    set strValue to (ocidEntityMap's valueForKey:(itemAllKey)) as text
    ##置換
    set ocidTextM to (ocidTextM's stringByReplacingOccurrencesOfString:(strItemKey) withString:(strValue))
    ##次の変換に備える
    set ocidTextM to ocidTextM
  end repeat
  
return (ocidTextM as text)
end doHtmlEntitiesEnc

|

« [applescript] ExifToolインストール(ちょっと修正) | トップページ | [exiftool] exiftoolのhtmlDumpの内容をHTMLで保存する(画像系専用) »

EXIFData」カテゴリの記事