見出し画像

オンライン動画をダウンロードするyt-dlpをバッチファイルから起動する

本日、ネットで調べものをしていた際、たまたま「yt-dlp」という動画をダウンロードするためのツールがあることを知り、自分なりに使いやすいように試行錯誤してセットアップしたので、そのメモ。

(2024/11/04 追記修正)
  ・一部の記述を最新化
(2024/09/09 追記修正)
  ・一部の記述誤りを修正
  ・冒頭に記事まとめを追加

【冒頭まとめ】yt-dlpの使用と起動バッチファイル作成時の注意点

この後書いていることの要点を先にまとめておく。
悩んだり調べたりした経過を含めて書いたら、物凄く長文になってしまったので、ポイントだけ知りたい人はここを読んでもらえば良い。
それぞれの詳細は、この記事の各項を参照してもらえれば。
私が引っ掛かったポイントなので万人にとっての注意点ではないかもしれないが、同じことで悩んでいる人の参考になれば幸い。

  • Chromeのログイン情報を使用したい場合、Chromeが起動していると処理に失敗する。この場合、事前に「--cookies-from-browser chrome --cookies cookies.txt」オプションで実行して「cookies.txt」を作成し、動画のダウンロード時には「--cookies cookies.txt」を指定する

  • オプション無しで実行すると自動的に最高画質でダウンロードしてくれるが、Youtubeの4K動画は標準でwebm形式となる。MP4にしたい場合には、明示的に「-f "bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4] / bv*+ba/b"」と指定する

  • 保存先指定時、yt-dlpではタイトル等のメタ情報を指定する際、「%(title)s」のように記述するが、バッチファイル内で「%(title)s」と記述すると正常に動作しない。「%」をエスケープしてあげる必要があるため、「%%(title)s」と記述する

  • Youtube動画の場合、そのURLは「~watch?v=xxxxxxxxxxx」のようになるが、バッチファイルでは「=」が引数の分割点(空白文字で区切った場合と同義)と見なされるため、「%1」で引数を取得すると「~watch?v」と途中までしか取得できない。これを回避するには、コマンド入力時に「"~watch?v=xxxxxxxxxxx"」のように二重引用符で囲む

  • 二重引用符で囲んだ引数をバッチファイル内で処理する際、内部の記述を「"%1"」としていると、二重引用符の重複でエラーになる。これを回避するには、「"%~1"」と記述する

  • バッチファイル内でブランク文字列を表現するには「 [] 」(中かっこ)を使用する。例えば、「IF [%PATH%] == [] 」のように記述する

  • なお、「=」で引数が分割される問題については、「%1」ではなく「%*」で引数を取得すれば良いらしい(未検証)

それでは、ここから↓が記事本文です。

ツールの概要からセットアップまで

これまでのこと

Amazon FireTV Stickを導入して以降が顕著になったが、我が家ではテレビの視聴時間が減り、Youtubeやその他の動画コンテンツを見ている時間が増えた。
Youtubeでは多くの人が様々な動画を日々アップしているが、同時に削除や非公開となる動画も数多くあり、ある日見て気に入っていた動画が、しばらく後に見ようとしたとき、いくら探しても見つからないみたいなことがある。
このような泡沫性の高いネットのコンテンツに対し、私は「何でもかんでも手元に保存しておきたい(後で使うかは別にして)」という一種病的なクセがある。(このあたり、現代っ子からすると感覚が異なっており、「保存?ネットで見ればいいんだから、いらないのでは?」ということらしいが。)

