• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
Keine Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#objective-cqtwindows誰得cocoapythonphprubygameguibathyscaphec翻訳omegat計画中(planning stage)frameworktwittertestdomvb.netdirectxbtronarduinopreviewerゲームエンジン

Commit MetaInfo

Revision098039efa5fbb166abc86005da266bb5dc13bba6 (tree)
Zeit2014-04-06 17:30:27
Autorjakago <jakago777@gmai...>
Commiterjakago

Log Message

2014年度版対応中

Ändern Zusammenfassung

Diff

--- a/CaptureStream.rb
+++ b/CaptureStream.rb
@@ -1,13 +1,12 @@
1-#!/usr/bin/env ruby -Ku
2-$KCODE = 'UTF8'
1+#!/usr/bin/env ruby
2+# encoding: UTF-8
33
44 require 'open-uri'
55 require 'rexml/document'
66 require 'kconv'
77 require 'nkf'
88 require 'date'
9-require 'jcode'
10-require "tempfile"
9+require 'tempfile'
1110 require 'fileutils'
1211
1312 =begin
@@ -17,6 +16,8 @@ require 'fileutils'
1716 善意を持って作成しておりますが、すべて使用される方の自己責任でお願いいたします。
1817
1918 ====================【更新履歴】====================
19+2014/04/06 Rubyの対応バージョンを2.0.0以降に変更。2014/03/31の仕様変更に対応。
20+ 「ニュースで英会話」と「ABCニュースシャワー」を削除。
2021 2013/04/10 flvstreamerのダウンロード場所を更新。ffmpegのダウンロードに関する記述を追加。
2122 2013/04/09 「英語で読む村上春樹」対応。
2223 2013/04/08 2013年度対応版。
@@ -41,7 +42,7 @@ require 'fileutils'
4142 2011/04/13 「ABCニュースシャワー」に対応。スクランブル文字列をウィキから自動取得するように修正。
4243        翌週公開分のダウンロードをコメントアウト。
4344 2011/04/05 ストリーミングのURLに追加された文字列への緊急対応。
44-2010/05/12 ゴールデンウィーク対応。flvファイル名に追加される"mm"と"vip"に対応。
45+2010/05/12 ゴールデンウィーク対応。flvファイル名に追加される'mm'と'vip'に対応。
4546 2010/04/22 「ニュースで英会話」に対応。指定可能な引数にallを追加。
4647 2010/04/21 「リトル・チャロ2」に対応。ffmpegへの依存をなくし、独自にflvからmp3を抽出。
4748 2010/04/20 実践ビジネス英語の10-ebj-4231-295vip.flvの形式に対応。複数講座ダウンロード対応。
@@ -56,8 +57,8 @@ require 'fileutils'
5657        バム名のデフォルトを「YYYY_MM_DD」に変更。
5758
5859 ====================【 準備 】====================
59-このスクリプトを実行するためにはRubyとflvstreamerが必要です。flvstreamerはパスの通ったフォ
60-ルダに存在する必要があります。
60+このスクリプトを実行するためにはRubyとffmpegが必要です。ffmpegはパスの通ったフォルダに存在
61+する必要があります。
6162
6263 以下のURLまたは適当な場所からダウンロードするか、ご自分でビルド/インストールしてください。
6364 以下のURLはあくまで参考のために載せているだけで、リンク先のバイナリの内容については責任を持
@@ -65,42 +66,38 @@ require 'fileutils'
6566
6667 【Windows環境】
6768 ・Ruby
68- 下記のRubyInstaller for Windowsのサイトから1.8.7の最新版をインストールしてください。
69- http://rubyinstaller.org/downloads/
70- このドキュメントを記述している時の最新版のリンクです(動作確認したバージョンです)。
71- http://rubyforge.org/frs/download.php/74293/rubyinstaller-1.8.7-p334.exe
72-・flvstreamer
73- http://download-mirror.savannah.gnu.org/releases/flvstreamer/win32/flvstreamer_win32_latest.exe
74- 上記のファイルをブラウザでダウンロードした後、ファイル名をflvstreamer.exeに変更し、
75- パスの通っているフォルダに置いてください。Windowsの場合は、CaptureStream.rbと同じフォ
76- ルダでもOKです。
69+ 下記のRubyInstaller for Windowsのサイトから2.0.0以降の最新版をインストールしてください。
70+ http://rubyinstaller.org/downloads/
71+ このドキュメントを記述している時の最新版のリンクです。
72+ http://dl.bintray.com/oneclick/rubyinstaller/rubyinstaller-2.0.0-p451.exe?direct
7773 ・ffmpeg
7874 http://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-latest-win32-static.7z
7975 上記のファイルをブラウザでダウンロードして解凍した後、ファイル名をffmpeg.exeに変更し、
8076 パスの通っているフォルダに置いてください。Windowsの場合は、CaptureStream.rbと同じフォ
8177 ルダでもOKです。
78+ 拡張子の7z(7-Zip)については以下のurlを参照してください。
79+ http://www.7-zip.org/ 英語
80+ http://sevenzip.sourceforge.jp/ 日本語
8281
8382 【Macintosh環境】
8483 ・Ruby
85- 標準でインストールされています。
86-・flvstreamer
87- http://download-mirror.savannah.gnu.org/releases/flvstreamer/macosx/flvstreamer_macosx_unified_binary_latest
88- 上記のファイルをブラウザでダウンロードした後、ファイル名をflvstreamerに変更し、ターミ
89- ナルで実行属性を付け、パスの通ったディレクトリに置いてください。
84+ 標準でインストールRubyのバージョンが1.8.7の場合、自分で2.0.0以降をインストールする必要
85+ があります。パッケージ管理システムのHomebrewでrbenvとruby-buildをインストールし、rbenv
86+ でrubyをインストールするのがお勧めです。
87+ 以下のurlが参考になります。10.8以下のシステムでも手順はそのままで大丈夫でしょう。
88+ Mac OS X 10.9にrbenvを使って複数バージョンのRubyをインストールする - Qiita
89+ http://qiita.com/ryam/items/33803f9a442399b60232
9090 ・ffmpeg
91- http://www.evermeet.cx/ffmpeg/ffmpeg-1.2.7z
92- 上記のファイルをブラウザでダウンロードして解凍した後、ファイル名をffmpegに変更し、ターミ
93- ナルで実行属性を付け、パスの通ったディレクトリに置いてください。このバイナリはx86_64なので、
94- i386またはppcバイナリが必要な場合はソースコードからビルドするか、パッケージマネージャ(Homebrew、
95- MacPorts、Fink)でインストールしてください。
91+ http://www.evermeet.cx/ffmpeg/ffmpeg-2.2.7z
92+ 上記のファイルをブラウザでダウンロードして解凍した後、ファイル名をffmpegに変更し、ター
93+ ミナルで実行属性を付け、パスの通ったディレクトリに置いてください。このバイナリはx86_64
94+ のため、i386またはppcバイナリが必要な場合はソースコードからビルドするか、パッケージマ
95+ ネージャ(Homebrew、MacPorts、Fink)でインストールしてください。CaptureStreamの最新版
96+ に含まれているものを利用することも可能です。
9697
9798 【Linux環境】
9899 ・Ruby
99- パッケージでインストール可能だと思います。
100-・flvstreamer
101- http://download-mirror.savannah.gnu.org/releases/flvstreamer/linux/
102- 上記の場所からご自分のシステムに最適なものをダウンロードしてパスの通ったディレクトリに置くか、
103- パッケージマネージャを使用してインストールしてください。
100+ パッケージでrbenvをインストールし、rbenvでrubyをインストールするのがお勧めです。
104101 ・ffmpeg
105102 http://ffmpeg.org/download.html
106103 上記のページの「FFmpeg Linux Builds」セクションからリンクをたどって最適なものをダウンロード
@@ -118,14 +115,14 @@ require 'fileutils'
118115
119116 講座名のところには以下のものが複数指定可能です。allを指定するとすべての講座をダウンロードします。
120117
121-
122-basic1 basic2 basic3 timetrial kaiwa business1 business2 chinese french italian
123-hangeul german spanish russian levelup-chinese levelup-hangeul enews shower all
118+basic1 basic2 basic3 timetrial kaiwa business1 business2 kouryaku yomu
119+chinese levelup_chinese french italian hangeul levelup_hangeul german spanish russian
120+all
124121
125122 $default_target(配列)に指定しておくことで引数指定なしでダウンロードさせることができます。
126123 入門ビジネス英語と実践ビジネス英語を指定するには以下のように設定します。
127124
128- $default_target = ["business1", "business2"]
125+ $default_target = ['business1', 'business2']
129126
130127 =end
131128
@@ -134,9 +131,8 @@ $default_target(配列)に指定しておくことで引数指定なしで
134131 #--------------------------------------------------------------------------------
135132
136133 $default_target = []
137-$english = ["basic1", "basic2", "basic3", "timetrial", "kaiwa", "business1", "business2", "kouryaku", "yomu"]
138-$multilingual = ["chinese", "french", "italian", "hangeul", "german", "spanish", "russian", "levelup-chinese", "levelup-hangeul"]
139-$extra = ["enews", "shower", "enews-all"]
134+$english = %w!basic1 basic2 basic3 timetrial kaiwa business1 business2 kouryaku yomu!
135+$multilingual = %w!chinese levelup_chinese french italian hangeul levelup_hangeul german spanish russian!
140136
141137 #--------------------------------------------------------------------------------
142138 # 実行環境の検出とツールのパス設定
@@ -144,15 +140,13 @@ $extra = ["enews", "shower", "enews-all"]
144140
145141 $is_windows = RUBY_PLATFORM.downcase =~ /mswin(?!ce)|mingw|cygwin|bccwin/
146142 $script_path = File.expand_path( __FILE__ )
147-# -m 0はv1.5からのオプションでタイムアウトしない設定
148-$flvstreamer = "flvstreamer -m 0"
149-$ffmpeg = "ffmpeg"
143+$ffmpeg = 'ffmpeg'
150144
151145 if $is_windows
152146 $script_path = $script_path.kconv( Kconv::UTF8, Kconv::SJIS )
153- $null = "nul"
147+ $null = 'nul'
154148 else
155- $null = "/dev/null"
149+ $null = '/dev/null'
156150 end
157151
158152 #--------------------------------------------------------------------------------
@@ -168,48 +162,12 @@ def jputs( string )
168162 end
169163
170164 #--------------------------------------------------------------------------------
171-# 2011年度のストリーミングのURLに追加されたダウンロード妨害用文字列対応
172-# 優先順位は、マニュアル設定→ウィキから日付指定で取得→gnashでの自動検出
173-# 何らかの問題でウィキからスクランブル文字列が取得できない場合には自分で設定してください
174-#--------------------------------------------------------------------------------
175-
176-jputs( "語学講座ダウンローダ (2013/04/09)" )
177-
178-$scramble = ""
179-
180-# ウィキから日付を指定してスクランブル文字列を取得する
181-if $scramble == ""
182- now = DateTime.now
183- offset = 1 - now.cwday #直前の月曜までのオフセット
184- if offset == 0 && now.hour <= 9 #月曜日で10時より前なら1週間前の月曜日に
185- offset = -7
186- end
187- monday = Date.today + offset
188-
189- xml_uri = "http://cdn47.atwikiimg.com/jakago/pub/scramble.xml"
190- open( xml_uri ) { |f|
191- doc = REXML::Document.new( f )
192- $scramble = doc.elements["flv/scramble[@date=\"#{monday.strftime( '%Y%m%d' )}\"]/@code"].to_s
193- }
194- if $scramble != ""
195- jputs( "wikiから取得したコード:#$scramble" )
196- else
197- jputs( "wikiから取得したコード: 取得に失敗したか、まだwikiのxmlが更新されていません。" )
198- end
199-end
200-
201-if $scramble == ""
202- jputs( "スクランブル文字列が取得できません。" )
203- exit
204-end
205-
206-#--------------------------------------------------------------------------------
207165 # flvファイルのサーバとオプション
208166 #--------------------------------------------------------------------------------
209167
210-$flv_host = "flv.nhk.or.jp"
211-$flv_app = "ondemand/"
212-$flv_service_prefix = "mp4:flv/gogaku/streaming/mp4/#{$scramble}/"
168+$flv_host = 'flv.nhk.or.jp'
169+$flv_app = 'ondemand/'
170+$flv_service_prefix = 'mp4:flv/gogaku/streaming/mp4'
213171
214172 #--------------------------------------------------------------------------------
215173 # 出力フォルダ名とmp3ファイル名の設定
@@ -228,25 +186,21 @@ $flv_service_prefix = "mp4:flv/gogaku/streaming/mp4/#{$scramble}/"
228186 # %D 2桁の放送日(01~31)
229187 # %d 放送日(1~31)
230188 # 上記以外の文字に%がついていた場合はその文字そのものとみなします。それ以外の文字はもちろんそのままです。
231-# フォルダ名の例: "%r%p英語%y%M" -> (このスクリプトがあるフォルダ内の)英語0905
232-# ファイル名の例: "DE%Y%M%D.mp3" -> DE20090420.mp3
189+# フォルダ名の例: '%r%p英語%y%M' -> (このスクリプトがあるフォルダ内の)英語0905
190+# ファイル名の例: 'DE%Y%M%D.mp3' -> DE20090420.mp3
233191 #--------------------------------------------------------------------------------
234192
235193 # 保存フォルダ名
236-$out_folder_hash = {"basic1"=>"%r%p%k", "basic2"=>"%r%p%k", "basic3"=>"%r%p%k", "timetrial"=>"%r%p%k", "kaiwa"=>"%r%p%k", "business1"=>"%r%p%k", "business2"=>"%r%p%k", "kouryaku"=>"%r%p%k", "chinese"=>"%r%p%k", "french"=>"%r%p%k", "italian"=>"%r%p%k", "hangeul"=>"%r%p%k", "german"=>"%r%p%k", "spanish"=>"%r%p%k", "russian"=>"%r%p%k", "levelup-chinese"=>"%r%p%k", "levelup-hangeul"=>"%r%p%k", "enews"=>"%r%p%k", "shower"=>"%r%p%k", "yomu"=>"%r%p%k"
237-}
194+$out_folder_hash = Hash.new( '%r%p%k' )
238195
239196 # 保存ファイル名
240-$out_file_hash = {"basic1"=>"%k_%Y_%M_%D.mp3", "basic2"=>"%k_%Y_%M_%D.mp3", "basic3"=>"%k_%Y_%M_%D.mp3", "timetrial"=>"%k_%Y_%M_%D.mp3", "kaiwa"=>"%k_%Y_%M_%D.mp3", "business1"=>"%k_%Y_%M_%D.mp3", "business2"=>"%k_%Y_%M_%D.mp3", "kouryaku"=>"%k_%Y_%M_%D.mp3", "chinese"=>"%k_%Y_%M_%D.mp3", "french"=>"%k_%Y_%M_%D.mp3", "italian"=>"%k_%Y_%M_%D.mp3", "hangeul"=>"%k_%Y_%M_%D.mp3", "german"=>"%k_%Y_%M_%D.mp3", "spanish"=>"%k_%Y_%M_%D.mp3", "russian"=>"%k_%Y_%M_%D.mp3", "levelup-chinese"=>"%k_%Y_%M_%D.mp3", "levelup-hangeul"=>"%k_%Y_%M_%D.mp3", "enews"=>"%k_%Y_%M_%D.mp3", "shower"=>"%k_%Y_%M_%D.mp3", "yomu"=>"%k_%Y_%M_%D.mp3"
241-}
197+$out_file_hash = Hash.new( '%k_%Y_%M_%D' )
242198
243199 # id3タグのalbum
244-$id3_album = {"basic1"=>"%k", "basic2"=>"%k", "basic3"=>"%k", "timetrial"=>"%k", "kaiwa"=>"%k", "business1"=>"%k", "business2"=>"%k", "kouryaku"=>"%k", "chinese"=>"%k", "french"=>"%k", "italian"=>"%k", "hangeul"=>"%k", "german"=>"%k", "spanish"=>"%k", "russian"=>"%k", "levelup-chinese"=>"%k", "levelup-hangeul"=>"%k", "enews"=>"%k", "shower"=>"%k", "yomu"=>"%k"
245-}
200+$id3_album = Hash.new( '%k' )
246201
247202 # id3タグのtitle
248-$id3_title = {"basic1"=>"%k_%Y_%M_%D", "basic2"=>"%k_%Y_%M_%D", "basic3"=>"%k_%Y_%M_%D", "timetrial"=>"%k_%Y_%M_%D", "kaiwa"=>"%k_%Y_%M_%D", "business1"=>"%k_%Y_%M_%D", "business2"=>"%k_%Y_%M_%D", "kouryaku"=>"%k_%Y_%M_%D", "chinese"=>"%k_%Y_%M_%D", "french"=>"%k_%Y_%M_%D", "italian"=>"%k_%Y_%M_%D", "hangeul"=>"%k_%Y_%M_%D", "german"=>"%k_%Y_%M_%D", "spanish"=>"%k_%Y_%M_%D", "russian"=>"%k_%Y_%M_%D", "levelup-chinese"=>"%k_%Y_%M_%D", "levelup-hangeul"=>"%k_%Y_%M_%D", "enews"=>"%k_%Y_%M_%D", "shower"=>"%k_%Y_%M_%D", "yomu"=>"%k_%Y_%M_%D"
249-}
203+$id3_title = Hash.new( '%k_%Y_%M_%D' )
250204
251205 #--------------------------------------------------------------------------------
252206 # 出力ファルが存在する場合にダウンロードをスキップする場合はtrueを、しない場合はfalseを設定
@@ -255,11 +209,29 @@ $id3_title = {"basic1"=>"%k_%Y_%M_%D", "basic2"=>"%k_%Y_%M_%D", "basic3"=>"%k_%Y
255209 $skip_existing = true
256210
257211 #--------------------------------------------------------------------------------
258-# 音声ファイルの変換後の拡張子を設定(flvを指定するとダウンロードしたファイルそのもの)
259-# 3g2, 3gp, aac, avi, flv, m2ts, m4a, mka, mkv, mov, mp3, mp4
212+# 音声ファイルの変換後の拡張子を設定(aacを指定するとダウンロードしたファイルそのもの)
213+# 3g2, 3gp, aac, avi, m4a, mka, mkv, mov, mp3, ts
260214 #--------------------------------------------------------------------------------
261215
262-$audio_extension = "aac"
216+$audio_extension = 'aac'
217+
218+#--------------------------------------------------------------------------------
219+# 音声ファイルの拡張子に対応したffmpegの実行コマンド
220+# 3g2, 3gp, aac, avi, m4a, mka, mkv, mov, mp3, ts
221+#--------------------------------------------------------------------------------
222+$akamai = 'https://nhk-vh.akamaihd.net/i/gogaku-stream/mp4/'
223+$ffmpegHash = {
224+ :'3g2' => "\"%s\" -y -i #{$akamai}%s/master.m3u8 -vn -acodec copy \"%s\" -bsf aac_adtstoasc",
225+ :'3gp' => "\"%s\" -y -i #{$akamai}%s/master.m3u8 -vn -acodec copy \"%s\" -bsf aac_adtstoasc",
226+ aac: "\"%s\" -y -i #{$akamai}%s/master.m3u8 -vn -acodec copy \"%s\"",
227+ avi: "\"%s\" -y -i #{$akamai}%s/master.m3u8 -vn -acodec copy \"%s\" -id3v2_version 3 -metadata title=\"%s\" -metadata artist=\"NHK\" -metadata album=\"%s\" -metadata date=\"%s\" -metadata genre=\"Speech\"",
228+ m4a: "\"%s\" -y -i #{$akamai}%s/master.m3u8 -vn -acodec copy \"%s\" -bsf aac_adtstoasc -id3v2_version 3 -metadata title=\"%s\" -metadata artist=\"NHK\" -metadata album=\"%s\" -metadata date=\"%s\" -metadata genre=\"Speech\"",
229+ mka: "\"%s\" -y -i #{$akamai}%s/master.m3u8 -vn -acodec copy \"%s\" -id3v2_version 3 -metadata title=\"%s\" -metadata artist=\"NHK\" -metadata album=\"%s\" -metadata date=\"%s\" -metadata genre=\"Speech\"",
230+ mkv: "\"%s\" -y -i #{$akamai}%s/master.m3u8 -vn -acodec copy \"%s\" -id3v2_version 3 -metadata title=\"%s\" -metadata artist=\"NHK\" -metadata album=\"%s\" -metadata date=\"%s\" -metadata genre=\"Speech\"",
231+ mov: "\"%s\" -y -i #{$akamai}%s/master.m3u8 -vn -acodec copy \"%s\" -bsf aac_adtstoasc -id3v2_version 3 -metadata title=\"%s\" -metadata artist=\"NHK\" -metadata album=\"%s\" -metadata date=\"%s\" -metadata genre=\"Speech\"",
232+ mp3: "\"%s\" -y -i #{$akamai}%s/master.m3u8 -vn -acodec libmp3lame \"%s\" -id3v2_version 3 -metadata title=\"%s\" -metadata artist=\"NHK\" -metadata album=\"%s\" -metadata date=\"%s\" -metadata genre=\"Speech\"",
233+ ts: "\"%s\" -y -i #{$akamai}%s/master.m3u8 -vn -acodec copy \"%s\""
234+}
263235
264236 #--------------------------------------------------------------------------------
265237 # 出力フォルダ名とmp3ファイル名のフォーマット文字列の解釈
@@ -268,7 +240,7 @@ $audio_extension = "aac"
268240 # 引数はxmlのhdateとfileアトリビュート
269241 def make_date( hdate, file )
270242 hdate =~ /^(\d+)\D+(\d+)/
271- raise "XMLに含まれている放送日の形式が違います。" if !$1 || $1.length < 1 || $1.length > 2 || !$2 || $2.length < 1 || $2.length > 2
243+ raise 'XMLに含まれている放送日の形式が違います。' if !$1 || $1.length < 1 || $1.length > 2 || !$2 || $2.length < 1 || $2.length > 2
272244 month = $1
273245 day = $2
274246
@@ -281,60 +253,54 @@ def format_name( format, target, kouza, hdate, file )
281253 result = String.new()
282254
283255 hdate =~ /^(\d+)\D+(\d+)/
284- raise "XMLに含まれている放送日の形式が違います。" if !$1 || $1.length < 1 || $1.length > 2 || !$2 || $2.length < 1 || $2.length > 2
256+ raise 'XMLに含まれている放送日の形式が違います。' if !$1 || $1.length < 1 || $1.length > 2 || !$2 || $2.length < 1 || $2.length > 2
285257 month = $1
286258 day = $2
287259
288- if target == "enews"
289- year = 2000 + file[2,2].to_i
290- elsif target == "shower"
291- year = 2000 + file[3,2].to_i
292- else
293- year = 2000 + file[0,2].to_i
294- end
260+ year = 2000 + file[0,2].to_i
295261 year += 1 if month =~ /^[123]$/ && Date.today.year > year
296- file = File.basename( file ) # ニュースで英会話が"201004/23_Fri/el/video/20100423_PULITZER"の形式のため
262+ file = File.basename( file ) # ニュースで英会話が'201004/23_Fri/el/video/20100423_PULITZER'の形式のため
297263
298- chars = format.each_char
264+ chars = format.each_char.to_a
299265 percent = false
300266 i = 0
301- while i < chars.length
267+ while i < chars.size
302268 if percent
303269 percent = false
304270 case chars[i]
305- when "k"
271+ when 'k'
306272 result << kouza
307- when "h"
273+ when 'h'
308274 result << hdate
309- when "f"
275+ when 'f'
310276 if file =~ /(.*)\.flv$/
311277 result << $1
312278 else
313279 result << file
314280 end
315- when "r"
281+ when 'r'
316282 result << File.dirname( $script_path )
317- when "p"
283+ when 'p'
318284 result << File::Separator
319- when "Y"
285+ when 'Y'
320286 result << year.to_s
321- when "y"
287+ when 'y'
322288 result << (year % 100).to_s
323- when "M"
324- result << "0" if month.length < 2
289+ when 'M'
290+ result << '0' if month.length < 2
325291 result << month
326- when "m"
292+ when 'm'
327293 result << month
328- when "D"
329- result << "0" if day.length < 2
294+ when 'D'
295+ result << '0' if day.length < 2
330296 result << day
331- when "d"
297+ when 'd'
332298 result = day
333299 else
334300 result << chars[i]
335301 end
336302 else
337- if chars[i] == "%"
303+ if chars[i] == '%'
338304 percent = true
339305 else
340306 result << chars[i]
@@ -393,7 +359,7 @@ def ascii_frame( identifier, string )
393359 result = String.new()
394360
395361 if identifier.size == 3 && string.size > 0
396- frame_data = NKF.nkf( "-l -W", string )
362+ frame_data = NKF.nkf( '-l -W', string )
397363 if frame_data.size > 0
398364 frame_data = ascii_mark + frame_data + "\x00"
399365 result << identifier
@@ -413,7 +379,7 @@ def unicode_frame( identifier, string )
413379 result = String.new()
414380
415381 if identifier.size == 3 && string.size > 0
416- frame_data = NKF.nkf( "-w16L -W", string )
382+ frame_data = NKF.nkf( '-w16L -W', string )
417383 if frame_data.size > 0
418384 frame_data = unicode_mark + frame_data + "\x00\x00"
419385 result << identifier
@@ -431,11 +397,11 @@ def create_tag( album, title, year, artist )
431397 tag_bytes = String.new()
432398 frames = String.new()
433399
434- frames << unicode_frame( "TAL", album );
435- frames << unicode_frame( "TT2", title );
436- frames << ascii_frame( "TYE", year );
437- frames << unicode_frame( "TP1", artist );
438- frames << ascii_frame( "TCO", "(101)" );
400+ frames << unicode_frame( 'TAL', album );
401+ frames << unicode_frame( 'TT2', title );
402+ frames << ascii_frame( 'TYE', year );
403+ frames << unicode_frame( 'TP1', artist );
404+ frames << ascii_frame( 'TCO', '(101)' );
439405
440406 if frames.size > 0
441407 tag_bytes << "ID3\x02\x00\x00"
@@ -458,13 +424,13 @@ def tag_size( buffer )
458424 #offset_flags = 5
459425 offset_size = 6
460426 offset_data = 10
461- identifier = "ID3"
427+ identifier = 'ID3'
462428
463429 result = 0
464430
465431 if buffer.size > offset_data && buffer[0,3] == identifier
466432 # ID3v2.2.0 と ID3v2.3.0、ID3v2.4.0 のみサポート
467- if buffer[offset_version] >= "2"[0] && buffer[offset_version] <= "4"[0] && buffer[offset_version + 1] == "0"[0]
433+ if buffer[offset_version] >= '2'[0] && buffer[offset_version] <= '4'[0] && buffer[offset_version + 1] == '0'[0]
468434 result = decode_size( buffer[offset_size,4] ) + offset_data
469435 end
470436 end
@@ -485,20 +451,20 @@ def id3tag( full_path, album, title, year ) # full_pathはto_nativeで変換さ
485451 original_file_moved = false
486452
487453 begin
488- tag_bytes = create_tag( album, title, year, "NHK" )
489- raise "書き込むべきタグが見当たらないため、タグの書き込みを中止します。" if tag_bytes.size <= 0
454+ tag_bytes = create_tag( album, title, year, 'NHK' )
455+ raise '書き込むべきタグが見当たらないため、タグの書き込みを中止します。' if tag_bytes.size <= 0
490456 temp_name = make_temp_name( full_path )
491- raise "作業用ファイル名が作成できないため、タグの書き込みを中止します。" if temp_name.size <= 0
457+ raise '作業用ファイル名が作成できないため、タグの書き込みを中止します。' if temp_name.size <= 0
492458 FileUtils.move( full_path, temp_name )
493459 original_file_moved = true
494- src_file = File.open( temp_name, "r" )
460+ src_file = File.open( temp_name, 'r' )
495461 src_file.binmode
496- dst_file = File.open( full_path, "w" )
462+ dst_file = File.open( full_path, 'w' )
497463 dst_file.binmode
498- raise "作業用ファイルへの書き込みに失敗しました。" if dst_file.write( tag_bytes ) != tag_bytes.size
464+ raise '作業用ファイルへの書き込みに失敗しました。' if dst_file.write( tag_bytes ) != tag_bytes.size
499465 buffer = src_file.read
500466 skip = tag_size( buffer )
501- raise "作業用ファイルへの書き込みに失敗しました。" if dst_file.write( buffer[skip..-1] ) != buffer.size - skip
467+ raise '作業用ファイルへの書き込みに失敗しました。' if dst_file.write( buffer[skip..-1] ) != buffer.size - skip
502468 dst_file.close
503469 dst_file = nil
504470 src_file.close
@@ -527,7 +493,7 @@ def flv2mp3( flv_path, mp3_path ) # flv_pathとmp3_pathはto_nativeで変換さ
527493
528494 begin
529495 # Windowsのためにバイナリモードを指定しなければならない
530- port = open( flv_path, "rb" )
496+ port = open( flv_path, 'rb' )
531497 begin
532498 flv = port.read
533499 ensure
@@ -535,32 +501,32 @@ def flv2mp3( flv_path, mp3_path ) # flv_pathとmp3_pathはto_nativeで変換さ
535501 end
536502 header = FLV_HEADER.new( flv[0,3], flv[3], flv[4], flv[5, 4] )
537503
538- raise "flvファイルにヘッダが含まれていません。" if flv.length < FLV_HEADER_SIZE
539- raise "flvファイルではありません。" unless header.signature == "FLV"
540- raise "音声データが含まれていません。" if (header.flags & 4) == 0
541- raise "flvファイルが対応できる形式ではありません。" unless header.offset == "\x00\x00\x00#{FLV_HEADER_SIZE.chr}"
504+ raise 'flvファイルにヘッダが含まれていません。' if flv.length < FLV_HEADER_SIZE
505+ raise 'flvファイルではありません。' unless header.signature == 'FLV'
506+ raise '音声データが含まれていません。' if (header.flags & 4) == 0
507+ raise 'flvファイルが対応できる形式ではありません。' unless header.offset == "\x00\x00\x00#{FLV_HEADER_SIZE.chr}"
542508
543509 read_size = FLV_HEADER_SIZE
544510
545- open( mp3_path, "wb" ) { |mp3|
511+ open( mp3_path, 'wb' ) { |mp3|
546512 while true
547513 remaining = flv.length - read_size
548514 break if remaining == 4 # 最後のPreviousTagSize => 完了
549- raise "flvファイルの内容が不正です。" if remaining < FLV_TAG_SIZE
515+ raise 'flvファイルの内容が不正です。' if remaining < FLV_TAG_SIZE
550516 tag = FLV_TAG.new( flv[read_size, 4], flv[read_size + 4], flv[read_size + 5, 3], flv[read_size + 8, 3], flv[read_size + 11], flv[read_size + 12, 3] )
551517 read_size += FLV_TAG_SIZE
552518 body_length = (tag.bodyLength[0] << 16) + (tag.bodyLength[1] << 8) + tag.bodyLength[2];
553- raise "flvファイルの内容が不正です。" if remaining < body_length
519+ raise 'flvファイルの内容が不正です。' if remaining < body_length
554520 if tag.type == 8
555- raise "音声データがmp3ではありません。" if (flv[read_size] & 0x00f0) != 0x20
556- raise "mp3ファイルの書き込みに失敗しました。" if mp3.write( flv[read_size + 1, body_length - 1] ) != body_length - 1
521+ raise '音声データがmp3ではありません。' if (flv[read_size] & 0x00f0) != 0x20
522+ raise 'mp3ファイルの書き込みに失敗しました。' if mp3.write( flv[read_size + 1, body_length - 1] ) != body_length - 1
557523 end
558524 read_size += body_length
559525 end
560526 }
561527 result = true
562528 rescue
563- puts( to_native( $!.to_s + ":" ) + flv_path )
529+ puts( to_native( $!.to_s + ':' ) + flv_path )
564530 File.delete( mp3_path ) if File.exist?( mp3_path )
565531 end
566532
@@ -573,7 +539,7 @@ end
573539
574540 def capture_stream( target, kouza, hdate, file, retry_count )
575541 out_folder = format_name( $out_folder_hash[target], target, kouza, hdate, file ) # 出力フォルダ
576- out_file = format_name( $out_file_hash[target], target, kouza, hdate, file ) # 変換後の音声ファイル
542+ out_file = format_name( $out_file_hash[target], target, kouza, hdate, file ) # 音声ファイル(拡張子なし)
577543 id3_album = format_name( $id3_album[target], target, kouza, hdate, file )
578544 id3_title = format_name( $id3_title[target], target, kouza, hdate, file )
579545
@@ -583,18 +549,18 @@ def capture_stream( target, kouza, hdate, file, retry_count )
583549
584550 exit unless check_output_dir( out_folder )
585551 out_folder += File::Separator
552+ p out_file;exit
586553
587554 out_folder = to_native( out_folder )
588555 out_file = to_native( out_file )
589556 # 2012年度まではflvに含まれていた音声がmp3だったので、単純に抽出して拡張子をmp3としていたが、
590557 # 2013年度からはaacに変更されたたため、抽出した音声用のコンテナを指定できるようにした。
591558 # $audio_extensionにmp3を指定した場合は再エンコードされる。
592- out_file = File.basename( out_file, File.extname( out_file ) ) + "." + $audio_extension
593- flv_file = File.basename( out_file, File.extname( out_file ) ) + ".flv"
594- out_file = flv_file if target == "shower"
559+ out_file = File.basename( out_file, File.extname( out_file ) ) + '.' + $audio_extension
560+ flv_file = File.basename( out_file, File.extname( out_file ) ) + '.flv'
595561
596562 if $skip_existing && File.exists?( "#{out_folder}#{out_file}" )
597- print( "-" )
563+ print( '-' )
598564 return true
599565 end
600566
@@ -614,7 +580,7 @@ def capture_stream( target, kouza, hdate, file, retry_count )
614580
615581 if $? == 0
616582 if out_file != flv_file
617- if $audio_extension == "mp3"
583+ if $audio_extension == 'mp3'
618584 system( "#{$ffmpeg} -i \"#{out_folder}#{flv_file}\" -vn -acodec libmp3lame -ar 22050 -ac 1 -ab 48k -y \"#{out_folder}#{out_file}\" > #{$null} 2>&1" )
619585 else
620586 system( "#{$ffmpeg} -i \"#{out_folder}#{flv_file}\" -vn -acodec copy -y \"#{out_folder}#{out_file}\" > #{$null} 2>&1" )
@@ -624,16 +590,16 @@ def capture_stream( target, kouza, hdate, file, retry_count )
624590 exit
625591 end
626592 if $? == 0
627- if $audio_extension == "mp3"
628- id3tag( out_folder + out_file, id3_album, id3_title, "20" + file[0..1] )
593+ if $audio_extension == 'mp3'
594+ id3tag( out_folder + out_file, id3_album, id3_title, '20' + file[0..1] )
629595 end
630596 end
631597 File.unlink( out_folder + flv_file )
632598 end
633599 result = true
634- print( "O" )
600+ print( 'O' )
635601 else
636- print( "X" )
602+ print( 'X' )
637603 File.unlink( out_folder + flv_file )
638604 end
639605 end
@@ -642,150 +608,31 @@ def capture_stream( target, kouza, hdate, file, retry_count )
642608 end
643609
644610 #--------------------------------------------------------------------------------
645-# ニュースで英会話
646-#--------------------------------------------------------------------------------
647-
648-SEARCH_20100323 = 'http://www.google.co.jp/search?q=video_player_wide.swf+site:cgi2.nhk.or.jp&hl=ja&lr=lang_ja&num=100&filter=0&start='
649-SEARCH_20090330 = 'http://www.google.co.jp/search?q=video_player.swf+site:cgi2.nhk.or.jp&hl=ja&lr=lang_ja&num=100&filter=0&start='
650-REGEXP = %r|video_player(?:_wide)?\.swf\?type=real&(?:amp;)?m_name=([^"]*)|
651-ENEWS = 'http://cgi2.nhk.or.jp/e-news/news/index.cgi?ymd='
652-FLV_SERVICE_PREFIX_20090728 = 'e-news/data/'
653-FLV_SERVICE_PREFIX_20090330 = 'e-news-flv/'
654-
655-def get_enews_names( search, regexp )
656- result = Array.new
657- for j in (0..3) # 一度では取りこぼしがあるので
658- i = 0
659- temp = Array.new
660- while true
661- open( search + i.to_s ) { |file|
662- search_result = file.read
663- while regexp =~ search_result
664- temp << $1
665- search_result = $~.post_match
666- end
667- }
668- i += 100
669- break if temp.size < i
670- end
671- result += temp
672- end
673- return result.uniq
674-end
675-
676-# NHKのHPで現在公開中のファイル名を取得
677-def current_list
678- result = Array.new
679- today = Date.today
680- i = today - 7
681- while i <= today
682- if i.wday >= 1 && i.wday <= 5 # 月曜から金曜まで
683- open( "#{ENEWS}#{i.strftime( '%Y%m%d' )}" ) { |file|
684- result << $1 if REGEXP =~ file.read
685- }
686- end
687- i += 1
688- end
689- return result
690-end
691-
692-# NHKのHPで現在公開中のファイルをダウンロード
693-def download_enews
694- print( "enews: " )
695- flv_service_prefix = $flv_service_prefix
696- $flv_service_prefix = FLV_SERVICE_PREFIX_20090728
697-
698- current_list.each { |flv|
699- capture_stream( "enews", "ニュースで英会話", "#{flv[4,2].to_i}月#{flv[7,2].to_i}日放送分", "#{flv}.flv", 5 )
700- }
701-
702- $flv_service_prefix = flv_service_prefix
703- puts()
704-end
705-
706-# 公開中のファイルとGoogle検索で見つかった過去分すべてをダウンロード
707-def download_enews_all
708- # Googleでの検索結果から2010/03/23以降のファイル名を取得
709- flvs_20100323 = get_enews_names( SEARCH_20100323, REGEXP )
710- flvs_20100323 += current_list
711-
712- # Googleでの検索結果から2010/03/22以前のファイル名を取得
713- flvs = get_enews_names( SEARCH_20090330, REGEXP )
714-
715- # 2010/03/22以前のファイルを2009/07/28で振り分ける
716- flvs_20090330 = Array.new
717- flvs_20090728 = Array.new
718- flvs.each { |flv|
719- (flv[0, 6] + flv[7, 2]).to_i >= 20090728 ? (flvs_20090728 << flv) : (flvs_20090330 << flv)
720- }
721-
722- print( "enews-all: " )
723- # 2009/07/28以降のflvをダウンロード
724- flv_service_prefix = $flv_service_prefix
725- $flv_service_prefix = FLV_SERVICE_PREFIX_20090728
726- (flvs_20100323 + flvs_20090728).sort.reverse.uniq.each { |flv| # 同じ日付で更新されたもの(_newが付いている)があるので逆順にソートしておく
727- capture_stream( "enews", "ニュースで英会話", "#{flv[4,2].to_i}月#{flv[7,2].to_i}日放送分", "#{flv}.flv", 5 )
728- }
729-
730- # 2009/07/27以前のflvをダウンロード
731- $flv_service_prefix = FLV_SERVICE_PREFIX_20090330
732- flvs_20090330.sort.reverse.uniq.each { |flv| # 念のため逆順にソートしておく
733- capture_stream( "enews", "ニュースで英会話", "#{flv[4,2].to_i}月#{flv[7,2].to_i}日放送分", "#{flv}.flv", 5 )
734- }
735- puts()
736- $flv_service_prefix = flv_service_prefix
737-end
738-
739-#--------------------------------------------------------------------------------
740-# ABCニュースシャワー
741-#--------------------------------------------------------------------------------
742-
743-def download_shower
744- flv_service_prefix = $flv_service_prefix
745- $flv_service_prefix = 'flv/worldwave/common/movie/'
746-
747- print( "ABC News Shower: " )
748- xml_uri = "http://www.nhk.or.jp/worldwave/xml/abc_news.xml"
749-
750- open( xml_uri ) { |f|
751- doc = REXML::Document.new( f )
752- doc.elements.each( "rss/channel/item/pubDate" ) { |element|
753- date = Date.parse( element.text )
754- kouza = "ABCニュースシャワー"
755- hdate = "#{date.month}月#{date.day}日放送分"
756- file = "abc" + date.strftime( '%y%m%d' ) + ".flv"
757- capture_stream( "shower", kouza, hdate, file, 5 )
758- }
759- }
760- puts()
761-
762- $flv_service_prefix = flv_service_prefix
763-end
764-
765-#--------------------------------------------------------------------------------
766611 # メインプログラム
767612 #--------------------------------------------------------------------------------
768613
614+jputs( '語学講座ダウンローダ (2014/04/06)' )
615+
769616 Dir.chdir( to_native( File.dirname( $script_path ) ) )
770617 targets = ARGV.length > 0 ? ARGV : $default_target
771-targets = $english + $multilingual + $extra if targets.include?( "all" )
618+targets = $english + $multilingual if targets.include?( 'all' )
772619
773620 targets.each { |target|
774- if !$english.include?( target ) && !$multilingual.include?( target ) && !$extra.include?( target )
621+ if !$english.include?( target ) && !$multilingual.include?( target )
775622 jputs( "サポートされていない講座名です:#{target}" )
776- jputs( "使用方法: ruby #$PROGRAM_NAME [#{$english.join('|')}|#{$multilingual.join('|')}|#{$extra.join('|')}|all]" )
623+ jputs( "使用方法: ruby #$PROGRAM_NAME [#{$english.join('|')}|#{$multilingual.join('|')}|all]" )
777624 exit
778625 end
779626 }
780627
781628 targets.each { |target|
782629 if $english.include?( target )
783- xml_uri = "http://cgi2.nhk.or.jp/gogaku/english/#{target}/#{$scramble}/listdataflv.xml"
630+ xml_uri = "http://cgi2.nhk.or.jp/gogaku/st/xml/english/#{target}/listdataflv.xml"
784631 elsif $multilingual.include?( target )
785- if target =~ /^levelup-(.*)/
786- xml_uri = "http://cgi2.nhk.or.jp/gogaku/#{$~[1]}/levelup/#{$scramble}/listdataflv.xml"
632+ if target =~ /^levelup_(.*)/
633+ xml_uri = "http://cgi2.nhk.or.jp/gogaku/st/xml/#{$~[1]}/levelup/listdataflv.xml"
787634 else
788- xml_uri = "http://cgi2.nhk.or.jp/gogaku/#{target}/kouza/#{$scramble}/listdataflv.xml"
635+ xml_uri = "http://cgi2.nhk.or.jp/gogaku/st/xml/#{target}/kouza/listdataflv.xml"
789636 end
790637 else
791638 next
@@ -794,17 +641,12 @@ targets.each { |target|
794641 print( "#{target}: " )
795642 open( xml_uri ) { |f|
796643 doc = REXML::Document.new( f )
797- doc.elements.each( "musicdata/music" ) { |element|
798- kouza = element.attributes["kouza"]
799- hdate = element.attributes["hdate"]
800- file = element.attributes["file"]
644+ doc.elements.each( 'musicdata/music' ) { |element|
645+ kouza = element.attributes['kouza']
646+ hdate = element.attributes['hdate']
647+ file = element.attributes['file']
801648 capture_stream( target, kouza, hdate, file, 5 )
802649 }
803650 }
804651 puts()
805652 }
806-
807-download_shower if targets.include?( "shower" )
808-#download_enews if targets.include?( "enews" )
809-#download_enews_all if targets.include?( "enews-all" )
810-jputs( "現在、「ニュースで英会話」はサポート外です。" ) if targets.include?( "enews" ) || targets.include?( "enews-all" )