gogakuondemand.rbをv1704_3に更新

NHK大好きな[twitter:@riocampos]です。
毎度おなじみ gogakuondemand.rb を更新しました。
今回の更新は「短期集中!3か月英会話」のストリーミングURL変更への対応です。
このコメントを頂いたので更新しました。

□ tamatama 2017/10/30 11:37
短期集中3か月英会話の10月25日分だけ→ r/17-e3m-4255-092.mp4

r→mp4 になっております。何で?
□ tamatama 2017/10/30 11:39
訂正 mp4 →r に
□ tamatama 2017/10/30 21:06
先ほど25日分だけと書き込みしましたが
短期集中3ヶ月英会話が10月23日、24日、25日ともURLが、mp4→ rに変更になりました。

確認したところ、10/23と10/24で URL が mp4 でも r でもOKになっており、10/25だけ r のみになっていました。多分NHK担当者のケアレスミスでしょうw でも仕方ないので対策しました。

いつものところ
NHK語学講座のラジオ番組ストリーミングを取得するRubyスクリプトgogakuondemand.rb(v1704_3 '17/11/2更新版) - 別館 子子子子子子(ねこのここねこ)
をご覧ください。
ダウンロードもそこから行えます。
よろしくお願いします。

honto.jpからamazon.co.jpのカスタマーレビューのサイトを開く

基本的に honto.jp を使って電子書籍を買っている @riocampos です。紙の本を買った上で電子書籍が半額を買うのが目的です*1
ただし honto.jp の弱点はレビューが弱いところ。booklog と連携しているけど、やはり弱い。ということで、気になった本を読んだ人の意見がたくさん載っている amazon.co.jp の同書籍のサイトを見てみたい、と思うわけです。なので簡単に honto.jp から amazon サイトを開きたい。

先例

honto から Amazon.co.jp のカスタマーレビューを開くブックマークレット - edp02の日記
これだと一つ目の bookmarklet では書名検索のみであってカスタマーレビューまで開かないのです。
ということで ISBN(正確にはASIN)に基づいたカスタマーレビューの URL を生成して開くようにすれば良いのでは、と思いました。

つくってみた

javascript:void(function(d,w){r=d.evaluate('//li[contains(.,"ISBN")]/text()',d,null,XPathResult.STRING_TYPE,null);if(r&&r.stringValue){o=r.stringValue.substr(5).trim();if(~o.indexOf('-')){i=o.split('-').slice(1,4).join('')}else{i=o.substr(3,9)}a=i.split('');s=0;for(j=0;j<9;j++){s+=parseInt(a[j])*(10-j)}r=11-s%parseInt('11');if(r==11){r='0'}else{if(r==10){r='X'}else{r+=''}}t=i+r;w.open('https://www.amazon.co.jp/product-reviews/'+t)}else{w.alert('ISBN Not Found.')}})(document,window);

honto.jp には ISBN-13 が載っているのですが ASIN に対応する ISBN-10 が載っていません、ということで bookmarklet の中で ISBN-13 から ISBN-10 に変換しています。そして ISBN-10(ASIN)に対応したカスタマーレビューのサイトの URL は[]https://www.amazon.co.jp/product-reviews/[]{ASIN} ですので、この URL を開くようにしています。
なお、ISBN が載っていない本のサイトもあるので、その場合には「ISBN Not Found.」とアラートが出ます。

なぞ

MacChrome でこの bookmarklet が動作するのに、iOSChrome で動作しないのが謎。
さらに、MacSafari で動作しないのに、iOSSafari で動作するのも謎。なんでだ。

*1:講談社のマンガで半額にならないのが時々あるのが辛い>_

らじる★らじる m3u8 を ffmpeg で録音する(8放送局)2017/9 以降対応(2021/4更新)(2024/1金沢追加)

NHKのネット配信サービスであるらじる★らじる

従来は https://gist.github.com/riocampos/5656450 のように rtmpdump を使う必要がありましたが、2017年9月から m3u8 というか HLS による配信へ変更されました*1。m3u8 なので10秒単位での録音になります*2。ので改めてエントリ(2022/2/23に M3U8URL の更新をしました)。

録音コマンド

まず m4a(mp4 AAC)の場合。

ffmpeg -i M3U8URL -c copy outputfilename.m4a

ファイルサイズ的に m4a が最も小さくなります。また m4a ファイルのときだけ "-c copy" オプションが使えます。
次に mp3 の場合。

ffmpeg -i M3U8URL -write_xing 0 outputfilename.mp3 

Mac かつ保存形式が mp3 ファイルの場合には、ファイルの時間表示を正しくさせるために "-write_xing 0" オプション必須。(参考: https://trac.ffmpeg.org/ticket/2697

ffmpeg コマンドに含まれる M3U8URL は以下の通りです。(2021/4以降*3

ラジオ第2(各放送局共通だがJOAK扱い*4
https://radio-stream.nhk.jp/hls/live/2023501/nhkradiruakr2/master.m3u8
札幌放送局(JOIK)ラジオ第1
https://radio-stream.nhk.jp/hls/live/2023545/nhkradiruikr1/master.m3u8
札幌放送局(JOIK)NHK-FM
https://radio-stream.nhk.jp/hls/live/2023546/nhkradiruikfm/master.m3u8
仙台放送局(JOHK)ラジオ第1
https://radio-stream.nhk.jp/hls/live/2023543/nhkradiruhkr1/master.m3u8
仙台放送局(JOHK)NHK-FM
https://radio-stream.nhk.jp/hls/live/2023544/nhkradiruhkfm/master.m3u8
東京放送局JOAK)ラジオ第1
https://radio-stream.nhk.jp/hls/live/2023229/nhkradiruakr1/master.m3u8
東京放送局JOAKNHK-FM
https://radio-stream.nhk.jp/hls/live/2023507/nhkradiruakfm/master.m3u8
金沢放送局(JOJK)ラジオ第1 *5
https://radio-stream.nhk.jp/hls/live/2024459/nhkradirulife1/master.m3u8
名古屋放送局(JOCK)ラジオ第1
https://radio-stream.nhk.jp/hls/live/2023510/nhkradiruckr1/master.m3u8
名古屋放送局(JOCK)NHK-FM
https://radio-stream.nhk.jp/hls/live/2023511/nhkradiruckfm/master.m3u8
大阪放送局(JOBK)ラジオ第1
https://radio-stream.nhk.jp/hls/live/2023508/nhkradirubkr1/master.m3u8
大阪放送局(JOBK)NHK-FM
https://radio-stream.nhk.jp/hls/live/2023509/nhkradirubkfm/master.m3u8
広島放送局(JOFK)ラジオ第1
https://radio-stream.nhk.jp/hls/live/2023512/nhkradirufkr1/master.m3u8
広島放送局(JOFK)NHK-FM
https://radio-stream.nhk.jp/hls/live/2023513/nhkradirufkfm/master.m3u8
松山放送局(JOZK)ラジオ第1
https://radio-stream.nhk.jp/hls/live/2023547/nhkradiruzkr1/master.m3u8
松山放送局(JOZK)NHK-FM
https://radio-stream.nhk.jp/hls/live/2023548/nhkradiruzkfm/master.m3u8
福岡放送局(JOLK)ラジオ第1
https://radio-stream.nhk.jp/hls/live/2023541/nhkradirulkr1/master.m3u8
福岡放送局(JOLK)NHK-FM
https://radio-stream.nhk.jp/hls/live/2023542/nhkradirulkfm/master.m3u8

なお M3U8URL は http://www.nhk.or.jp/radio/config/config_web.xml に記載されています。
また、これらの M3U8URLへのリンクをHLS対応のブラウザで開くと、各放送を直接聴けます*6。この辺りは radiko よりも気軽で良いですね。

例:大阪放送局のラジオ第1をm4aで5分(300秒)間録音する
ffmpeg -i https://radio-stream.nhk.jp/hls/live/2023508/nhkradirubkr1/master.m3u8 -to 300 -c copy r1.m4a

2021/3までのM3U8URL

参考のため残しておきます。が、2022/2/28で廃止されました。


いよいよ昨年更新した古い送信設備を停止する時が来ました。
今月(2月)28日未明に5.7.9以下のバージョンでは同時配信が聴けなくなります。

ラジオ第2OLD(各放送局共通だがJOAK扱い)
https://nhkradioakr2-i.akamaihd.net/hls/live/511929/1-r2/1-r2-01.m3u8
札幌放送局(JOIK)ラジオ第1OLD
https://nhkradioikr1-i.akamaihd.net/hls/live/512098/1-r1/1-r1-01.m3u8
札幌放送局(JOIK)NHK-FM OLD
https://nhkradioikfm-i.akamaihd.net/hls/live/512100/1-fm/1-fm-01.m3u8
仙台放送局(JOHK)ラジオ第1OLD
https://nhkradiohkr1-i.akamaihd.net/hls/live/512075/1-r1/1-r1-01.m3u8
仙台放送局(JOHK)NHK-FM OLD
https://nhkradiohkfm-i.akamaihd.net/hls/live/512076/1-fm/1-fm-01.m3u8
東京放送局JOAK)ラジオ第1OLD
https://nhkradioakr1-i.akamaihd.net/hls/live/511633/1-r1/1-r1-01.m3u8
東京放送局JOAKNHK-FM OLD
https://nhkradioakfm-i.akamaihd.net/hls/live/512290/1-fm/1-fm-01.m3u8
名古屋放送局(JOCK)ラジオ第1OLD
https://nhkradiockr1-i.akamaihd.net/hls/live/512072/1-r1/1-r1-01.m3u8
名古屋放送局(JOCK)NHK-FM OLD
https://nhkradiockfm-i.akamaihd.net/hls/live/512074/1-fm/1-fm-01.m3u8
大阪放送局(JOBK)ラジオ第1OLD
https://nhkradiobkr1-i.akamaihd.net/hls/live/512291/1-r1/1-r1-01.m3u8
大阪放送局(JOBK)NHK-FM OLD
https://nhkradiobkfm-i.akamaihd.net/hls/live/512070/1-fm/1-fm-01.m3u8
広島放送局(JOFK)ラジオ第1OLD
https://nhkradiofkr1-i.akamaihd.net/hls/live/512086/1-r1/1-r1-01.m3u8
広島放送局(JOFK)NHK-FM OLD
https://nhkradiofkfm-i.akamaihd.net/hls/live/512087/1-fm/1-fm-01.m3u8
松山放送局(JOZK)ラジオ第1OLD
https://nhkradiozkr1-i.akamaihd.net/hls/live/512103/1-r1/1-r1-01.m3u8
松山放送局(JOZK)NHK-FM OLD
https://nhkradiozkfm-i.akamaihd.net/hls/live/512106/1-fm/1-fm-01.m3u8
福岡放送局(JOLK)ラジオ第1OLD
https://nhkradiolkr1-i.akamaihd.net/hls/live/512088/1-r1/1-r1-01.m3u8
福岡放送局(JOLK)NHK-FM OLD
https://nhkradiolkfm-i.akamaihd.net/hls/live/512097/1-fm/1-fm-01.m3u8

おまけ

ffmpeg の各種オプションに関しては https://ffmpeg.org/ffmpeg.html を見てください。日本語だと FFMPEGのオプション (FFMPEG -H)|cagylogic (WebArchive) 辺りで充分かと。
-t オプションと -to オプションだけで済むと思いますが。余談ですが -t オプションと -to オプションの違いは -ss オプションなどで起点指定した場合に出てきます(詳しくは Seeking – FFmpeg 参照)。

*1:HLS のより詳しい解説は第95回 「らじる☆らじる」をHLS経由で:玩式草子─ソフトウェアとたわむれる日々|gihyo.jp … 技術評論社 をご参照ください。

*2:-toオプションなどを使うと10秒よりも短く区切れます。

*3:正確には2021/3/31更新のようです。参考のWebArchive:更新直前/更新直後

*4:なおNHK東京のラジオ第2コールサインはJOAB。コールサインについては全国放送局リンク<ラジオ局> 略称(愛称)/コールサイン/開局日/周波数一覧などをご参考に。

*5:2024/1能登半島地震の災害報道

*6:iPhoneSafariiOS 10.3.3)ではバッファ時間による遅延が45秒でした。

gogakuondemand.rbをv1704_2に更新

NHK大好きな[twitter:@riocampos]です。
毎度おなじみ gogakuondemand.rb を更新しました。
今回の更新は「短期集中!3か月英会話」のストリーミングURL変更への対応です。
このコメントを頂いたので更新しました。

tama 2017/07/17 13:33
短期集中3か月英会話のURLが r → mp4 に変わりました。http://d.hatena.ne.jp/riocampos+tech/20130731/p1#c1500266015

いつものところ
NHK語学講座のラジオ番組ストリーミングを取得するRubyスクリプトgogakuondemand.rb(v1704_2 '17/7/19更新版) - 別館 子子子子子子(ねこのここねこ)
をご覧ください。
ダウンロードもそこから行えます。
よろしくお願いします。

らじる★らじる聴き逃しサービスをダウンロードするための手始め:JSONファイルのありか

おことわり

ここに記載した情報は、私的利用に限定した使用に限ります*1著作権侵害は禁じます。

さて本編

今日の10時から、らじる★らじる聴き逃しサービス*2が充実しました。

いままでもラジオ第2の番組を中心に一部のストリーミングサービス*3が提供されていましたが、対応番組がかなり拡大されました。

ダウンロードしたいよねー

さて。
語学番組のダウンロードをいろいろとやっている私としては、やはり聴き逃しサービス(ストリーミングサービス)もダウンロードしたいと思ったわけですよハイ。
ってことで上記の「聴き逃し番組を探す」サイトを確認してみると、以下の JSON ファイルが取得されていますね。

内容はこんな感じ。

{
 "data_list":[
  {"site_id":"0045","program_name":"NHK\u30b8\u30e3\u30fc\u30ca\u30eb","media_code":"05","corner_id":"01","corner_name":null,"thumbnail_p":"https:\/\/www.nhk.or.jp\/radioondemand\/json\/0045\/img\/program_g_100.png","thumbnail_c":null,"detail_json":"https:\/\/www.nhk.or.jp\/radioondemand\/json\/0045\/bangumi_0045_01.json","open_time":"2017-05-25T12:00:00+0900","close_time":"2017-06-01T12:00:00+0900","onair_date":"2017\u5e745\u670824\u65e5(\u6c34)\u653e\u9001","link_url":null},
  {"site_id":"2914","program_name":"\u30b4\u30b8\u3060\u3063\u3061\u3083\uff01","media_code":"05","corner_id":"01","corner_name":null,"thumbnail_p":"https:\/\/www.nhk.or.jp\/radioondemand\/json\/2914\/img\/program_g_292.jpg","thumbnail_c":null,"detail_json":"https:\/\/www.nhk.or.jp\/radioondemand\/json\/2914\/bangumi_2914_01.json","open_time":"2017-05-25T12:00:00+0900","close_time":"2017-06-01T17:00:00+0900","onair_date":"2017\u5e745\u670812\u65e5(\u91d1)\u653e\u9001","link_url":null},
  …
 ]
}

これを Ruby で読ませて JSON.parse すると次のようになります。

{"data_list"=>
  [{"site_id"=>"0045",
    "program_name"=>"NHKジャーナル",
    "media_code"=>"05",
    "corner_id"=>"01",
    "corner_name"=>nil,
    "thumbnail_p"=>"https://www.nhk.or.jp/radioondemand/json/0045/img/program_g_100.png",
    "thumbnail_c"=>nil,
    "detail_json"=>"https://www.nhk.or.jp/radioondemand/json/0045/bangumi_0045_01.json",
    "open_time"=>"2017-05-25T12:00:00+0900",
    "close_time"=>"2017-06-01T12:00:00+0900",
    "onair_date"=>"2017年5月24日(水)放送",
    "link_url"=>nil},
   {"site_id"=>"2914",
    "program_name"=>"ゴジだっちゃ!",
    "media_code"=>"05",
    "corner_id"=>"01",
    "corner_name"=>nil,
    "thumbnail_p"=>"https://www.nhk.or.jp/radioondemand/json/2914/img/program_g_292.jpg",
    "thumbnail_c"=>nil,
    "detail_json"=>"https://www.nhk.or.jp/radioondemand/json/2914/bangumi_2914_01.json",
    "open_time"=>"2017-05-25T12:00:00+0900",
    "close_time"=>"2017-06-01T17:00:00+0900",
    "onair_date"=>"2017年5月12日(金)放送",
    "link_url"=>nil},
    :
  ]}

まあいろいろとあるわけですが、大事なのは detail_json 要素。ここに各番組のデータが含まれている JSON ファイルの URL が書いてあります。

では番組別 JSON ファイルを見てみましょう

上記の冒頭にある「NHKジャーナル」の JSON ファイル

を取得しましょう。

{
 "main":{
  "site_id":"0045",
  "program_name":"NHKジャーナル",
  "mode":0,
  "media_type":"radio",
  "media_code":"05",
  "media_name":"NHKラジオ第1",
  "site_detail":"「NHKジャーナル」は、“今日1日・時代の動きが見える”ニュース番組です。世界や日本の今日の出来事を解説を加えながらわかりやすく伝えます。また、地域のホットな話題やスポーツ、気象など、あらゆる情報が満載です。",
  "navi":"news",
  "navi_name":"ニュース",
  "cast":null,
  "thumbnail_p":"https:\/\/www.nhk.or.jp\/radioondemand\/json\/0045\/img\/program_g_100.png",
  "thumbnail_c":null,"site_logo":"http:\/\/www2.nhk.or.jp\/prog\/img\/45\/45.jpg",
  "week":"月火水木金",
  "schedule":"毎週月曜〜金曜 午後10時〜11時10分",
  "official_url":"http:\/\/www4.nhk.or.jp\/nhkjournal\/","share_url":"http:\/\/nhk.jp\/radio\/?p=0045_01",
  "corner_id":"01",
  "corner_name":null,
  "corner_detail":null,
  "noindex_flag":false,
  "detail_list":[
   {"headline_id":"08","headline":null,"headline_sub":null,"headline_image":null,"file_list":[{"seq":1,"file_id":"3826","file_title":"2017年5月24日(水)","file_title_sub":null,"basefile":"\/var\/www\/netradio_stg\/web\/data\/sound\/0045\/stream_0045_9ec5f956f8759c6b2d4a163161beb3c3.mp4","file_name":"https:\/\/nhks-vh.akamaihd.net\/i\/radioondemand\/r\/0045\/s\/stream_0045_9ec5f956f8759c6b2d4a163161beb3c3.mp4\/master.m3u8","open_time":"2017-05-25T12:00:00+09:00","close_time":"2017-06-01T12:00:00+09:00","aa_contents_id":"[radio]vod;NHKジャーナル;r1,130;2017052471692;2017-05-24T22:00:00+09:00_2017-05-24T23:10:00+09:00","aa_measurement_id":"vod","aa_vinfo1":"NHKジャーナル","aa_vinfo2":"r1,130","aa_vinfo3":"2017052471692","aa_vinfo4":"2017-05-24T22:00:00+09:00_2017-05-24T23:10:00+09:00","onair_date":"2017年5月24日(水)放送"}]},
   {"headline_id":"02","headline":null,"headline_sub":null,"headline_image":null,"file_list":[{"seq":1,"file_id":"3514","file_title":"2017年5月23日(火)","file_title_sub":null,"basefile":"\/var\/www\/netradio_stg\/web\/data\/sound\/0045\/stream_0045_835e14e46f29566a23d71ad789a89eb7.mp4","file_name":"https:\/\/nhks-vh.akamaihd.net\/i\/radioondemand\/r\/0045\/s\/stream_0045_835e14e46f29566a23d71ad789a89eb7.mp4\/master.m3u8","open_time":"2017-05-24T12:00:00+09:00","close_time":"2017-05-31T12:00:00+09:00","aa_contents_id":"[radio]vod;NHKジャーナル;r1,130;2017052371460;2017-05-23T22:00:00+09:00_2017-05-23T23:10:00+09:00","aa_measurement_id":"vod","aa_vinfo1":"NHKジャーナル","aa_vinfo2":"r1,130","aa_vinfo3":"2017052371460","aa_vinfo4":"2017-05-23T22:00:00+09:00_2017-05-23T23:10:00+09:00","onair_date":"2017年5月23日(火)放送"}]},
   {"headline_id":"07","headline":null,"headline_sub":null,"headline_image":null,"file_list":[{"seq":1,"file_id":"3794","file_title":"2017年5月22日(月)","file_title_sub":null,"basefile":"\/var\/www\/netradio_stg\/web\/data\/sound\/0045\/stream_0045_e32cdda15c72ad5e92b5b38db7b2e749.mp4","file_name":"https:\/\/nhks-vh.akamaihd.net\/i\/radioondemand\/r\/0045\/s\/stream_0045_e32cdda15c72ad5e92b5b38db7b2e749.mp4\/master.m3u8","open_time":"2017-05-23T12:00:00+09:00","close_time":"2017-05-30T12:00:00+09:00","aa_contents_id":"[radio]vod;NHKジャーナル;r1,130;2017052271231;2017-05-22T22:00:00+09:00_2017-05-22T23:10:00+09:00","aa_measurement_id":"vod","aa_vinfo1":"NHKジャーナル","aa_vinfo2":"r1,130","aa_vinfo3":"2017052271231","aa_vinfo4":"2017-05-22T22:00:00+09:00_2017-05-22T23:10:00+09:00","onair_date":"2017年5月22日(月)放送"}]}
  ]
 }
}

これをまた Ruby で読ませて JSON.parse しましょう。

{"main"=>
  {"site_id"=>"0045",
   "program_name"=>"NHKジャーナル",
   "mode"=>0,
   "media_type"=>"radio",
   "media_code"=>"05",
   "media_name"=>"NHKラジオ第1",
   "site_detail"=>
    "「NHKジャーナル」は、“今日1日・時代の動きが見える”ニュース番組です。世界や日本の今日の出来事を解説を加えながらわか
りやすく伝えます。また、地域のホットな話題やスポーツ、気象など、あらゆる情報が満載です。",
   "navi"=>"news",
   "navi_name"=>"ニュース",
   "cast"=>nil,
   "thumbnail_p"=>"https://www.nhk.or.jp/radioondemand/json/0045/img/program_g_100.png",
   "thumbnail_c"=>nil,
   "site_logo"=>"http://www2.nhk.or.jp/prog/img/45/45.jpg",
   "week"=>"月火水木金",
   "schedule"=>"毎週月曜〜金曜 午後10時〜11時10分",
   "official_url"=>"http://www4.nhk.or.jp/nhkjournal/",
   "share_url"=>"http://nhk.jp/radio/?p=0045_01",
   "corner_id"=>"01",
   "corner_name"=>nil,
   "corner_detail"=>nil,
   "noindex_flag"=>false,
   "detail_list"=>
    [{"headline_id"=>"08",
      "headline"=>nil,
      "headline_sub"=>nil,
      "headline_image"=>nil,
      "file_list"=>
       [{"seq"=>1,
         "file_id"=>"3826",
         "file_title"=>"2017年5月24日(水)",
         "file_title_sub"=>nil,
         "basefile"=>"/var/www/netradio_stg/web/data/sound/0045/stream_0045_9ec5f956f8759c6b2d4a163161beb3c3.mp4",
         "file_name"=>
          "https://nhks-vh.akamaihd.net/i/radioondemand/r/0045/s/stream_0045_9ec5f956f8759c6b2d4a163161beb3c3.mp4/master.m3u8",
         "open_time"=>"2017-05-25T12:00:00+09:00",
         "close_time"=>"2017-06-01T12:00:00+09:00",
         "aa_contents_id"=>
          "[radio]vod;NHKジャーナル;r1,130;2017052471692;2017-05-24T22:00:00+09:00_2017-05-24T23:10:00+09:00",
         "aa_measurement_id"=>"vod",
         "aa_vinfo1"=>"NHKジャーナル",
         "aa_vinfo2"=>"r1,130",
         "aa_vinfo3"=>"2017052471692",
         "aa_vinfo4"=>"2017-05-24T22:00:00+09:00_2017-05-24T23:10:00+09:00",
         "onair_date"=>"2017年5月24日(水)放送"}]},
     {"headline_id"=>"02",
      "headline"=>nil,
      "headline_sub"=>nil,
      "headline_image"=>nil,
      "file_list"=>
       [{"seq"=>1,
         "file_id"=>"3514",
         "file_title"=>"2017年5月23日(火)",
         "file_title_sub"=>nil,
         "basefile"=>"/var/www/netradio_stg/web/data/sound/0045/stream_0045_835e14e46f29566a23d71ad789a89eb7.mp4",
         "file_name"=>
          "https://nhks-vh.akamaihd.net/i/radioondemand/r/0045/s/stream_0045_835e14e46f29566a23d71ad789a89eb7.mp4/master.m3u8",
         "open_time"=>"2017-05-24T12:00:00+09:00",
         "close_time"=>"2017-05-31T12:00:00+09:00",
         "aa_contents_id"=>
          "[radio]vod;NHKジャーナル;r1,130;2017052371460;2017-05-23T22:00:00+09:00_2017-05-23T23:10:00+09:00",
         "aa_measurement_id"=>"vod",
         "aa_vinfo1"=>"NHKジャーナル",
         "aa_vinfo2"=>"r1,130",
         "aa_vinfo3"=>"2017052371460",
         "aa_vinfo4"=>"2017-05-23T22:00:00+09:00_2017-05-23T23:10:00+09:00",
         "onair_date"=>"2017年5月23日(火)放送"}]},
     {"headline_id"=>"07",
      "headline"=>nil,
      "headline_sub"=>nil,
      "headline_image"=>nil,
      "file_list"=>
       [{"seq"=>1,
         "file_id"=>"3794",
         "file_title"=>"2017年5月22日(月)",
         "file_title_sub"=>nil,
         "basefile"=>"/var/www/netradio_stg/web/data/sound/0045/stream_0045_e32cdda15c72ad5e92b5b38db7b2e749.mp4",
         "file_name"=>
          "https://nhks-vh.akamaihd.net/i/radioondemand/r/0045/s/stream_0045_e32cdda15c72ad5e92b5b38db7b2e749.mp4/master.m3u8",
         "open_time"=>"2017-05-23T12:00:00+09:00",
         "close_time"=>"2017-05-30T12:00:00+09:00",
         "aa_contents_id"=>
          "[radio]vod;NHKジャーナル;r1,130;2017052271231;2017-05-22T22:00:00+09:00_2017-05-22T23:10:00+09:00",
         "aa_measurement_id"=>"vod",
         "aa_vinfo1"=>"NHKジャーナル",
         "aa_vinfo2"=>"r1,130",
         "aa_vinfo3"=>"2017052271231",
         "aa_vinfo4"=>"2017-05-22T22:00:00+09:00_2017-05-22T23:10:00+09:00",
         "onair_date"=>"2017年5月22日(月)放送"}]}]}}

ということで出てきました、m3u8 ファイルの URL*4。file_name要素に出てきます。
昨日(5/24)のNHKジャーナルの音声ファイルのURLは、onair_date 要素の「2017年5月24日(水)放送」の含まれているハッシュの file_name 要素

であると分かりました。配信開始時刻は open_time 要素にある 2017-05-25T12:00:00+09:00 、配信終了時刻は
 close_time 要素の 2017-06-01T12:00:00+09:00 ですね。
あとはよしなにしてくださいw((ffmpeg -i https://nhks-vh.akamaihd.net/i/radioondemand/r/0045/s/stream_0045_9ec5f956f8759c6b2d4a163161beb3c3.mp4/master.m3u8 nhk_journal20170524.mp3 なお、macOS では ffmpeg のオプションとして -write_xing 0 を付けると時間表示が正しくなります。参考:#2697 (MP3 output duration incorrect in OS X) – FFmpeg))。

おまけ

ちなみにこの「NHKジャーナル」の site_id つまり 0045 (聴き逃しサービスのリンクURL http://www.nhk.or.jp/radio/ondemand/detail.html?p=0045_01 にも一部使われていますね)は、番組サイトへのリンクに関係する数になっています。(パディングの0を無視して) http://nhk.jp/P45 へジャンプすると、そこから http://www4.nhk.or.jp/nhkjournal/ へ転送されます。*5。聴き逃しサービスの他の site_id も基本的に同じような数、つまり番組に関連付いたユニークな数が使われています。ただし地方局の番組(らじる★らじるで未配信の局)の site_id では番組に関連付いた数になっていないのが残念です。

*1:著作権法 第三十条(私的使用のための複製)

*2:「聞き逃し」じゃないのよね

*3:正しくはオンデマンド配信だと思うのだが…NHKさんはいろいろと間違った日本語を定着させてますよね

*4:JSONのままでも読めますけどねw

*5:http://nhk.jp/P045http://nhk.jp/P0045http://nhk.jp/P00045 でも http://www4.nhk.or.jp/nhkjournal/ へ転送されます。ちなみに末尾にスラッシュを付けた http://nhk.jp/P45/ だとエラーサイトへ転送されます

iOS端末から写真.appへ写真を移してからのコツ、写真.appからiOS端末へiTunesで同期したり出来ない場合の対処法

(元タイトル:iOS端末から写真.appへ写真を移してから同じiOS端末へiTunesで写真同期出来るようにするまでにバックグラウンドで作業してるサービスはどいつだ)←長いタイトルだ。
私自身が同期させてるのは iPhone だけですが、おそらく iOS 端末全てで同じでしょうし。

iPhone で撮影した写真を macOS の写真.appに吸い込ませてから、 iTunes で同期させたときにその写真を iPhone へ移すことができるようになるまで、しばらくかかります。顔認識とか、写真からいろんな情報を取得したりしてるのだろうと思いますが、正直なことを言えば「写真即同期・後日同期時に更新情報修正」としてほしいものです。さっさと同期したいんですよ、うん。
ですがなかなかそうは問屋が卸さない。
写真.appを終了してからじゃないと更新してくれないんですよね。
じゃあ何がバックグラウンド作業してるのか、といえばこの3つっぽい。

  • photoanalysisd
  • photolibraryd
  • com.apple.MediaLibraryService

(追記:その他に iOS が11以上になってから iOS 側での画像ファイルが jpeg じゃなく HEIF になったので com.apple.photos.ImageConversionService も働くようだ)
写真.appに写真を取り込むとまず photolibraryd が働き、続いて photoanalysisd が働く、って感じ。com.apple.MediaLibraryService は iTunes 関連のサービスなので iTunes が起動していると働く。
いずれにせよ、この3つの動作が終了してから iTunes で同期させると写真を iPhone へ戻せました。こいつらが終了するまで気長に待ちましょう。
私の手順としては

  1. まず iTunes を終了してから写真.app を起動して写真を取り込む
  2. photolibraryd と photoanalysisd が働く
  3. 二つが働き終える
  4. 写真.app を終了させる
  5. photolibraryd と photoanalysisd が働く場合があるので様子をみる
  6. iTunes を起動し、写真を同期したい iOS 端末の同期画面にして「写真」タブを選ぶ*1
  7. com.apple.MediaLibraryService が働く
  8. 働き終え、iTunes がいろいろ処理して終わると「写真」タブで同期枚数が出る
  9. 同期開始

のようにやってます。いずれにせよ気長に待ちましょう。


どうしても同期出来ない場合の解決法(へのヒント)

(2019/10/22追記)
写真.appからiPhoneへ同期させるためのデータは 写真 Library.photoslibrary フォルダの中の iPod Photo Cache フォルダに作成されるようです。上記のサービスやデーモンが終了しても同期出来ない場合にはこの iPod Photo Cache フォルダを削除*2してしまえば解決することが多そう。ただしデータを一から作り直すので時間が掛かりますが。
手順とその際の iTunes やフォルダの振る舞いは以下の通り。

  1. iPod Photo Cache フォルダを削除する
  2. iTunes を起動して iPhone の同期画面を出し、「写真」タブを出す
    →しばらくプログレスのぐるぐるのみが表示される
    iPod Photo Cache フォルダが作成されるかもしれないがそのうちまた消える
  3. プログレスのぐるぐるが終了して「写真」タブの内容が表示されるようになると「□ 写真を同期」のチェックが外れているのでチェックする
  4. 同期したいアルバムを指定
  5. 「適用」ボタンを押すとダイアログで「既存の写真を削除して、このコンピュータから写真を同期してもよろしいですか?」と出るので「削除して同期」ボタンを押す
    iPod Photo Cache フォルダが作成されるがやはりまた消える
    iTunes の進行状況に「写真ライブラリを読み込み中」と表示されると iPod Photo Cache フォルダが作成され、中に Photo Database ファイルが作成される
    iTunes の進行状況に「フォトライブラリを分析中…」と表示されると iPod Photo Cache フォルダ内に PhotoDatabaseReserve.tmp ファイルが一時的に作成され、そのうちまた消えると共に Photo Database ファイルが更新される
    iTunes の進行状況に「写真をコピー中」と表示され iPod Photo Cache 内に F00〜F50 フォルダが作成され、写真コピーの進行状況が進んでいく

参考: iPhone Macの写真が一部同期されなかった時に試してみること。 - かもメモ

どうしても同期出来ない場合の解決法(へのヒント)その2

それでも完全な同期が出来ない(例えば写真.appとの同期を完全にリセットしようとしても写真がiPhone側に残ってしまう)ような場合には、最終手段として iFunBox など iPhone の生データへアクセス出来るアプリケーションを使う必要が生じます。

データベース Raw File System/PhotoData/Photos.sqlite を削除してから iPhone を再起動(NG)

Macからの同期写真は全てアクセス出来なくなる。iPhone で撮影したカメラロールの写真は写真アプリを起動させるとデータベースが再構築されるのでしばらくすると見れるようになる。しかしその後に同期させると、以前読み込まれた写真と新しく読み込まれた写真とが重複され、また同期された写真が纏まって表示されなくなる。つまりデータベースがおかしくなった。のでNG。

Raw File System/PhotoData/ 以下のファイルを全て削除

先にカメラロールはバックアップしましょう。その後 iPhone を一旦再起動させましょう。Mac 側(というか写真.app)の iPod Photo Cache フォルダは削除しなくてもよい。
これが一番確実(且つ最終手段)。

*1:「写真」タブを選ばなくても com.apple.MediaLibraryService は働くのですが、タブを選んでおくと確実に働くので念の為に iTunes に促している、つもり。

*2:もちろん写真のオリジナルは別フォルダ(Masters フォルダ内)にあるので消えません

radikoのxml番組表とタグの意味

radikoの2週間番組表(1週間前から1週間後)は、例えば放送大学(放送局コード HOUSOU-DAIGAKU )ならば

http://radiko.jp/v3/program/station/weekly/HOUSOU-DAIGAKU.xml

となります。本日(4/15)だと4/8から4/21までの番組表が取得出来ます。

今日の番組表の一例

<prog id="8469966895" master_id="" ft="20170415160000" to="20170415164500" ftl="1600" tol="1645" dur="2700">
  <title>公共哲学第3回</title>
  <url>http://www.ouj.ac.jp/</url>
  <failed_record>0</failed_record>
  <ts_in_ng>2</ts_in_ng>
  <ts_out_ng>2</ts_out_ng>
  <desc>公共哲学としてのリベラリズム</desc>
  <info/>
  <pfm>山岡 龍一(放送大学教授)</pfm>
  <img>
    http://radiko.jp/res/program/DEFAULT_IMAGE/HOUSOU-DAIGAKU/20161020135931.png
  </img>
  <metas>
    <meta name="twitter" value="#radiko"/>
  </metas>
</prog>

<prog id="8469966896" master_id="" ft="20170415164500" to="20170415173000" ftl="1645" tol="1730" dur="2700">
  <title>英語事始め第3回</title>
  <url>http://www.ouj.ac.jp/</url>
  <failed_record>0</failed_record>
  <ts_in_ng>0</ts_in_ng>
  <ts_out_ng>0</ts_out_ng>
  <desc>Session3 空間と前置詞</desc>
  <info/>
  <pfm>
    大橋 理枝(放送大学准教授) 佐藤 良明(放送大学教授) ロビンス ロジャー グレン(東京大学准教授)
  </pfm>
  <img>
    http://radiko.jp/res/program/DEFAULT_IMAGE/HOUSOU-DAIGAKU/20161020125846.png
  </img>
  <metas>
    <meta name="twitter" value="#radiko"/>
  </metas>
</prog>

タグの意味

titleとか urlとか読めば分かるものは省きます。

prog
番組の時間などの情報。ft が開始時刻を、to が終了時刻を、それぞれ YYYYmmddHHMMSS 形式(年月日時分秒)で表記したもの。また ftl が開始時刻を、tol が終了時刻を、それぞれ HHMM 形式(時分)で表記したもの。dur は duration の略と思われ、放送時間を秒単位で表記している。なお id は番組毎にユニークな番号と思われるが、master_id は分からん。
failed_record
分からん(ぉぃ
ts_in_ng / ts_out_ng
おそらくタイムフリーの可否。0がタイムフリー対応、2が非対応。in / out に違いがあるのかどうなのか。
desc
descriptionの略か。放送大学だと各講義の副題。
info
informationの略か(放送大学では使われない)。desc の代わりとして放送内容などが含まれることがある。desc と info の両方が使われる場合は desc が本文で info が定型文のようだ。
pfm
performerの略か。放送大学だと各講義の講師名。
img
radikoサイトなどで表示される画像のURL。
meta
ツイートするときのハッシュタグ指定?

放送大学の各講義のタイムフリー対応/非対応に関してはこちらの pdf ファイルを参照してください。

参考:

意味がいまひとつわからないのが
<failed_record>
<ts_in_ng>
<ts_out_ng>
です。
通常の番組はすべて0です。一部録音に不備があるものは failed_record=1 になっています。
ジャニーズ系のタイムフリー配信なしの番組は<ts_in_ng><ts_out_ng>が1か2になっています。
 :
番組内でジャニーズの番組が流れるレコメン!は<ts_in_ng><ts_out_ng>が2になっています。
この番組は全編「ただいま配信を停止しています」というメッセージが流れます。
 :
考察(間違っているかもしれません)
<ts_in_ng>
0:全て配信
1:部分配信停止
2:全部配信停止
どなたか正解をご存じありませんか?
Radikoの番組表について : miscthoughtのblog