[exiftool] exiftoolで取得したメタデータをHTML表示(少し修正)
ソース | |
---|---|
001 | #!/usr/bin/env osascript |
002 | ----+----1----+----2----+-----3----+----4----+----5----+----6----+----7 |
003 | (* |
004 | |
005 | exiftoolが別途必要です |
006 | [applescript]exiftoolインストール |
007 | https://quicktimer.cocolog-nifty.com/icefloe/2024/07/post-a2a84b.html |
008 | |
009 | インストール先が ~/bin/exiftool になっています |
010 | 一般的な/usr/local/binにインストールするには |
011 | 管理者権限が必要です |
012 | 管理者の方にご相談ください |
013 | |
014 | exiftoolの出力をHTMLにします |
015 | |
016 | com.cocolog-nifty.quicktimer.icefloe *) |
017 | ----+----1----+----2----+-----3----+----4----+----5----+----6----+----7 |
018 | use AppleScript version "2.8" |
019 | use framework "Foundation" |
020 | use framework "AppKit" |
021 | use framework "UniformTypeIdentifiers" |
022 | use scripting additions |
023 | |
024 | property refMe : a reference to current application |
025 | |
026 | on 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 |
032 | end run |
033 | |
034 | |
035 | on 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 | #########【col】col生成 |
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 | #TRをTHEADにセット |
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 | #THをTRにセットして |
270 | (ocidTrElement's addChild:(ocidThElement)) |
271 | #TRをTFOOTにセット |
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 |
302 | end open |
303 | |
304 | |
305 | |
306 | |
307 | ############################################################ |
308 | # 基本的なHTMLの構造 |
309 | (* |
310 | doMakeRootElement({argHeaderContents, argArticleContents, argFooterContents,argTitleText}) |
311 | HTMLのBODY部 |
312 | header |
313 | article |
314 | footerにそれぞれAddchildするデータをリストで渡す |
315 | 戻り値はRootエレメントにセットされた |
316 | NSXMLDocumentを戻すので 保存すればOK |
317 | *) |
318 | ############################################################ |
319 | to 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 | #ROOTをXMLにセット |
400 | ocidXMLDoc's setRootElement:(ocidRootElement) |
401 | #値を戻す |
402 | return ocidXMLDoc |
403 | end doMakeRootElement |
404 | |
405 | ############################## |
406 | # exiftoolインストール |
407 | ############################## |
408 | to 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 |
477 | end 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 {|&|:"&", |<|:"<", |>|:">", |"|:""", |'|:"'", |=|:"=", |+|:"+"} as record
set recordEntityMap to {|<|:"<", |>|:">", |"|:""", |'|:"'", |=|:"=", |+|:"+", |©|:"©", |®|:"®", |™|:"™", |€|:"€", |£|:"£", |¥|:"¥", |...|:"…"} 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:("&"))
###取り出したキー一覧を順番に処理
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」カテゴリの記事
- [exiftool]メタデータをHTML出力する(ダイアログSystemUIServer版)(2025.02.19)
- [Automator]exif2html exifデータをHTML表示させるクイックアクション(2024.08.26)
- [bash]exiftoolインストール(シングルファイル形式のPKG対応)(2024.07.29)
- [applescript]exiftoolインストール(シングルファイル形式のPKG対応)(2024.07.29)
- [PDF]PDFのメタデータの取り出し方法いろいろ(デモ)(2024.07.02)