これまで、この用途には「StreamFab」というソフトを使用してきた。DVDFabで有名な、DVDFab社が出しているツールである。
導入以前は、ダウンロードが可能とうたっているWebページを使用していたが、「正常にダウンロードできない」「ダウンロード等に時間がかかりすぎる」「広告表示がうるさい」「4Kなど最新動向に対応していない」等々、使い勝手の悪さに辟易し、それなりに高額なのだが、多くのサイトに対応していることもあり、思い切って「StreamFab」を導入した。
さすがに高額なだけあって、使っていて概ね満足していたのだが、細かいところで何点か不満も出てきた。

  • 私の環境だけかもしれないが、最新のx64版で、FHD(1920×1080)より上の画質でダウンロードしようとすると、ダウンロードができない場合がある(なぜか数日たつとダウンロードできるようになる。また古いバージョンのx86版ではこの現象が発生しない。不具合報告をしたが、音沙汰無し)
    ※2024年11月時点で、この不具合はいつの間にか無くなっていた。

  • チャンネルを登録し、スケジュール実行で自動ダウンロードできるが、登録するより以前の動画は手動でダウンロードする必要がある

  • 年齢制限のある動画の場合などで、「Chromeで一旦ログアウトしてからログインし(ログイン切り替えでは不可)、Chromeを閉じてからダウンロード」という面倒な手順を踏む必要がある。さらに、このログイン状態を長く維持できず、ほぼ毎回上記操作を行う必要がある

yt-dlpはどういうツールなのか

yt-dlpは、Youtubeをはじめとするいくつかのオンライン動画をダウンロードし、ローカルファイルとして保存できるツール。
今まで、Goolgeで動画のダウンロードについて検索して調べた際に自分は見かけたことが無く、たまたま全く別件の調べものをしているときに見かけ、調べてみたところ、上記のStreamFabにおける不満点をだいぶ解消できそうだと考えた。もっと前に見つけていなかったことが悔やまれる…。

GituHubで公開されており、無保証だが無料で使えるフリーソフト。(パブリックドメイン)
CUIなので、コマンドラインから実行する点は、人によっては敷居が高く感じるかもしれないが、私はそれほど気にしない。ただし、どう考えてもオプション指定が必要そうだし、覚えておくのは不可能なので、その点をクリアしていく必要はありそう。

バイナリ配布はこちら。

起動オプション等の説明はこちら。

yt-dlpを導入する

導入は難しくなく、適当なフォルダを作成し、ダウンロードしてきたバイナリを置くだけ。
なお、ffmpeg、ffprobeを同時に導入した方が、より柔軟に使える様子。
詳しくはここで書くより、参考にさせていただいた次のページを見てもらった方が早い。

というわけで、さっそくWindows用のバイナリをGitHubからダウンロード。
ffmpeg等は「yt-dlp用に最適化された」というやつをダウンロードした。(上述のGigazineのページで紹介されている)

アップデート、ヘルプをバッチファイルとして用意しておく

仕様が頻繁に変わる動画サイトに対応するため、yt-dlpはコマンドから最新版へ更新する機能を備えている。今後のことを踏まえて(コマンドを覚えなくても)ダブルクリックだけでアップデートできるように、バッチファイルとして保存することにした。

@echo off
echo.
yt-dlp -U
echo.
pause
exit

また、コマンドの起動オプションを調べようと思い、「yt-dlp /?」としても残念ながらヘルプが表示できなかった。このため、これも後で同じことを繰り返さず済むように、バッチファイルにしておいた。
(この後、上で貼ったリンク先にあるWebページでのヘルプに気づいた。ブラウザからボタン一発で翻訳がかけられる分、Webページの方が有用性が高いので、このバッチファイルは今後、使わないかもしれない。)

@echo off
echo.
yt-dlp --help
echo.
pause
exit

yt-dlpをバッチファイルから起動する

ここからが本番。起動オプションの指定でやりたいことは、おおむね次のとおり。

  • ブラウザからURLをコピーし、貼り付けて指定 ※現段階では

  • 対象指定が単一の動画でもチャンネル全体でも対応

  • 常に最高画質

  • 保存形式はMP4

  • 指定したフォルダへ保存する

  • ファイル名に動画タイトルの他、動画IDや制作者名、アップロード日などの情報を入れる

  • Chromeのログインを参照(年齢制限等への対応)

  • サムネイル埋め込み機能があるらしいので、利用したい

