「YouTube (Music)のプレイリストのギャップレス再生」の版間の差分

Notion-MW
Notion-MW
96行目: 96行目:
<ul>
<ul>
<li><p>ytp.bat(最初に呼ばれるランチャー)</p>
<li><p>ytp.bat(最初に呼ばれるランチャー)</p>
<syntaxhighlight lang="</syntaxhighlight></li></ul>">
<syntaxhighlight lang="c">cd %~dp0
c cd %~dp0 set &quot;snd=%2&quot; if &quot;%2&quot;==&quot;&quot; set &quot;snd=0&quot; start &quot;&quot; &quot;ytp-invisible.vbs&quot; %1 %snd% &quot;--fs=yes&quot; &quot;'--af=lavfi=[pan=stereo|c0=0.75''c0+0.25''c1|c1=0.25''c0+0.75''c1]'&quot; ```
set "snd=%2"
 
if "%2"=="" set "snd=0"
<pre>再生曲数が指定されていない場合は0を補う。&lt;code&gt;&#45;&#45;af&lt;/code&gt;オプションに関してはバックスラッシュとシングルクォートでエスケープしている(試行錯誤のすえ、とりあえずこれで問題なく動いている)。</pre>
start "" "ytp-invisible.vbs" %1 %snd% "--fs=yes" "\'--af=lavfi=[pan=stereo|c0=0.75*c0+0.25*c1|c1=0.25*c0+0.75*c1]\'"</syntaxhighlight>
<ul>
<p>再生曲数が指定されていない場合は0を補う。<code>&#45;&#45;af</code>オプションに関してはバックスラッシュとシングルクォートでエスケープしている(試行錯誤のすえ、とりあえずこれで問題なく動いている)。</p></li>
<li><p>ytp&#45;invisible.vbs(bashを非表示で起動するためのvbs)</p>
<li><p>ytp&#45;invisible.vbs(bashを非表示で起動するためのvbs)</p>
<syntaxhighlight lang="</syntaxhighlight></li></ul>">
<pre class="visual">Dim oWshShell
vb.net Dim oWshShell Set oWshShell = CreateObject(&quot;WScript.Shell&quot;) Dim mpv_args For cnt = 2 To WScript.Arguments.Count - 1 mpv_args = mpv_args &amp; &quot; &quot; &amp; WScript.Arguments(cnt) Next oWshShell.Run &quot;&quot;&quot;C:\Program Files\Git\bin\bash.exe&quot;&quot; -c 'ytpx.sh &quot;&quot;&quot; &amp; Wscript.Arguments(0) &amp; &quot;&quot;&quot; &quot; &amp; Wscript.Arguments(1) &amp; mpv_args &amp; &quot;'&quot;, 0, False ```
Set oWshShell = CreateObject(&quot;WScript.Shell&quot;)
 
Dim mpv_args
<pre>2つ目以降の引数をつなげて渡している。Runのオプションで0(非表示)、False(終了を待たない)を指定している。デバッグ時は0を1に変えておくとウィンドウが表示される。</pre>
For cnt = 2 To WScript.Arguments.Count - 1
<ul>
mpv_args = mpv_args &amp; &quot; &quot; &amp; WScript.Arguments(cnt)
Next
oWshShell.Run &quot;&quot;&quot;C:\Program Files\Git\bin\bash.exe&quot;&quot; -c 'ytpx.sh &quot;&quot;&quot; &amp; Wscript.Arguments(0) &amp; &quot;&quot;&quot; &quot; &amp; Wscript.Arguments(1) &amp; mpv_args &amp; &quot;'&quot;, 0, False</pre>
<p>2つ目以降の引数をつなげて渡している。Runのオプションで0(非表示)、False(終了を待たない)を指定している。デバッグ時は0を1に変えておくとウィンドウが表示される。</p></li>
<li><p>ytpx.sh(処理を行う本体)</p>
<li><p>ytpx.sh(処理を行う本体)</p>
<syntaxhighlight lang="</syntaxhighlight></li></ul>">
<syntaxhighlight lang="shell">#!/bin/sh
shell #!/bin/sh cd /path/to/mpv_dir ARR=(`echo <math display="inline">1 | sed -r "s/^.*(www|music)\.youtube\.com\/watch\?v=[^&]+&list=([^&]+)&index=([^&]+)</math>/\1 \2 \3/&quot;`) if [ <math display="inline">{ARR[0]} = "www" ]; then
cd /path/to/mpv_dir
NA_OPTION="--compat-options no-youtube-unavailable-videos"
ARR=(`echo $1 | sed -r "s/^.*(www|music)\.youtube\.com\/watch\?v=[^&]+&list=([^&]+)&index=([^&]+)$/\1 \2 \3/"`)
if [ ${ARR[0]} = "www" ]; then
  NA_OPTION="--compat-options no-youtube-unavailable-videos"
