Re: Webラジオの保存方法の質問はこちら【26】 ( No.37 ) |
- 日時: 2020/07/28 10:33
- 名前: No Name
- 番組名やURLの一覧取得について、
ブックマークレット向けに作成してみたので 利用できる方は活用してください(firefox 78.xとchrome 84.xでのみ確認)。
▼機能
「UTF-8,\n(LF)」のテキストで、番組名、ストリーミングURL(playlist.m3u8)、 その他の自分が任意に選択した属性を羅列。
★各番組の最新以外の配信は抽出対象から除外しています。 ★プレミアム会員のみの配信も除外しています。
スクリプトが読める方は各自で変更して使う等してください。
※エラーチェック等もほぼしていません。もともと自作ツール向けに jsonで取得するために作ったものを改修した簡易的なものなので、 このようなかたちにしています。
▼使い方
例えば下記のサイトなどを使って、
Bookmarklet スクリプト変換 https://ytyng.github.io/bookmarklet-script-compress/
ブックマークレット名に「音泉」なんちゃらかんちゃらと、 任意の名称を入力して、 スクリプトに後述のコードをコピペして、 「ブックマークレットに変換」ボタンを押し、 出現したボタンをブックマークバーにドラッグして登録。 ※★ブックマークへの登録は一度のみ、初回だけすればOK。
あとは、音泉の「トップページ」にアクセスして、 ページが表示し終わったら、前述のブックマークに登録したものを 選択すれば、音泉で使っているJavaScriptオブジェクトから 番組名とかURLを抽出して、テキストファイルとしてダウンロードします。
※あくまでアクセスした時点の情報の取得です。 スクリプト自体は通信せず、ローカルでのみの動作なので 音泉への負荷も皆無です。
▼スクリプト
(function(onsenData) { "use strict";
const mapDOW = [ {"dow":"1", "name":"月"} , {"dow":"2", "name":"火"} , {"dow":"3", "name":"水"} , {"dow":"4", "name":"木"} , {"dow":"5", "name":"金"} , {"dow":"6", "name":"土・日"} ];
const programs = onsenData.state.programs.programs;
const result = [];
for (let dowIdx = 0, dowIdxMax = mapDOW.length; dowIdx < dowIdxMax; dowIdx++) { let dow = mapDOW[dowIdx].dow; let dowName = mapDOW[dowIdx].name;
if (dowIdx > 0) { result.push(''); }
result.push('▼[' + dowName + ']曜日====================');
let listDOW = programs[ dow ];
for (let i = 0, iMax = listDOW.length; i < iMax; i++) { let program = listDOW[i];
let contents = program.contents;
for (let j = 0, jMax = contents.length; j < jMax; j++) { let content = contents[j];
if (content.latest === false) { break; }
if (content.premium === true) { continue; }
result.push(''); result.push('番組名' + (program.new ? '(new)' : '') + ':' + program.title + ' ' + content.title); result.push('データURL:' + content.streaming_url); result.push('配信日:' + content.delivery_date + ', 動画フラグ:' + content.movie); } } }
if (result.length < 1) { return; }
let blobUrl = (function(data) { if (!(typeof Blob !== 'undefined')){ return false; } window.URL = window.URL || window.webkitURL; if (!window.URL){ return false; } let blob = new Blob([ data.join('\n') ], {"type":"text/plain"}); return window.URL.createObjectURL(blob); })(result);
if (blobUrl === false) { return; }
let link = document.createElement('a'); link.href = blobUrl; link.download = 'onsen-' + (new Date()).getTime() + '.txt'; link.click();
})(window.__NUXT__);
|
Re: Webラジオの保存方法の質問はこちら【26】 ( No.108 ) |
- 日時: 2020/08/10 11:30
- 名前: No Name
- >>37 のブックマークレットの作者です。
>>105 さんが11月に音泉側が改造するようなことが記載されていますが、 もしそれで音泉側の仕様が変わった場合、 ブックマークレットが正常動作しなくなる可能性がそこそこあります。
また、申し訳ないですが、私がその時、 仕様変更に対応させない可能性も高いです。 (私自身はブックマークレットを使っていないため) ※誰かが改造して再提供する分にはかまいません。
===============
一方、>>93 さんがリンクを貼った音泉のWeb APIを使って、 直接データ(json)を取得して、番組一覧をHTMLで表示し、 クリックすれば、>>37 と同等のフォーマットでテキスト出力したり、 batファイルに出力するツール(.hta)を別途自作しています。 ※このツールを使えば、ブラウザも不要。 ただしWindows限定(Windows 10でのみ動作確認)。
こちらのツールは私が使っているもののため、 仕様変更があった場合、おそらく対応させると思います。 ※「おそらく」というのは今後 >>29 inoviaさんが ツールを提供したら、そっちへの利用に私が切り替える可能性があり、 その場合は私のツールは仕様変更に対応しないこともある。
ただ、私が自作したツールは、 第三者が利用することを全く想定していないので、 batファイルの中身をハードコーディングしています。 batファイルの出力機能を使いたい場合は、 自分でHTAファイルを修正できる方ではないと利用が難しいものです。 ※それに自分用のツールなので、エラー処理も不完全です。
そのため、そのツールについては ここで提供しようか迷っていたのですが、 音泉側の仕様変更が数カ月以内にまたくるのであれば、 前述通り、ブックマークレットの方は修正をする気が無いので、 ツールを提供するのもアリかなと思いました。
基本的に修正要望には応えられないので(不具合は対応するかも)、 ベビーにつかいたい場合はJavaScript(と簡単なJScript等)を利用できる方が メインにはなってしまいますが、 さすがに配布するにあたり、コード内にコメントを追加したり、 最低限の修正はしておきたいので、 それが完了したら、配布しようかと思います。 ※早ければ今日(8/10)中には。
画面サンプルは下記です。 (任意の番組の「TEXT表示」をクリックしたときのサンプル)
https://light.dotup.org/uploda/light.dotup.org667361.jpg.html パスワード:onsen
機能参考)
「TEXT表示」をクリックすると、その番組の データをブックマークレットと同様の3行テキストで、表示する。 ※この機能だけなら誰でも使える。
「番組ページ」は、既定ブラウザでその番組のWebページを開くだけ。
「BAT生成」は、ffmpegでダウンロードする用のbatファイルを デスクトップに出力するが、これは完全に自分仕様の中身で、 一緒にフォルダも出力したりし、ほとんどの人にとっては使わない内容が含まれる。 ※この機能については個々で改造が必要になると想定。
※注意事項等を記載したものは、配布時にテキストメモを同梱する予定。
|
Re: Webラジオの保存方法の質問はこちら【26】 ( No.109 ) |
- 日時: 2020/08/10 14:02
- 名前: No Name
- >>37 のブックマークレットの作者です。
>>108 に書いたツールを配布します。
・基本的にサポートはしません。 細かいところは同梱のテキストにメモがてら記載しています。
・「BAT生成」については、クリックしてしまうと、 ファイル(、フォルダ)自体はデスクトップへ出力されると思いますが、 バッチファイルの中身自体は完全に自分仕様のため、そのままでは使えません。 これを各自の環境にするには、各自でプログラムの修正が必要です。
・「TEXT表示」については、 特に変な処理はしていないので動作するハズです。 おひげさんのスクリプトと合わせて使うなどを想定しています。 ※ブックマークレット経由よりかはコピペで利用しやすくなると思います。 当ツールで表示している内容がブックマークレットのものと異なっていたら、 指摘があれば修正対応します(たぶん)。
・配布(アップロード)先は下記です。 外部のアップローダーを利用しています。 ※そのうち消える類です。その際、私からは再アップロードはしません。
https://dotup.org/uploda/dotup.org2224137.zip.html パスワード:onsen
※zipファイルを解凍して入っている、 「音泉Playlist取得ツール_20200810配布版」フォルダの中身の 「index.hta」、「js」フォルダ、「css」フォルダは 必ず同じフォルダの中に入れたままにしておいてください。 中に入っているファイル・フォルダ名を変更すると動作しません。
※「音泉Playlist取得ツール_20200810配布版」という フォルダ名は任意に変更したり、任意の場所に移動したりは自由です。
|
Re: Webラジオの保存方法の質問はこちら【26】 ( No.112 ) |
- 日時: 2020/08/11 00:25
- 名前: No Name
- >>110 報告ありがとうございます
スクリプト上は「'\n'(LF)」しか付与していないので、 もしかするとお使いの環境が影響しているかもしれません。
htmlのtextareaは環境によって、 あるいはtextareaの扱い方によって 改行コードの扱いが変わってきます。
試しに自環境(Windows 10 Pro バージョン 1909)で、 文字コードをtextarea内にそのまま吐き出すというのを、 アクセスの異なる4つの方法で試しましたが いずれのケースで確認しても「LF(0xA)」だけでした。
うーん・・・、もしかすると文字列の貼り付け先の方で 変換してしまったとか、そういうケースもあるかもしれません。 少なくともhta内での改行コードは前述通りです。
※確認に使ったコードは下記です。
// ---------------------------------------------------------------------- // テストボタン // 1.HTMLに「<input type="button" id="btnTest" value="test">」を追加しておく。 // 2.テストボタン押す前に、ログクリアをしておき、 // その後、いずれかの番組のTEXT表示をした後にテストボタンを押す。 $('#btnTest').bind('click', function(event) { event.preventDefault();
const getCodeStr = function(targetStr) { let output = '';
for (let i = 0, iMax = targetStr.length; i < iMax; i++) { output += (i > 0 ? ' ' : '') + targetStr.charCodeAt(i).toString(16).toUpperCase(); }
return output; };
// case1 // let ele = document.querySelector('#logs'); // if (ele === null) { return; } // let disp = getCodeStr(ele.value);
// case2 // let ele = document.querySelector('#logs'); // if (ele === null) { return; } // let disp = getCodeStr(ele.textContent);
// case3 // let $logs = $('#logs:eq(0)'); // if ($logs.length != 1) { return; } // let disp = getCodeStr($logs.val());
// case4 let $logs = $('#logs:eq(0)'); if ($logs.length != 1) { return; } let disp = getCodeStr($logs.text());
logs.log('==============================', true); logs.logAndScroll(disp, true);
});// #btnTest click
|
Re: Webラジオの保存方法の質問はこちら【26】 ( No.114 ) |
- 日時: 2020/08/11 01:05
- 名前: No Name
- >>111
私のツール >>109 、使い勝手が悪くて本当に申し訳ないです。
技術的に言えば、(データの取得は)響よりは音泉の方が簡単ではあるのです。
inoviaさんの開発に時間がかかったり、 おひげさんのツールの使い勝手が良かったりするのは、 (もちろん善意で開発する時間を割いているというのもありますが) 簡単に言うと、多くの人ができるだけ優しく使えるように、 工夫したり、親切な内容でモノヅクリをしているからなんです。
一方、私が開発しているものは、 私自身の環境でさえ使えればいい、動けばいいという、 モノグサでテキトーで、ナゲヤリな方法で作っているからなのです。 ですので、人を選んでしまう。
開発者目線で言うと、inoviaさんやおひげさんの配慮はすごいなぁと思います。
|
Re: Webラジオの保存方法の質問はこちら【26】 ( No.143 ) |
- 日時: 2020/08/18 23:18
- 名前: No Name
- 以前の関連コメント >>37 >>108 >>109
・自作のブックマークレット(仕様変更版)とHTAを手動連携する版を作成。 ・バッチファイルのテンプレート化(外だし)、及び開発者独自仕様を削除。 ・音泉と通信してデータを取得する機能は残している(選択可)。 ・ブックマークレットの方を使えば、 もしかするとプレミアム会員のデータも処理出来ているかもしれない (私が非会員なので確認できず。ツール上、プレミアムを弾く処理を無くしただけ)。
あとは同梱しているテキストファイルを参照のこと。 ・00-使い方、注意事項_Shift-JIS.txt ・01-ブックマークレット_Shift-JIS.txt
================== 基本的に当ツール(HTA)は、ffmpegのコマンドを知っている(調べられる)、 かつ、バッチファイルを修正できる人向けのツールです。 フロントエンド的に使ってもらえれば。
汎用性を上げたのと、設計を少しユーザーに寄せたので、 扱える人が以前のバージョン(2020/08/10版)より増えたとは思います。
================== ・配布(アップロード)先は下記です。
外部のアップローダーを利用しています。 ※そのうち消える類です。その際、私からは基本的に再アップロードはしません。
https://dotup.org/uploda/dotup.org2232384.zip.html パスワード:onsen
================== ・追記:バッチファイルのテンプレートについて
実装的には、「template.txt」をテキストファイルとして読み込んで、 そこに記載されている識別子を番組名などに置換して、 「〜.bat」というファイル名で、テキストとして出力しているだけです。
ここはそれしかしていないが故に汎用性があるので、 template.txtの中身はバッチにする必要性も、 ffmpegを呼び出す必要性もありません。 テキストなら、template.txtの中身はなんでも行けます。
ただ、テキストで扱う文字コード、改行コード、 ファイル名・拡張子はHTA内の記述で決め打ちにしているので vbscriptなりjscriptなり別言語なりで出力する場合、 出力ファイルの拡張子や文字コード等を手動で変換するのが面倒な場合は、 HTAの中身の修正も必要です。 ※createBatchFileという名前の関数をちょこっと修正するだけです。 識別子の定義もJSON(連想配列)でキーと値をマップさせているだけなので、 追加も容易にできます(渡ってくるパラメータを 増やしたい場合は呼び出し元の修正が必要になりますが)。
|
Re: Webラジオの保存方法の質問はこちら【26】 ( No.147 ) |
- 日時: 2020/08/24 20:26
- 名前: No Name
- >>144
長い投稿ばかりで申し訳ないですが、参考までに・・・
私は2015年頃にリリースされた古いffmpegを使っているのですが、 その現象に頻繁に遭遇しており、諸事情でffmpegのバージョンを使い分けているため、 該当の現象が発生する環境については、 復号用のkeyファイルを手動でダウンロードして、 リストを書き換え、keyファイルをダウンロードしたローカルのファイルを参照する方法で対処しています。
響や音泉の番組などはHLSでストリーミング配信されており、 概ね仕組み的には、「最初のプレイリスト(m3u8ファイル)※複数のプレイリストの定義」、 「個別のプレイリスト(m3u8ファイル)」、 「復号用のkeyファイル」 の順番で参照されています。
実際の番組のデータは数十〜数千という細かい単位で分割されており、 しかもそのデータは暗号化されています。
ここでいう「個別のプレイリスト」の中で 分割されたデータの場所などが定義されており、 かつ復号用のkeyファイルの場所の定義もされています。
ffmpegは、「最初のプレイリスト」を指定するだけで 「個別のプレイリスト」を参照しに行ってくれて、 それを基に分割されたデータをダウンロードし、 復号し、結合するという一連の流れを行ってくれています。
話を戻すと、要はデータが暗号化されているのでそれを解除するために、 復号用のkeyファイルを参照することが必要なのですが、 参照時にそのkeyファイルにアクセスできない、 あるいは正常に読めこめないエラーなどが出た場合、 当然、復号できない=暗号化された状態のままになっている可能性があります。
分割されたデータのごく一部がそういう状態になっていると、 もしかすると再生時にその部分が正常に再生できない可能性は出てきます。 もし出力(ダウンロード)されたデータを再生して それっぽい問題が出ていなかったなら、そのまま放置しても良いものですが、 再生に問題が出ていたら、複合ができなかった部分が原因になっていると思います。
問題が出ていた場合、色々対処しても解決しなかったら、 冒頭に書いた通り、手動でkeyファイルをローカルに保存して、 「個別のプレイリスト」上の復号用のkeyファイルの場所を そのローカルの場所に変更すれば、この問題自体は解決できます。 (ただ響の場合、手動でダウンロードしようとしたときに 後述の不正データを返す確率が割と高い)
keyファイルをローカルの参照に変更する場合は、 単純にその修正だけでは動作しません。 ffmpegでは「最初のプレイリスト」ではなく、 「個別のプレイリスト」の方を指定する必要がありますし、 「個別のプレイリスト」で定義される分割されたデータのURLが 相対パスになっていることが多いため、 絶対パスに書き換える必要もあるため、手動でやると割と面倒な作業になります。
補足として、ffmpegを実行する際は、事前にbatファイルにしておき、 最初のプレイリストの方でダウンロードしないようにしておく必要もあります (ツールを使うと「最初のプレイリスト」の指定にせざるえないので、後でそこを書き換えるため)。
※蛇足として、自分はその書き換えを自動化するスクリプトを作っていますが、 今のところ公開するつもりはありません。この辺の手法も今回は割愛します。
あと、響の場合は、 keyファイルに直接アクセスしようとしたときや、サーバに負荷がかかっている場合など、 4byteの「null」という文字列になっている不正なデータを返却する確率が高いです。 (暗号化にAES-128が用いられてる場合、16byteのバイナリデータを返却してくるのが正常)
※この響側で不正なデータ(エラー)を返してくるケースの場合、 おそらくffmpegで赤字の「Unable to read key file」エラーを出していると思います。 どういう状況の時に確実に発生するか、または解消できるかは個人的には特定できていませんが、 経験的には時間をおいてからアクセスすると正常なデータを返すようになることが多いです。 ただセッション等を見ているのか、一度発生すると、 手順をやり直さないと、ほぼ100%の確率でエラーが再現し続けます。 音泉の場合、こういった現象がないので、 おそらく響側のサーバで環境・状況によって何らかの処理・対処・制限をしているのだと思います。
|