ヘルプや説明ページを参照しながら、最初に想定した起動バッチファイルの中身は、次のとおり。

@echo off
echo.
yt-dlp --output "【ここはDL先のパス】\%(title)s [%(id)s][%(uploader)s].%(ext)s" --cookies-from-browser chrome --embed-thumbnail --format "bestvideo#91;ext=mp4]+bestaudio#91;ext=m4a]" --console-title %1%
echo.
pause
exit

ところがこのバッチファイルでは正常に動作しなかった。問題解決のためにいろいろと試行錯誤した結果、意外と時間がかかり、早朝から始めて夕方くらいまでかかってしまった。
それは、yt-dlpの問題というよりは、どちらかというとバッチファイルの仕様に引っ掛かったところが多かった。
ここでは引っ掛かったポイントとその解決をいくつか記しておく。

Chromeのログイン情報が参照できないことへの対応

説明ページやヘルプでは、ブラウザからcookieの情報を取得するためには「--cookies-from-browser ブラウザ名」と指定するとあるので、この通り試すとエラーで止まってしまう。

Extracting cookies from chrome
ERROR: Could not copy Chrome cookie database. See  https://github.com/yt-dlp/yt-dlp/issues/7271  for more info

「Could not copy Chrome cookie database.」とあるので、何らかの理由でChromeのcookieが取得できていないのか?と思いつつ、「See~」以下で指定されたページを見てみる。

翻訳して眺めていくと、

Chromeブラウザが開いているときにChromeからCookieを抽出できません。Chromeのすべてのウィンドウを閉じた後は正常に動作しますが、何が問題なのかわかりません。

https://github.com/yt-dlp/yt-dlp/issues/7271

と書かれていることに気づく。
道理で、説明ページだとFirefoxを例にとっているケースばかり見かけたわけだ。また、StreamFabでログイン情報を使用する場合、わざわざブラウザを閉じる必要があったのも同じ理由だと考えられる。

で、解決策を探さなければいけないのだが、まずこんなページを見つけた。

なるほど、「yt-dlp "URL" --cookies-from-browser chrome:プロファイル名」と指定すれば良いらしい。
また「プロファイル名」は

chrome://version でシステム情報を開き、「プロフィールパス」に表示されたパスを確認する。この末尾、具体的には /path/to/your/profile の場合 profile の部分がプロファイル名として扱われる(らしい)。

https://gist.github.com/haxibami/1ad8dcc4a0fc845040cc2b955802f86f

とあるので、さっそく試してみるも、「プロフィールパス」の欄に出てきたのは次のような記述。

C:\Users\【ユーザ名】\AppData\Local\Google\Chrome\User Data\Default

説明ページにある「/path/to/your/profile」の形式にはとても思えず…。
(「your」が「【ユーザ名】」だとしても、「profile」が「Appdata~Default」ってことはないような気が。)

困ってさらに調べると、次のようなページを見つけた。

エラー理由
ブラウザが起動している場合、ブラウザがCookiesファイルを専用アクセスモードで開いている。そのため、yt-dlpCookieにアクセスできず、エラーになる。
対処法
下記、3通りの対処方法があるが、本エントリーでは②と③を説明する。
① 動画ダウンロード時にブラウザを起動しない。
② ブラウザ起動時に、Cookiesファイルを専用アクセスモードで起動しないようにしておく。
③ あらかじめ、Cookieを.txtファイルで出力しておき、yt-dlp実行時には、出力したCookie.txtファイルを読み込ませるようにする。
(略)
③の対処方法
下記コマンドを実行する。
○コマンド
yt-dlp --cookies-from-browser brave --cookies cookies.txt
yt-dlp --cookies cookies.txt -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" [URL]
○コマンドの説明
一つ目のコマンドを入力し、Cookieを.txtファイルで出力しておく。
二つ目のコマンドで動画をダウンロード。[URL]はダウンロードしたい動画のURLに置き換える。
(例) yt-dlp --cookies cookies.txt -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" https://www.bilibili.com/video/XXXXXXXXXX/
※一つ目のコマンドは初回で一度実行しておけばよい。
次回以降、動画ダウンロード時は二つ目のコマンドのみ実行。

