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

Notion-MW
Notion-MW
28行目: 28行目:
では再生用のコマンドの設計を定める。現実にはプレイリストを丸ごと聴くとは限らないから、開始曲と終了曲を指定できるようにしたい。そこで今回は、
では再生用のコマンドの設計を定める。現実にはプレイリストを丸ごと聴くとは限らないから、開始曲と終了曲を指定できるようにしたい。そこで今回は、


<syntaxhighlight lang="c">ytp "[開始曲のプレイリストID付きURL]" [再生曲数(指定なしあるいは0なら最後まで再生)]</syntaxhighlight>
<syntaxhighlight lang="python">
 
c
ytp "[開始曲のプレイリストID付きURL]" [再生曲数(指定なしあるいは0なら最後まで再生)]</syntaxhighlight>
という構文で動作するytpというプログラムを作成する。丸ごと聴きたければ最初の曲のリンクを渡せばよい。Windowsにおいてはスタートボタンを押して「検索」欄に入力すれば任意のコマンドを実行できるので(※Windows 11のバージョン22H2ではバグで引数が読まれないので代わりにWin+Rを使うとよい)、YouTube Musicのプレイリスト画面から始めてかなり少ないステップで音楽を聴くことができるようになる。ここで「プレイリストID付きURL」と言っているのは、<code>https&#58;//&#91;wwwまたはmusic&#93;.youtube.com/watch?v&#61;動画のID&amp;list&#61;プレイリストのID&amp;index&#61;&#91;数&#93;</code>という形式のもので、このindexの部分から開始曲を取得する。<code>www.youtube.com</code>のほうではプレイリスト内の動画を右クリックして表示されるメニューからこの形式のURLをコピーできる。一方でYouTube Musicでは、アルバム画面で曲目を<u><strong>Shift+</strong></u>右クリックすれば同様にURLを得られるが、indexの部分が含まれていない。そこで今回は、[https://requestly.io/ <strong>Requestly</strong>]というブラウザ拡張機能(Chrome、Edge、Safari、FireFox等で使える)を使用し、YouTube MusicのWebページを書き換えてURLに<code>&amp;index&#61;&#91;数&#93;</code>を付加する。
という構文で動作するytpというプログラムを作成する。丸ごと聴きたければ最初の曲のリンクを渡せばよい。Windowsにおいてはスタートボタンを押して「検索」欄に入力すれば任意のコマンドを実行できるので(※Windows 11のバージョン22H2ではバグで引数が読まれないので代わりにWin+Rを使うとよい)、YouTube Musicのプレイリスト画面から始めてかなり少ないステップで音楽を聴くことができるようになる。ここで「プレイリストID付きURL」と言っているのは、<code>https&#58;//&#91;wwwまたはmusic&#93;.youtube.com/watch?v&#61;動画のID&amp;list&#61;プレイリストのID&amp;index&#61;&#91;数&#93;</code>という形式のもので、このindexの部分から開始曲を取得する。<code>www.youtube.com</code>のほうではプレイリスト内の動画を右クリックして表示されるメニューからこの形式のURLをコピーできる。一方でYouTube Musicでは、アルバム画面で曲目を<u><strong>Shift+</strong></u>右クリックすれば同様にURLを得られるが、indexの部分が含まれていない。そこで今回は、[https://requestly.io/ <strong>Requestly</strong>]というブラウザ拡張機能(Chrome、Edge、Safari、FireFox等で使える)を使用し、YouTube MusicのWebページを書き換えてURLに<code>&amp;index&#61;&#91;数&#93;</code>を付加する。


42行目: 45行目:
ちなみに、<code>www.youtube.com</code>のほうに強制的に遷移させる(履歴ごと上書きするために<code>location.replace</code>を使うのがよい)という方法もある。
ちなみに、<code>www.youtube.com</code>のほうに強制的に遷移させる(履歴ごと上書きするために<code>location.replace</code>を使うのがよい)という方法もある。