fi
INDEX=${ARR[2]}
if [ "$2" != "0" ]; then
  END_INDEX=`expr $INDEX + $2 - 1`
fi
fi
INDEX=</math>{ARR[2]} if [ &quot;$2&quot; != &quot;0&quot; ]; then END_INDEX=`expr $INDEX + $2 - 1` fi shift 2 yt-dlp $NA_OPTION -f 251 --extractor-args &quot;youtube:lang=ja&quot; -O title -O url -I <math display="inline">INDEX:</math>END_INDEX ${ARR[1]} | sed '1~2 s/^/#EXTINF:-1,/' | sed '1i#EXTM3U' | ./mpv.exe --player-operation-mode=pseudo-gui --prefetch-playlist=yes --playlist=- $@ ```
shift 2
 
yt-dlp $NA_OPTION -f 251 --extractor-args "youtube:lang=ja" -O title -O url -I $INDEX:$END_INDEX ${ARR[1]} | sed '1~2 s/^/#EXTINF:-1,/' | sed '1i#EXTM3U' | ./mpv.exe --player-operation-mode=pseudo-gui --prefetch-playlist=yes --playlist=- $@</syntaxhighlight>
<pre>まず3行目で、長さ3の配列ARRに①”www”または”music”②プレイリストID③index、をそれぞれ入れる(動画IDは捨てる)。4~6行目で&lt;code&gt;&#45;&#45;compat&#45;options no&#45;youtube&#45;unavailable&#45;videos&lt;/code&gt;の有無を設定する。
<p>まず3行目で、長さ3の配列ARRに①”www”または”music”②プレイリストID③index、をそれぞれ入れる(動画IDは捨てる)。4~6行目で<code>&#45;&#45;compat&#45;options no&#45;youtube&#45;unavailable&#45;videos</code>の有無を設定する。</p>
 
<p>7~10行目では開始indexと再生曲数を用いて植木算をして終了曲のindexを計算している。$2が0なら$END_INDEXは未設定のため事実上は空文字列(終了曲の指定なし)となる。</p>
 
<p>最後がメインのコマンド実行である。yt&#45;dlpを用いてタイトルと内部URLの一覧を取得する(なお<code>&#45;&#45;extractor&#45;args &quot;youtube&#58;lang&#61;ja&quot;</code>は日本語タイトルを取得しようとして入れてあるが、現状では(おそらくyt&#45;dlpがwww.のほうしか見ないため)効果なし)。フォーマットは最高音質の251を指定する。さらに、ここまでに計算した開始・終了インデックスを<code>&#45;I</code>オプションで渡す。出力形式としてはタイトルと内部URLが交互に書かれた複数行テキストが返ってくる。</p>
7~10行目では開始indexと再生曲数を用いて植木算をして終了曲のindexを計算している。&amp;#36;2が0なら&amp;#36;END_INDEXは未設定のため事実上は空文字列(終了曲の指定なし)となる。
<p>次に、mpvにm3u形式のプレイリスト(単にurlやファイル名を列挙する書式と違って、再生時のタイトルを指定できる)として渡すため、タイトルがある行(奇数行)の先頭に&#35;EXTINF&#58;&#45;1,を付加し、さらに全体の先頭行に&#35;EXTM3Uを付ける。そして最後にmpvの&#45;&#45;playlistに対して標準出力(ハイフンで表される)を渡すことで、めでたくタイトル付きで音声をギャップレス再生できる。動画データを渡していないので画面は真っ黒である。</p>
 
<p>追加のmpvのオプションとしては、バッチファイルから渡されてきたものに加えて、CUIからの実行でもGUIを強制する<code>&#45;&#45;player&#45;operation&#45;mode&#61;pseudo&#45;gui</code>とWeb上リソースのギャップレス再生に有効な<code>&#45;&#45;prefetch&#45;playlist&#61;yes</code>を指定しているが、古いバージョンではさらにオプションが必要かもしれない([[MPVとギャップレス再生|MPVとギャップレス再生]] も参照)。もちろん、スクリプト内ではなくmpv.confで指定してもよい。</p>
 
<p>なお(lib)mpvを内部で使用する<strong>mpv以外の</strong>クライアント(Linuxのcelluloidなど)の場合はハイフンを用いた標準入力からの受け取り指定ができないこともある。手元のLinuxではとりあえず一旦m3uファイルに書き込んでからそれをcelluloidに渡すように変えてある(自明なのでここでは省略)。celluloidなどを使う場合も、適宜オプションを指定すること。</p></li></ul>
最後がメインのコマンド実行である。yt&#45;dlpを用いてタイトルと内部URLの一覧を取得する(なお&lt;code&gt;&#45;&#45;extractor&#45;args &quot;youtube&#58;lang&#61;ja&quot;&lt;/code&gt;は日本語タイトルを取得しようとして入れてあるが、現状では(おそらくyt&#45;dlpがwww&amp;#46;のほうしか見ないため)効果なし)。フォーマットは最高音質の251を指定する。さらに、ここまでに計算した開始・終了インデックスを&lt;code&gt;&#45;I&lt;/code&gt;オプションで渡す。出力形式としてはタイトルと内部URLが交互に書かれた複数行テキストが返ってくる。
 
 
次に、mpvにm3u形式のプレイリスト(単にurlやファイル名を列挙する書式と違って、再生時のタイトルを指定できる)として渡すため、タイトルがある行(奇数行)の先頭に&#35;EXTINF&#58;&#45;1,を付加し、さらに全体の先頭行に&#35;EXTM3Uを付ける。そして最後にmpvの&#45;&#45;playlistに対して標準出力(ハイフンで表される)を渡すことで、めでたくタイトル付きで音声をギャップレス再生できる。動画データを渡していないので画面は真っ黒である。
 
 
追加のmpvのオプションとしては、バッチファイルから渡されてきたものに加えて、CUIからの実行でもGUIを強制する&lt;code&gt;&#45;&#45;player&#45;operation&#45;mode&#61;pseudo&#45;gui&lt;/code&gt;とWeb上リソースのギャップレス再生に有効な&lt;code&gt;&#45;&#45;prefetch&#45;playlist&#61;yes&lt;/code&gt;を指定しているが、古いバージョンではさらにオプションが必要かもしれない([MPVとギャップレス再生](/MPVとギャップレス再生) も参照)。もちろん、スクリプト内ではなくmpv&amp;#46;confで指定してもよい。
 


なお(lib)mpvを内部で使用する&lt;strong&gt;mpv以外の&lt;/strong&gt;クライアント(Linuxのcelluloidなど)の場合はハイフンを用いた標準入力からの受け取り指定ができないこともある。手元のLinuxではとりあえず一旦m3uファイルに書き込んでからそれをcelluloidに渡すように変えてある(自明なのでここでは省略)。celluloidなどを使う場合も、適宜オプションを指定すること。</pre>
== ショートカットキーからの起動 ==
== ショートカットキーからの起動 ==


上記の実装では引用符の入力など多少の回りくどいキーボード操作が必要である。URLはクリップボードに入っているので、ショートカットキーから起動することももちろん可能である。ただし再生曲数を入力するためのダイアログは必要である。以下のAutoHotkeyのスクリプトの例では、Ctrl+Alt+Shift+Lを押すと入力ダイアログを表示して再生曲数を取得し、ytp.batを起動する。
上記の実装では引用符の入力など多少の回りくどいキーボード操作が必要である。URLはクリップボードに入っているので、ショートカットキーから起動することももちろん可能である。ただし再生曲数を入力するためのダイアログは必要である。以下のAutoHotkeyのスクリプトの例では、Ctrl+Alt+Shift+Lを押すと入力ダイアログを表示して再生曲数を取得し、ytp.batを起動する。


<syntaxhighlight lang="vb.net">^!+l::
<pre class="visual">^!+l::
InputBox, play_numbers, Gapless Play YouTube, Enter the number of tracks to play ("" or "0" will play to the end)
InputBox, play_numbers, Gapless Play YouTube, Enter the number of tracks to play (&quot;&quot; or &quot;0&quot; will play to the end)
Run ytp.bat "%clipboard%" %play_numbers%</syntaxhighlight>
Run ytp.bat &quot;%clipboard%&quot; %play_numbers%</pre>
英語は間違っているかもしれない。
英語は間違っているかもしれない。


ダイアログはvbsのInputboxでも出せるが、Windows標準のショートカットキーの設定(ショートカット(←これはファイルの形式のこと)に対して設定できる)は若干管理しづらいイメージがあるためAutoHotkeyをおすすめしておく。
ダイアログはvbsのInputboxでも出せるが、Windows標準のショートカットキーの設定(ショートカット(←これはファイルの形式のこと)に対して設定できる)は若干管理しづらいイメージがあるためAutoHotkeyをおすすめしておく。
[[Category:IT]][[Category:Music]]{{#seo:|title={{FULLPAGENAME}} - Turgenev's Wiki}}
[[Category:IT]][[Category:Music]]{{#seo:|title={{FULLPAGENAME}} - Turgenev's Wiki}}