https://metropoliskun.hatenablog.com/

なるほど、Chromeが動作中はcookieを排他制御するなら、あらかじめcookie情報をエクスポートしておこう、という機能がyt-dlpに備わっているらしい。
この方法で、とりあえずエラーが出なくなった。
今後のためにと思い、cookieを抽出する挙動もバッチファイルにしておいた。(もう使わないかもだけど)

@echo off
echo.
yt-dlp --cookies-from-browser chrome --cookies cookies.txt
echo.
pause
exit

※2024/11/4追記:
先日、このバッチファイルで抽出したcookies.txtを使用しても、ログインが必要な動画をダウンロードできないケースが発生した。
改めてこのバッチファイルでcookies.txtを再作成しようとしても、エラーが出て正常に作成されない。
ざっと調べる限りだが、現在のバージョンのChromeの仕様上の問題のようである。yt-dlpのフォーラムで、それっぽい書き込みが見つかる。外部ツール(Chrome拡張で、Cookie情報をファイル化するもの)を使えば回避できるらしいが…
私の場合、複数のブラウザを導入しているので、あきらめてFirefoxからcookies.txtを作成した結果、現在のところは正常に動いている。(Firefoxから生成する場合には、上のバッチファイルの「--cookies-from-browser chrome」のところを、「--cookies-from-browser firefox」に変更する)

動画の画質やフォーマットを指定する

実はオプション指定を何もつけなくても、4K動画をダウンロードすれば4Kで保存してくれた。ただし、フォーマットはwebmとなっていた。
一部のアプリ(FireOSで動くアプリとか)だとwebmにうまく対応してくれなかったりするケースが過去にあったので、できればMP4にしておきたい。

正直、指定方法が良くわからなかったので、公式のサンプルにあるものをそのまま引用することにした。公式の説明では、
「# Download the best mp4 video available, or the best video if no mp4 available」
と書かれている。

yt-dlp -f "bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4] / bv*+ba/b"


保存先フォルダ、保存ファイル名を指定する

正直、これがかなりドツボにはまった。(結果から言うと、原因はバッチファイルの仕様だった)
初期に想定した指定は、次のとおり。

yt-dlp --output "【ここはDL先のパス】\%(title)s [%(id)s][%(uploader)s].%(ext)s"

ところがこの指定だと、「 (id)s][%(uploader)s].MP4 」というファイル名になってしまう。どう見ても%で指定する変数が、その中身ではなくて変数名が展開されてしまっている。

  • おかしくなっている位置から考えるに、中かっこ([])やスペースが悪さをしているのでは?と推測。なので、中かっこやスペースを削除して何パターンか試してみるも、全く改善せず

  • ヘルプによると、「Pythonの文字列フォーマット操作だよ」と書かれているので、そのあたりも検索。すると、中かっこ([])のことは書いていないが波かっこ({})について、「2つ重ねると1つの {} を出力できる({}のエスケープ)」と書かれているので、これも真似してみるが改善せず

  • ヘルプには他に「%リテラルを使用するには、%%」という記述があるので、"%["(中かっこの前に"%"を置く)を試すも、改善せず

そもそもヘルプに「現在のデフォルトのテンプレートは %(title)s [%(id)s].%(ext)s」と書かれていて、これをそのまま書いてすら通らないので、根本的に何かが間違っているっぽい。

さんざん悩み、検索して回った末に見つけたのが、次のページ。

このページ、オプションを全部解説してくれていて(ありがたい)大変長大なのだが、その「OUTPUT TEMPLATE」の末尾に用例としてこんなことが書いてある。