<syntaxhighlight lang="javascript">new MutationObserver(() => {
<syntaxhighlight lang="python">
 
javascript
new MutationObserver(() => {
     if (location.href.indexOf("youtube.com/playlist") >= 0) {
     if (location.href.indexOf("youtube.com/playlist") >= 0) {
         urlAddIndex();
         urlAddIndex();
96行目: 102行目:
<ul>
<ul>
<li><p>ytp.bat(最初に呼ばれるランチャー)</p>
<li><p>ytp.bat(最初に呼ばれるランチャー)</p>
<syntaxhighlight lang="c">cd %~dp0
<syntaxhighlight lang="python">
c
cd %~dp0
set "snd=%2"
set "snd=%2"
if "%2"=="" set "snd=0"
if "%2"=="" set "snd=0"
102行目: 110行目:
<p>再生曲数が指定されていない場合は0を補う。<code>&#45;&#45;af</code>オプションに関してはバックスラッシュとシングルクォートでエスケープしている(試行錯誤のすえ、とりあえずこれで問題なく動いている)。</p></li>
<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>
<pre class="visual">Dim oWshShell
<syntaxhighlight lang="python">
Set oWshShell = CreateObject(&quot;WScript.Shell&quot;)
vb.net
Dim oWshShell
Set oWshShell = CreateObject("WScript.Shell")
Dim mpv_args
Dim mpv_args
For cnt = 2 To WScript.Arguments.Count - 1
For cnt = 2 To WScript.Arguments.Count - 1
  mpv_args =  mpv_args &amp; &quot; &quot; &amp; WScript.Arguments(cnt)
  mpv_args =  mpv_args & " " & WScript.Arguments(cnt)
Next
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>
oWshShell.Run """C:\Program Files\Git\bin\bash.exe"" -c 'ytpx.sh """ & Wscript.Arguments(0) & """ " & Wscript.Arguments(1) & mpv_args & "'", 0, False</syntaxhighlight>
<p>2つ目以降の引数をつなげて渡している。Runのオプションで0(非表示)、False(終了を待たない)を指定している。デバッグ時は0を1に変えておくとウィンドウが表示される。</p></li>
<p>2つ目以降の引数をつなげて渡している。Runのオプションで0(非表示)、False(終了を待たない)を指定している。デバッグ時は0を1に変えておくとウィンドウが表示される。</p></li>
<li><p>ytpx.sh(処理を行う本体)</p>
<li><p>ytpx.sh(処理を行う本体)</p>
<syntaxhighlight lang="shell">#!/bin/sh
<syntaxhighlight lang="python">
shell
#!/bin/sh
cd /path/to/mpv_dir
cd /path/to/mpv_dir
ARR=(`echo $1 | sed -r "s/^.*(www|music)\.youtube\.com\/watch\?v=[^&]+&list=([^&]+)&index=([^&]+)$/\1 \2 \3/"`)
ARR=(`echo $1 | sed -r "s/^.*(www|music)\.youtube\.com\/watch\?v=[^&]+&list=([^&]+)&index=([^&]+)$/\1 \2 \3/"`)
134行目: 146行目:
上記の実装では引用符の入力など多少の回りくどいキーボード操作が必要である。URLはクリップボードに入っているので、ショートカットキーから起動することももちろん可能である。ただし再生曲数を入力するためのダイアログは必要である。以下のAutoHotkeyのスクリプトの例では、Ctrl+Alt+Shift+Lを押すと入力ダイアログを表示して再生曲数を取得し、ytp.batを起動する。
上記の実装では引用符の入力など多少の回りくどいキーボード操作が必要である。URLはクリップボードに入っているので、ショートカットキーから起動することももちろん可能である。ただし再生曲数を入力するためのダイアログは必要である。以下のAutoHotkeyのスクリプトの例では、Ctrl+Alt+Shift+Lを押すと入力ダイアログを表示して再生曲数を取得し、ytp.batを起動する。


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


ダイアログは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}}