#YouTubeDLGT.mscr ver.2009.4.16################ #クリップボードにコピーされたYouTubeのURLを元に #自動的にストリーミング/ダウンロード再生するスクリプト #TCPMP ストリーミング用プラグイン対応版 # #W-ZERO3 WS003SHで動作確認 #for MortScript 4.2 Public Release (must be PPC version!!!) # #by モバイル板MortScriptスレの1 #ref. to http://pc11.2ch.net/test/read.cgi/mobile/1200917379/l50 # #【更新】 # YouTube 仕様変更対応版 # ★念のため、Pocket IEのクッキーをクリアしてから使用して下さい。 # ・ステイタスウィンドウで、ゲートウェイサーバとのやりとりを # ログ表示/記録するようにしました。 # ログファイルは、スクリプトと同じディレクトリに保存されます。   # ######################################## # #・.m3uファイルによるストリーミング再生に対応. #・必要な文字列やurlの取得を、WEB上の専用ゲートウェイサーバ(自前)を利用して行います。 # #<注意> #・自動接続機能はありません。インターネットに接続済みの状態で起動して下さい。 #・海外の放送局などが公式に提供しているビデオのページには、 # ゲートウェイ経由でアクセスできない場合もあります。 #・今回のYouTube 仕様変更で、多くのビデオがストリーム再生不能になったようです。 # この場合はダウンロード再生して下さい。 #・できればスクリプトの内容をよく読んで、意味を理解しつつご利用下さい。 # #<使い方> #・YouTubeの動画閲覧URL ("http://www.youtube.com/watch?v=[ビデオID]" の形式) # あるいはビデオIDだけをクリップボードにコピーしてから、スクリプトを起動して下さい。 #・ゲートウェイサーバにアクセスして必要なデータを取得したのち、再生方式選択ダイアログが現れます。 # # "Start downloading (動画ファイルタイトル) as..." # 1. ".m3u streaming." ….m3uファイルを生成してストリーミング再生します。 # 2. ".flv file." ….flvファイルをダウンロードしたのち、再生します。 # 3. ".flv file after renaming." …自動的に生成されるファイル名(後述)を変更したのち、 #  .flvファイルをダウンロードして、再生します。 # #・動画ファイルが「<ビデオID>.xxx」というファイル名で保存されると、あとあと何だか判りづらいので、 # 「<動画タイトル>_<ビデオID>.xxx」という名前で、指定の保存ファイルに保存されます。 #・.flvファイル名 "_<ビデオID>.flv" の前のタイトル部分の文字数を変更できます。 # "title_length = " の値に文字数を設定して下さい。 #・.m3uファイル生成 / .flvファイルダウンロードが終了すると、 # .m3u / .flvファイルに関連付けされたプレイヤーアプリが立ち上がります。 #・IEキャッシュファイルが溜るので、消去します。 # #・レジストリ値を一時的に書き換えることにより、IEキャッシュファイルの保存場所を、 # ビデオファイル保存と同じディレクトリに変更できます。 # 必要ない場合は、"change_cache = " の値を0にして下さい。 #・キャッシュディレクトリ変更を行う場合、ダウンロード中にフリーズしたりすると # オリジナルのレジストリ値が失われてしまうので、datファイルに保管します。 # フリーズ等から回復して、次にYouTubeDL.mscrを起動すると、 # datファイル内のデータを、レジストリにレストアして終了します。 # # #<別途必要なファイル>   #・"MatchRep41.mscr" ver.1.11.2008 # (最新版は http://home.att.ne.jp/wave/deox_pop/scripts/MatchRep41.txt ) #・"WinActivator.mscr" # ( http://home.att.ne.jp/wave/deox_pop/scripts/WinActivator.txt ) # → "MortScriptのあるフォルダ\lib"フォルダ内に入れて下さい。 #以上、保存ディレクトリが異なる場合は、適宜書き換えて下さい。 ##################################### #require MatchRep = SystemPath( "ScriptExe" ) \ "lib\MatchRep41.mscr" WinAct = SystemPath( "ScriptExe" ) \ "lib\WinActivator.mscr" #保存ディレクトリ。機種や環境に応じて、適宜書き換えて下さい。 destDir = "\miniSD Card\My Movie" #IEキャッシュの保存場所を、ビデオファイル保存と同じディレクトリに #一時変更するかどうか( する:1 、しない:0 ) change_cache = 1 #ファイル名 "_<ビデオID>.flv" の前のタイトル部分の文字数(全角文字も1文字扱い) title_length = 16 #設定はここまで############################ #datファイルのパス datFile = SystemPath( "ScriptPath" ) \ "YouTubeDL_cachedir_saved.dat" #temp datファイルのパス tempDat = SystemPath( "ScriptPath" ) \ "YouTubeDL_temp.dat" #logファイルのパス logFile = SystemPath( "ScriptPath" ) \ "YouTubeDL_log.txt" #ゲートウェイサーバのurl gtUrl = "http://scripters.s297.xrea.com/cgi-bin/youtube_headers.cgi" errorTitle = "Error - " & SystemPath( "ScriptName" ) #キャッシュ用レジストリ値レストア If ( change_cache && FileExists( datFile )) CacheDir_saved = ReadFile( datFile ) If ( CacheDir_saved ne "" ) Call( "RestoreCacheReg" ) Message( "Registry value for IE cache has been restored." ) Exit EndIf EndIf #クリップボード上の文字列で、閲覧htmlページURLを生成 c_str = ClipText() #文字列中の改行/スペースを除去 CallScriptFunction( MatchRep, c_str, c_str, "s/^CR^|^LF^| //g" ) If( Find( c_str, "http://" ) = 1 && ( Find( c_str, "youtube.com/watch?" ))) video_id = Part( c_str, "v=", 2 ) video_id = Part( video_id, "&", 1 ) # host = SubStr( c_str, Length( "http://" ) + 1 ) # host = Part( host, "/", 1 ) # host = Replace( host, "m.", "jp." ) Else # host = "jp.youtube.com" video_id = c_str EndIf host = "www.youtube.com" ############################################## #ビデオIDは必ず11文字のはずなので #"... youtube video id's to be exactly 11 characters as confirmed by youtube.com's Brent Hurley" #( http://lists.drupal.org/pipermail/drupal-cvs/2005-September/008975.html ) If( Length( video_id ) <> 11 ) Message( "Clipboad text is invalid.^NL^^NL^" & video_id & ": " & Length( video_id ), "Error!" ) Exit EndIf #保存ディレクトリがなければ作る If( DirExists( destDir ) = 0 ) MkDir( destDir ) EndIf If ( change_cache ) #IEキャッシュの保存場所 一時変更プロセス1 #オリジナルのキャッシュフォルダパスを保存 CacheDir_saved = RegRead( "HKCU", "Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", "Cache" ) #フリーズなどした時の為にdatファイルに記録 WriteFile( datFile, CacheDir_saved, 0 ) #.flvファイル保存と同じフォルダに変更 RegWriteString( "HKCU", "Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", "Cache", destDir ) EndIf url = "http://" & host & "/watch?v=" & video_id StatusInfo( SystemPath( "ScriptName" ), "Transmission log" ) StatusHistorySize( 100 ) Call( "ReadGT", url ) ############## If( Find( args["status"], "303 See Other" )) host = SubStr( args["Location"], Length( "http://" ) + 1 ) host = Part( host, "/", 1 ) url = "http://" & host & "/watch?v=" & video_id Call( "ReadGT", url ) EndIf If ( args["title"] eq "" ) Message( "The video is not available.", errorTitle ) Call( "RestoreCacheReg" ) Exit EndIf title = args["title"] v_query = args["v_query"] #ダウンロード用URLの取得 gv_url = "http://" & host & "/get_video?" & v_query Call( "ReadGT", gv_url ) flv_url = args["Location"] #flvファイル名生成 CallScriptFunction( MatchRep, flv_nam, SubStr( title, 1, title_length ), "s/ | /_/g" ) flv_nam = flv_nam & "_" & video_id HideWaitCursor WriteStatusHistory( logFile ) #動画ダウンロード開始確認ダイアログ Choice( SystemPath( "ScriptName" ), "Start downloading """ & title & """ as...", ".m3u streaming.", ".flv file.", ".flv file after renaming." ) Case( 0 ) If ( change_cache ) Call( "RestoreCacheReg" ) EndIf Exit #ストリーミング用.m3uファイルを生成 Case( 1 ) Call( "makeM3u" ) If ( change_cache ) Call( "RestoreCacheReg" ) EndIf #.flvファイルをダウンロード Case( 2 ) Call( "dlFlv" ) #リネーム処理 Case( 3 ) flv_nam_saved = flv_nam rf_msg = "Rename before the extension (.flv)." rf_title = SystemPath( "ScriptName" ) Call( "RenameFile" ) Call( "dlFlv" ) EndChoice #m3u ストリーミング再生サブルーチン##################### Sub makeM3u m3uStr = "#EXTM3U:-1," & title & "^NL^^NL^" & flv_url #m3uファイル作成 theM3uFile = destDir \ flv_nam & ".m3u" WriteFile( theM3uFile, m3uStr, 0 ) #関連づけされたアプリで再生 Run( theM3uFile ) EndSub #flvファイルダウンロードサブルーチン############## Sub dlFlv If ( change_cache ) #IEキャッシュの保存場所 一時変更プロセス1 #オリジナルのキャッシュフォルダパスを保存 CacheDir_saved = RegRead( "HKCU", "Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", "Cache" ) #フリーズなどした時の為にdatファイルに記録 WriteFile( datFile, CacheDir_saved, 0 ) #.flvファイル保存と同じフォルダに変更 RegWriteString( "HKCU", "Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", "Cache", destDir ) EndIf #動画ダウンロード theFlvFile = destDir \ flv_nam & ".flv" #なぜかバックグラウンドに隠れてしまうDownloadウィンドウを前面に出す Run( SystemPath( "ScriptExe" ) \ "MortScript.exe", """" & WinAct & """ winTitle=""Download"" sec=20" ) Download( flv_url, theFlvFile ) If ( change_cache ) #キャッシュの保存場所をオリジナルに戻す Call( "RestoreCacheReg" ) #キャッシュファイル消去###### ForEach folder in directories ( destDir \ "Content.IE5\*" ) Delete( folder \ "get_video*" ) EndForEach Else CacheDir = RegRead( "HKCU", "Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", "Cache" ) \ "Content.IE5" If ( DirExists( CacheDir )) ForEach folder in directories ( CacheDir \ "*" ) Delete( folder \ "get_video*" ) EndForEach Else Message( "There is no cache directory '" & CacheDir & "'.", "Error!" ) EndIf EndIf #関連づけされたアプリで再生 If ( FileExists( theFlvFile )) Run( theFlvFile ) EndIf EndSub #ゲートウェイサーバ接続&読み込みサブルーチン################ Sub ReadGT Local( url ) url = argv[1] # url = "http://youtube.com/watch?v=" & video_id StatusMessage( "Sending """ & url & """ to GT server.", ST_LIST, 0 ) ShowWaitCursor #ゲートウェイ経由で必要な引数を獲得 #IniRead(url)にするとサーバの負荷も時間もかかるので #一度に読み込む ErrorLevel( "off" ) If ( ReadFile( gtUrl & "?" & url ) ne "" ) x = ReadFile( gtUrl & "?" & url ) EndIf ErrorLevel( "error" ) If ( x eq "" ) Message( "YouTube_Headers Gateway is temporarily unavailable.", errorTitle ) If ( change_cache ) Call( "RestoreCacheReg" ) EndIf Exit EndIf WriteFile( tempDat, x, 0 ) error_msg = IniRead( tempDat, "error", "error_msg" ) If( error_msg ne "" ) Message( error_msg, "Error - YouTube_Headers Gateway" ) If ( change_cache ) Call( "RestoreCacheReg" ) EndIf Exit EndIf ForEach key, value in iniKeys ( tempDat, "default" ) args[key] = value StatusMessage( "[" & key & "] : " & value ) EndForEach EndSub #リネーム処理サブルーチン########################### Sub RenameFile #Enterキー(アクションキー)が押された場合、これを入れないと、 #次の入力ダイアログに「OK」が飛ばされてしまうので SleepMessage( 1, "Entering rename-process.^NL^ Wait a second.", rf_title, 0 ) flv_nam = Input( rf_msg, rf_title, 0, 0, flv_nam_saved ) #入力ファイル名が空白の場合 If ( flv_nam eq "" ) Switch ( Question( "Input string is empty!^NL^Retry or Cancel.", "Error!!", "RetryCancel" ) Case( 1 ) rf_msg = "Rename before the extension (.flv)." rf_title = SystemPath( "ScriptName" ) Call( "RenameFile" ) Case( 2 ) If ( change_cache ) Call( "RestoreCacheReg" ) EndIf Exit EndSwitch Else #もし使用不可文字が含まれていたら CallScriptFunction( MatchRep, mr_Out, flv_nam, "m!*|?|<|>|\|\\|:|/|""| !" ) If ( mr_Out ) rf_msg = "'" & flv_nam & "' contains invalid character(s)!" rf_title = "Error!!" Call( "RenameFile" ) EndIf EndIf EndSub #IEキャッシュの保存場所をオリジナルに戻すサブルーチン############## Sub RestoreCacheReg #レジストリ値をオリジナルに戻す RegWriteString( "HKCU", "Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", "Cache", CacheDir_saved ) If ( RegRead( "HKCU", "Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", "Cache" ) eq CacheDir_saved ) #datファイルの内容消去 WriteFile( datFile, "", 0 ) EndIf EndSub #flvダウンロード再選択サブルーチン############### Sub redoChoice Choice( SystemPath( "ScriptName" ), "Start downloading """ & title & """ as...", ".flv file.", ".flv file after renaming." ) Case( 0 ) If ( change_cache ) Call( "RestoreCacheReg" ) EndIf Exit #.flvファイルをダウンロード Case( 1 ) Call( "dlFlv" ) #リネーム処理 Case( 2 ) flv_nam_saved = flv_nam rf_msg = "Rename before the extension (.flv)." rf_title = SystemPath( "ScriptName" ) Call( "RenameFile" ) Call( "dlFlv" ) EndChoice EndSub