#例えばこんな感じで使う
 -o "%(title)s-%(id)s.%(ext)s"
#Windowsのbatch fileで使う場合は%をエスケープする
 -o "%%(title)s-%%(id)s.%%(ext)s"

https://masayoshi-9a7ee.hatenablog.com/entry/2021/11/06/112639

「これだー!」と。
言われてみれば、Windowsバッチファイルにおいて、"%"は環境変数の参照など特殊な動作に使われている。なので、"%"をエスケープしてあげる必要があったわけだ。
これを踏まえて書き直したのが、次のとおり。

yt-dlp --output "【ここはDL先のパス】\%%(title)s [%%(id)s](%%(uploader)s,%%(upload_date)s,%%(duration>%%Hh%%Mm%%Ss)s).%%(ext)s"


--output関連でいくつか

  • 動画の日付を取得する機能としては、release_date(動画のリリース日)と、upload_date(動画のアップロード日)があるが、試した範囲ではYoutubeでは、release_dateは取得できなかった(NA表示)

  • 動画の長さを取得する機能として、durationとduration_stringがある。ヘルプや説明ページを見ると、duration_stringは「HH:mm:ssで表される動画の長さ」機能っぽいが、単純に「%(dutation_string)s」とすると、例えば1分4秒の動画なら「104」と出力される。使いにくい

  • ここでヘルプに記載のある書式設定を参考に、「%(duration_string>%Hh%Mm%Ss)s」とする(先ほどの例なら「1m04s」と出力されるのを期待)も、期待した通りにはならず「0h0m104s」と出力される。なのでここは素直に「%(duration)>%Hh%Mm%Ss」とすると、「00h01m04s」で出力できる。

  • 上の%durationの指定を使用した際、1時間も無い動画は「00h」の部分を省略したいが、「フィールドが空の場合のリテラルデフォルト値を指定できる」という--output-na-placeholderを使用してもうまくいかない。(具体的には、「--output-na-placeholder ''」として、フィールドが空ならブランクと置換される想定の指定をしたが、「00h01m04s」の出力が「''」に置き換わった。つまり、hだけ消すというような演算にならないということに加え、「''」ではブランクを表現できていない)

  • 途中経過として「ファイル名がうまく指定できないなら、せめて出力先だけでもコントロールしよう」と思い、「--output 【ここはDL先のパス】\」と記述したが、エラーで動かなかった。後でヘルプを見ていたら、「--output」の説明のすぐ上に「--paths」というオプションを見つけた。つまり、①ファイル名を指定する場合には--output(フォルダも一括して指定できる)、②フォルダだけ指定する場合には--paths、ということらしい


バッチファイルに渡す引数として「=」が処理されない

対象とする動画のURLは手動で貼り付けてyt-dlpを起動することとし、バッチファイル内では次の通り記述している。(実際の指定から簡略化して表示)

yt-dlp %1

ところがこの時、ブラウザからYoutubeの動画URLをコピーし、次のように入力(ここでは、バッチファイル名は「_dl」)しても、何も実行されずに終わってしまう。

_dl.bat https://www.youtube.com/watch?v=xxxxxxxxxxx

画面に表示されるログをよく見ると、

[generic] Extracting URL: https://www.youtube.com/watch?v

と表示されており、URLのうち肝心の「?v=」以降が引き渡しできないないことが伺える。
であれば、バッチファイル内で「yt-dlp "%1"」のように二重引用符("")で囲ってあげればどうか?と思ったが、残念ながら改善せず。

これについても、検索してヒントになりそうなページを発見。

バッチファイルのパラメータでは = や ; が空白と等価に扱われてしまうという問題があります。
(略)
おおかたは互換性のためだと思われますが、結論から言うと

二重引用符の中の = ではパラメータは分割されない
%* 内では = が消えることはない
ようです。対策としては呼び出し時に二重引用符で囲んでもらうのが一番てっとり早いようです。

https://zenn.dev/zetamatta/books/c84cbe23093eee1b5830/viewer/parameq

つまり、

https://www.youtube.com/watch?v=xxxxxxxxxxx

のようなURLをバッチファイルへ引き渡すと、

%1 = https://www.youtube.com/watch?v
%2 = xxxxxxxxxxx

と解釈されているので、「yt-dlp %1」の指定ではURLが正常に処理されていない、ということ。
これを回避するには、コマンドラインでバッチを起動する際に、

_dl.bat "https://www.youtube.com/watch?v=xxxxxxxxxxx"

のように、URL部分を二重引用符("")で囲ってあげればok。
ok、なんだけど、正直毎回これを指定するのは面倒くさいので何とかしたい…。

引数が二重引用符で囲まれているか否かに関わらず、バッチファイル内で二重引用符を付けて処理する

先ほど、バッチ内での記述を「yt-dlp "%1"」と囲んだが、この状態でバッチファイル起動時の引数(URL)も二重引用符("")で囲むと、二重引用符の重複で、それはそれでエラーになる様子。
これについては、

引数
(略)
%~1 %~2 の様に % と数字の間に ~ をつけると、引数が "..." で囲まれていればそれを除去します。"C:\Program Files\..." など空白の入った文字列を渡す際に有効です。
echo "%~1"

https://www.tohoho-web.com/ex/bat.html

とあるので、これで解決できる。
バッチを起動する際(面倒くさいので)できれば二重引用符の入力をしないので、ユーザの入力に対して「二重引用符があってもなくても動くように」と考えると、この指定が今後生きてくる。
(けれど、現状ではそもそも引数に二重引用符を加えないと正常に引数が渡せないので、これだけでは解決できない。)

※余談となりますが、html2.0の頃、リファレンス片手にテキストベースのhtmlエディタでWebページを作っていた頃、とほほさんのHTML事典、CSS事典には大変お世話になりました。(私が使っていたEz-Htmlというツールで氏のページをヘルプとして利用連携していたことも大きい)
氏が今でもわかりやすいリファレンスを公開されていることは、大変ありがたく思いました。

ユーザが引数を二重引用符("")で囲むか否かを意識せずに、=を含む引数を処理できるようにする (with バッチファイル内でブランク文字列を扱う)

で、どうしても二重引用符("")を囲む手間を減らしたく、何とか解決策を考えてみた。

  • 引数に=を含む場合、=以降の文字列は第2引数に入っているはずだから、「第1引数」+「=」+「第2引数」の文字列を作れば良いはず

  • 引数に=を含むか否かは「第2引数がブランクであるか」で判断することにする(バッチファイルには、ユーザ視点では常に一つのURLだけ渡す運用になる)

  • 整理すると、①第2引数がブランクなら、第1引数をそのまま実行ファイルへ渡す、②ブランクではないなら、「第1引数」+「=」+「第2引数」を実行ファイルへ渡す

条件分岐はif文で可能だが「ブランクであるか」の記述方法が良くわからない。とりあえず、

set tid=%~1
if %2=='' set tid=%1==%2
yt-dlp "%tid%"

としてみたが、思ったように動かない。

例によってネットで検索してみると、

では、更なる正解は、これらしいです。
 IF [%PATH%] == []

https://qiita.com/nopasanada/items/27b69a133a78fbda4e98

なんと、中かっこ([])で囲む。今まで見たことないけど、確かにこれで動作した。

あと、文字列を連結する際、「=」は重ねて「==」が正解だろうと思ったが、こうすると「~?v==xxxx」と、「==」のまま連結されてしまう。
なので、「set tid=%1=%2」で正常に動く。
動くのだが、なんかすごく気持ち悪い書き方なので、

以下の半角文字が、バッチファイルにおける特殊文字です。>
<
%
|
(略)
特殊文字を扱う方法は、特殊文字の前に「^」(キャレット)を付けることです。

