昨日(2016年12月5日の日記参照)作成したYouTube動画のダウンロードスクリプトですが、ダウンロードできない動画が結構あることに気づきました。うまく行ったのは半々くらいかな。
私は昨日の目的(4K動画ファイルの中身チェック)を達成できたので、その他の動画がダウンロード出来ようが出来まいが、あまり気になりませんけども…。
もし気になる方がいたら改善してみてくださいまし。私も気が向いたら調べてみます。
この記事にコメントする
(追記)動画ファイルのダウンロードはほぼ間違いなくYouTubeの利用規約違反です。研究目的などでこのスクリプトを使うのは自由ですが、その結果YouTubeのアカウントが消されたり、Googleさんに怒られても責任取れません。あと私にも怒りを向けないでね…。
YouTubeの4K動画がSeaMonkeyで再生できないので、動画ファイル直接見てみたいなーと思ってYouTube動画ダウンロード用のブックマークレットを書きました。
javascript:
function add_link(mov_arg) {
var size = '??';
if (mov_arg.size) {
size = mov_arg.size;
} else if (mov_arg.quality) {
size = mov_arg.quality;
} else if (mov_arg.bitrate) {
size = (mov_arg.bitrate / 1000) + 'kbps';
}
var text = size + ',' + mov_arg.type.split(';')[0] + ' (itag:' + mov_arg.itag + ')';
var btn_container = document.getElementById('watch-headline-title');
var btn = document.createElement('a');
btn.href = mov_arg.url;
btn.style.fontSize = '1em';
btn.textContent = '[download:' + text + ']';
btn_container.appendChild(btn);
btn_container.appendChild(document.createElement('br'));
}
function conv_args(fmts) {
var list_split = fmts.split(',');
var list_mov = Array();
for (i = 0; i < list_split.length; i++) {
var args = list_split[i].split('&');
list_mov[i] = Object();
for (j = 0; j < args.length; j++) {
var pair = args[j].split('=');
list_mov[i][pair[0]] = unescape(pair[1]);
}
}
list_mov.sort(function(a, b) { return a.itag > b.itag; });
for (i = 0; i < list_mov.length; i++) {
add_link(list_mov[i]);
}
}
conv_args(ytplayer.config.args.url_encoded_fmt_stream_map);
conv_args(ytplayer.config.args.adaptive_fmts);
実行すると下記のスクリーンショットのように、動画タイトルの下にリンクが生成されます。リンクが邪魔だったら、リロードすれば消せます。
え、リンクが多い?私もそう思いますけど…、YouTubeは複数の解像度が用意されているので、仕方ないのです。
スクリプトをコピペしてブックマークのアドレス部分に貼り付ければ動きます。改行とかスペースなんざ無視してぶち込んでください。ブラウザさんは寛容なので細かいことは気にしないのです。
いちいちコピペするのは面倒なので、お気に入りのURL入力部分にスクリプトを貼っておけば、お気に入りから選ぶだけで実行できます。
鋭い方はお気づきかと思いますが、YouTubeには、旧Flashプレイヤー用の映像+音声一体の「旧動画ファイル」(itagが100以下くらいのやつ)と、HTML5プレイヤー用の映像、音声がバラバラになった「新動画ファイル」が存在します。
新動画ファイルは回線の速度によって適切なビットレートや解像度を選択(Adaptive Bitrate Streamingと呼ぶみたい)して送出できるように、ファイルの途中から送っても再生できるフラグメント化されたMP4形式が採用されています。
良い点は、回線が遅くても待たされないこと。悪い点は、えらく汚い動画になってしまう可能性があることです。恐らく同等の機能を採用しているNETFLIXへの対抗策だと思います。
そんな素晴らしい新動画ファイルですが、ダウンロードしてオフラインで楽しみたい人達には、実はあまり嬉しくありません。なぜなら、映像と音声がバラバラのファイルになっているため、ツールで映像と音声を1つのファイルにまとめなおすか、バラバラの映像ファイルと音声ファイルを同期再生できる特殊なプレーヤーでない限り、無音の悲しい動画しか楽しめないからです。
映像が不要で音楽だけ聴きたい人には軽くて便利なので、悪いことばかりだとも思いませんけど、大抵の場合は面倒になりますね。
今は旧動画ファイルが残っている(※)ので、そちらをダウンロードすれば特に問題はありません。しかしYouTubeはHTML5プレイヤーを標準にするなど、Flash脱却を目指して邁進中のため、いずれ全ての動画で旧動画ファイルが削除され、新動画ファイルのみとなるのは覚悟しておいたほうが良いでしょう。
(※)旧動画ファイルを抹殺してしまうと、メーカーに見放されてアップデートもされない、古いテレビのYouTubeクライアント辺りが動かなくなるのかもね?
この記事にコメントする
(追記)動画ファイルのダウンロードはほぼ間違いなくニコニコ動画の利用規約違反です。研究目的などでこのスクリプトを使うのは自由ですが、その結果、ニコニコ動画のアカウントが消されたり、ドワンゴさんに怒られても責任取れません。あと私にも怒りを向けないでね…。
以前(2012年10月25日の日記参照)作った、ニコニコ動画のダウンロード用のブックマークレットですが、ニコニコ動画がFlashからHTML5に移行した際に、ページ構成が変わって機能しなくなっていました。
直したのがこれ。
javascript: function received() {
if (request.readyState == 4 && request.status == 200) {
/* received */
var strurl = decodeURI(request.responseText);
strurl = new String(strurl.match(/url=[^&]+/));
strurl = strurl.replace('url=', '');
strurl = decodeURIComponent(strurl);
var btn_container = document.getElementById('videoHeaderDetail');
if (!btn_container) {
var btn_container = document.getElementsByClassName('GridCell HeaderContainer-videoTitle')[0];
}
var btn = document.createElement('a');
btn.href = strurl;
btn.style.fontSize = '2em';
btn.textContent = '[download]';
btn_container.appendChild(btn);
}
}
var docurl = document.URL;
var doccookie = document.cookie;
var flvurl = docurl;
flvurl = flvurl.replace('www.nicovideo.jp/', 'flapi.nicovideo.jp/');
flvurl = flvurl.replace('/watch/', '/api/getflv/');
var request = new XMLHttpRequest();
request.open('GET', flvurl, true);
request.withCredentials = true;
request.setRequestHeader('Cookie', doccookie);
request.onreadystatechange = received;
request.send('');
以前はHTMLタグのほとんどにidがついていたのですが、新デザインのニコニコ動画はほとんどidがついていません。困った。
まあ、無い物は仕方ないので、class名からそれらしいタグを引いてきて、当てずっぽうでダウンロードリンクを追加しています。
この記事にコメントする
JavaScriptの文字列はシングルクォート?ダブルクォート?
CやShellスクリプトを見なれているせいか、シングルクォートとダブルクォートは別物という意識が強くて、混ぜても何も問題ないのが、逆に怖い…。
メモ: 技術系の話はFacebookから転記しておくことにした。
この記事にコメントする
目次: プロバイダ
2015年8月に引き続き、もう1つのイーモバイル(今はワイモバイルですね)回線を解約してきました。
大阪に引っ越してきたときに固定のインターネット回線がなくて、契約したのが切っ掛けでした。以来LTE用の回線を増設したり、何となく続けていましたが、月4,000円掛かる割にほとんど使ってなくて勿体ないと思っていました。
今のノートPCクソ重いから持ち歩かないし、いざとなればスマホのテザリングもあるから、もう解約しても問題無いと思ったのが去年の春。1回線目は2年縛りの呪縛がすぐに解けた(2015年8月)のですが、2回線目は呪縛が1年半残っていた(※)のでした…。
今月晴れて2年縛りの呪縛が解けましたので、解約となりました。今までありがとう、お世話になりました。
(※)後で計算してみると、月額4,035円x 18ヶ月=72,630円に対し、機種代残り33,250円、解約違約金10,260円で、差額が29,120円でした。本当に全く使わないのであれば、解約違約金と機種代の残りを払って解約した方が良いみたいです。今更ですけどね。
この記事にコメントする
目次: プロバイダ
我が家のネットワーク環境は、NTT西日本のフレッツ・光プレミアム マンションタイプB(既に存在しない…) と、WAKWAKのざんまい光(だったかな、これも既に存在しない…)です。
どちらも10年近く前に契約したきり完全放置で、新規受付は終了している古いサービスです。
先日、ドコモから電話が来て「ネット代がお得になる」と言うので、試しにドコモ光に切り替えてみました。
クレジットカードの明細によれば、現在の支払額はNTT西日本に3,661円、WAKWAKに777円なので、合計で4,438円です。
フレッツはマンション ミニVDSL方式であれば3,693円(3,420円+税)のはずなのに、金額が違うのが気になりますが、もはや確かめる術がありません。WAKWAKは864円(800円+税)ですが、長期利用割引で1割引となっているようです。
一方のドコモ光タイプBは月額4,536円(4,200円+税)になると思われます。
あれ?月98円だけど高くなってない?どうなってんのこれ??
ドコモ光の契約事務手数料で3,240円(3,000円+税)取られるので、2年分の差額 2,352円を遙かに超えてさらに損します。
しかも解約したくてもドコモ光は携帯同様の2年縛りが適用され、解約金は8,000円もするボッタクリです。
あと、これはドコモ光のせいではありませんが、光プレミアムから光ネクストに切り替えるとCTUが引き上げられてしまいます。CTUが無くなるということは、ルータの役割をしていた機械が無くなるということです。
幸いにも我が家にはルータがありましたが、もし光プレミアムを複数人で利用していて、なおかつPPPoEルータを持っていない人の場合は、PPPoEルータの購入のためさらに5,000円〜1万円程度の出費が必要になります。
ドコモ光に変えて良かったか?と聞かれたら、我が家の場合、どう見てもマイナスでした。2年後に解約だ…。
この記事にコメントする
先日(2016年11月20日の日記参照)に引き続き、新しく購入したZenfone 3 Deluxe 5.5インチモデルの話です。
最初は日本メーカーを検討していましたが、SoCはSnapdragon 820とハイエンドなのに、なぜRAM 3GBなのでしょう?
今使っているSH-01F(2年前のAndroid 4.4でRAM 2GBのスマホ)ですら、バックグラウンドのアプリが死にまくってメモリ足りないなーと思うのに、Android 6でRAM 3GBはアンバランスすぎません…?
性能がアンバランスなだけなら文句はないのですが、どのメーカーも同じで、見ていて面白くないのが辛いです。
そういえば今回、初のSIMフリーのスマホを買いました。ドコモのSPモードはSIMフリー機にも開放された(2015年くらい?)ので、APNを設定すれば使えます。とっても簡単です。
ドコモのキャリアメールはIMAPで受信できるように設定変更が必要です。忘れていたら前のスマホにSIMを戻して設定すれば良いだけですから、あまり悩む必要はありません。
買った嬉しさで古いスマホを売り払ってしまっていると、面倒なことになりますが、いきなりそんなことしないよね…。
機種によってはLTEの対応周波数が足りなくて、ドコモのLTEが全然使えねー!てなことになるらしいですが、Zenfoneはそんなこともなかったし、楽なもんでした。
この記事にコメントする
| < | 2016 | > | ||||
| << | < | 12 | > | >> | ||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| - | - | - | - | 1 | 2 | 3 |
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
25年10月15日
25年10月18日
22年5月5日
25年10月19日
23年4月11日
06年4月22日
25年10月17日
25年10月6日
25年10月13日
20年10月23日
25年10月12日
20年8月29日
19年1月13日
18年10月13日
18年9月3日
18年8月20日
18年7月23日
18年7月22日
18年10月14日
18年11月10日
wiki
Linux JM
Java API
2002年
2003年
2004年
2005年
2006年
2007年
2008年
2009年
2010年
2011年
2012年
2013年
2014年
2015年
2016年
2017年
2018年
2019年
2020年
2021年
2022年
2023年
2024年
2025年
過去日記について
アクセス統計
サーバ一覧
サイトの情報合計:
本日: