iphloxの情報整理ノート

2009-02-10

ニコ動からローカルにDLしたファイルに親サイトと同じOpenMetaタグを付けるドロップレット


やっと動くようになったのでメモとして残しておくけど、ろくにテストしてない暫定版なのでわかる人以外は使わないでください

  • 使用方法と処理内容
    • たとえばローカルに「【鏡音リン】炉心融解【オリジナル】.mp4」があったとします
    • このファイルをappにドロップするとOpenMetaタグに書き込んでくれます(複数対応)
    • まず、「【鏡音リン】炉心融解【オリジナル】」をニコニコ動画のwebアクセスで検索、結果htmlを解析し、再生の多い動画IDを取得
    • ニコニコ動画apiを呼んでタグ情報を取得
    • omtoolを使ってOpenMetaタグに書き込み
  • 確認方法
    • spotlightで「tag:vo」で引っかかるでしょう(VOCALOID殿堂入りにヒット)
    • 同様に「音楽」「鏡音リン」「kuma」「なぎみそ。SYS」「iroha(sasaki)」(敬称略)等のタグが登録されているはずです
    • finderのサイドバーにスマート検索フォルダにして置いておくといいかも
    • Tagitで二回検索すれば出るようになるようです
  • 残念ながら非対応
    • omtoolはcom.openmeta.shared.plistに書き込んでくれないので、s-take氏のOMWizard1.1ではタグ履歴に出てきません
  • テストしてくださった方には感謝感謝です
    • バグレポート、動作レポート、感想等、コメントに残していただけるととてもうれしいです
  • 次はpixiv版を作る予定

MetaCompN03.app

--MetaCompN0.3

--ファイルをドロップするとニコニコ動画の情報を取得し、タグ付けします
---ファイル名をニコニコ動画で検索、html解析し、再生の多い動画IDを取得 要safariでログイン
---ニコニコ動画apiを呼んで情報取得
---omtoolで書き込み

on open dropItems
	repeat with dropItem in dropItems
		
		setTags(dropItem)
		
	end repeat
end open


on setTags(dropItem)
	
	tell application "Finder"
		set tmpFolder to POSIX path of ((container of (path to me)) as alias)
		set omtool to tmpFolder & "omtool" --omtoolパス
		set tmp3 to tmpFolder & "tmp3"
		set tmp4 to tmpFolder & "tmp4"
		set ref3 to tmp3 as POSIX file
		set ref4 to tmp4 as POSIX file
		
		set targetFilePath to POSIX path of dropItem
		set filename to name of dropItem
		set filename to retFileNameWithoutExt(filename) of me
		
	end tell
	
	--ファイル名から動画idを調べる
	set targetURL to "http://www.nicovideo.jp/search/" & filename & "?sort=v"
	tell application "Safari"
		open location targetURL
		--タイムアウトを考慮してない
		delay 5
		try
			set theSource to (the source of document 1)
		on error
			beep 2
			return
		end try
		do JavaScript "window.close();" in document 1
	end tell
	
	set theSource to simpleTagParse(theSource, "<div id=\"item1\"", "</div>")
	set movieId to simpleTagParse(theSource, "<a href=\"watch/", "\">")
	
	--ニコニコ動画api	
	set targetURL to "http://www.nicovideo.jp/api/getthumbinfo/" & movieId
	try
		tell application "URL Access Scripting"
			activate
			download targetURL to file tmp3 replacing yes with progress
			quit
		end tell
	on error errorNum
		display dialog errorNum
	end try
	
	try
		do shell script "iconv -c -f UTF-8 -t SHIFT_JIS " & tmp3 & " > " & tmp4
		-- -cはエラー継続 tryで囲えばnon-zeroエラーを抑制できた
	end try
	
	open for access ref4
	try
		read ref4
		set dataXML to result
	on error
		close access ref4
		return
	end try
	close access ref4
	
	set dataTags to simpleTagParse(dataXML, "<tags domain=\"jp\">", "</tags>")
	set dataTags to replaceText(dataTags, "<tag lock=\"1\">", "\"")
	set dataTags to replaceText(dataTags, "<tag>", "\"")
	set dataTags to replaceText(dataTags, "</tag>", "\"")
	set dataTags to replaceText(dataTags, (ASCII character 10), " ")
	
	do shell script omtool & " -a " & dataTags & " -p " & targetFilePath
	
	tell application "Finder"
		delete ref3
		delete ref4
	end tell
	
end setTags


--引用元
--http://homepage.mac.com/travellers/blog/C746134881/E441300314/index.html
--ちょっと改造
on simpleTagParse(tmpData, beginKey, endKey)
	set oldDelim to AppleScript's text item delimiters
	try
		set AppleScript's text item delimiters to beginKey
		set tmpData2 to second text item of tmpData
		set AppleScript's text item delimiters to endKey
		set tmpData3 to (first text item of tmpData2) as Unicode text
		set AppleScript's text item delimiters to oldDelim
		return tmpData3
	on error
		if tmpData does not contain beginKey then
			log "The key doesn't exist in the data"
		end if
		set AppleScript's text item delimiters to oldDelim
		return missing value
	end try
end simpleTagParse

--引用元
--http://www.tonbi.jp/AppleScript/tips/String/FindReplace.html
on replaceText(theText, serchStr, replaceStr)
	set tmp to AppleScript's text item delimiters
	set AppleScript's text item delimiters to serchStr
	set theList to every text item of theText
	set AppleScript's text item delimiters to replaceStr
	set theText to theList as string
	set AppleScript's text item delimiters to tmp
	return theText
end replaceText

--引用元
--http://piyocast.com/as/archives/397
on retFileNameWithoutExt(fileNameStr)
	set fLen to length of fileNameStr
	set revText to (reverse of (characters of fileNameStr)) as string
	set anOffset to offset of "." in revText
	set fRes to text 1 thru (fLen - anOffset) of fileNameStr
	return fRes
end retFileNameWithoutExt

a-ki_rooma-ki_room 2009/02/11 17:38 こんにちは。10.5.6で使ってみたら動きました。mp4でもflvでも大丈夫です。非常に便利なドロップレットだと思います。

環境に依存するためちょっと不躾な提案なのですが、
たとえばローカルに「【鏡音リン】炉心融解【オリジナル】.mp4」があったとします
とありますが、たとえばSafariStandを用いると
「【鏡音リン】炉心融解【オリジナル】‐ニコニコ動画(ββ).mp4」
のようなファイルがローカルに用意されることになります。この場合、検索しても見つからないので"Can't get every text item of missing value"と言われてしまいます。filenameの値として、もし最後に"-ニコニコ動画(hoge)"がある場合にはそれを取ったものを検索に渡す、と出来ればより広い環境で気軽に使えると思います。
僕はとりあえず適当なrenamerで一気に"-ニコニコ動画(hoge)"を削ってしまってからMetaCompN03にドロップしています。

それでは。引き続きありがたく使わせてもらいます。

iphloxiphlox 2009/02/11 22:01 a-ki_roomさん、こんにちは。動作報告および貴重なご意見ありがとうございます。

実は第三者にソフトウェアを配るなんて初めてなので、他環境で動くのかとても心配だったのです。これで一安心しました。
SafariStandの件で、「-ニコニコ動画(hoge)」を削ってから検索をかけるように修正入れます。
また、検索結果が0件で<div id="item1"を拾えない場合のエラー処理を追加します。

いやぁ、俄然やる気出てきた。ありがとうございます。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/iphlox/20090210/1234257813