https://tecsingularity.com/windows/escape/

「=」に効くとは一言も書いていないが、「set tid=%1^=%2」とすると、一応正常に「~?v=xxxx」と出力されるようになった。

ここまでのまとめ(本日の完成形)

というわけで、最終的にできあがったコードが次のとおり。

@echo off
setlocal
echo.
set tid=%~1
if not [%2]==[] set tid=%1^=%2
echo.
yt-dlp --output 【ここはDL先のパス】\%%(title)s [%%(id)s](%%(uploader)s,%%(upload_date)s,%%(duration>%%Hh%%Mm%%Ss)s).%%(ext)s" --cookies cookies.txt --embed-thumbnail --format "bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4] / bv*+ba/b" --console-title "%tid%"
echo.
pause
endlocal
exit

バッチファイルはyt-dlpと同じフォルダに置いておき、
①保存したい動画をブラウザで開き、URLをコピー
②コマンドラインを起動
③「_dl.bat 【動画URL】」で実行
で使用することができる。

なお、作るのに時間を取られすぎて、実際にはまだ使えておらず検証が十分ではない。
チャンネル一括保存とかも、理論上はこれでできるはずだけど…
別に時間をとって試してみよう。

=を含む引数処理についての別解?

この記事を書いている中で、先ほど紹介したページを見返していて、ふと気が付いた。

%* 内では = が消えることはない

https://zenn.dev/zetamatta/books/c84cbe23093eee1b5830/viewer/parameq

今回のケースに限って言えば、第2引数による条件分岐とか面倒なことをしなくても、「%*」を使えば解決できていたのでは…?
(時間切れで未検証)


ブラウザからバッチファイルを起動する【未解決事項】

ここまでくると、正直、「URLをコピーして」「コマンドラインから貼り付けて実行」すら面倒くさい。
なので「ブラウザからバッチファイルを起動できないかなぁ」と考え、「スクリプトレットで実装できないか試してみた。
うまくいけば、スクリプトレットをブックマークバーに登録しておくことで、「動画ページを開いたら、スクリプトレットのブックマークを押す」だけで動画が保存できるはず。

JavaScriptからバッチファイルを起動する方法については、次のページにあった。

スクリプトレットもちゃんと作ったことが無いので、参考になりそうなページ(ここでは割愛)を見ながらとりあえず簡単な挙動のものを試作し、正常に動作することを確認。
(スクリプトを1行でうまく動くように圧縮してくれるサイトとかも初めて知った)
続いてバッチファイルを起動するスクリプトを、同じような手順で1行へ圧縮し、ブックマークバーへ登録するが…動作しない。

試しに、スクリプトの後半に alert文を入れてテストメッセージを表示するようにしたりしたが、そもそもダイアログが出てこないことから、どうも途中のどこかで処理がこけている様子。

少しいじってみたが、結局解決できず。
なんとなくだが、「ブラウザ上で、ローカルスクリプトで、WScript.ShellのRunコマンドでローカルファイルを実行する」っていうのが、そもそもセキュリティ面で全然ダメな挙動なので、そもそもこの構造が原因なのではなかろうか…?
だとすると、根本的な解決策を考える必要がありそうなので、今日はこれは中止とした。
もしかしたら、Chrome拡張として実装する、とかが正解なのかもしれない。

いいなと思ったら応援しよう!

コメント

1
sirogane
sirogane

こんにちは。
Firefoxをメインに使っている事もありますが、表示中のページのURLを外部プログラムに渡す時、yt-dlpのアップデートや渡す引数を複数作ってダウンロードパターンの使い分け。
こういった事を「Open With」というAddonで管理してます。
記事を全て読んだり最新のを追っていないこともありますが、ご参考になれば・・

ログイン または 会員登録 するとコメントできます。
オンライン動画をダウンロードするyt-dlpをバッチファイルから起動する|mamoo
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1