こんな感じのフロントエンド
URL受け取ったサーバ側のphpでbashコマンド(yt-dlp)を叩く。
実行したコマンド文字列は画面にも表示する。
bashコマンド(赤文字)は
・バックグラウンドで実行しないと処理待ちになっちゃうから、末尾にアンパサンド(&)つけてノンブロッキング実行にしてる。
・エラーも含めてログに落としたいので 2>&1 にしてる。
・ログはdoTUBEDL_F.logに書き込み。
ログはcatで確認
$ cat doTUBEDL_F.log
これもフロント画面(Web上)に表示したいからphpで作った。
下向き丸ヤジルシの青色アイコン
クリックするとログ($ cat doTUBEDL_F.logの結果 すなわち yt-dlp -F URLの結果)が表示される。
mp4を含む行は青色、webmは赤色に着色。
ログの左列にあるID番号は例えば
yt-dlp -f 248 'URL'
とすればwebm(1920x1080)を指定してDLできるから
これもフロントからできるようにする。
yt-dlp -F URL のログのうちmp4またはwebmが含まれる行の左列にあるID番号だけを取り出して、それを指定してDLできるボタンにしちゃう。
cat doTUBEDL_F.logした結果=配列outputFDの各行($FDに格納)それぞれに対してawkで1列目を取り出して(print $1)、それを配列outputGNに格納していく。
つまりこんな感じ。
$ cat doTUBEDL_F.log | awk '{print $1}'
結果、248だけを取り出せるので、それをphp配列outputGNに格納していくイメージ。
まずは失敗例。こうなっちゃった。
170行目で実行したawkの結果を配列outputGNに格納してるんだけど
その配列outputGNをクリアしないままループの中で使い続けちゃってるので、Array内部にどんどん数字が溜まってちゃってる。
だから配列の先頭outputGN[0]を取り出しても常に139番のまま変わらない。
全部が「139番のダウンロード」になっちゃった。これじゃダメ。
本来はこうしたい。
それぞれの番号ごとにダウンロードボタンができる。
正しいコードはこう。
awkの結果を格納する配列outputGNをループの毎回でunset()してクリアしてあげる。
これで正しくなった。
コピペ用保存
$commandFD = 'cat doTUBEDL_F.log 2>&1 &';
// ---------------------------------------------------
print '<b><font color="red">' . "$commandFD" . 'が生成されました</font></b><br>';
// print 'exec($commandFD, $outputFD, $retFD);<br>';
// shell_exec("$commandFD");
print '<br>';
// FD -> File to Download
exec($commandFD, $outputFD, $retFD);
foreach($outputFD as $FD){
// 動画番号の入った配列をクリア
unset($outputMOV_NUM);
if (preg_match('/.*webm.*/', "$FD")) {
print '<b><font color="red">' . "$FD" . '</b></font><br>';
$commandGETWEBM = 'echo "' . "$FD" . '" | awk \'{print $1}\' ';
exec($commandGETWEBM, $outputMOV_NUM, $retMOV);
// print '<b><font color="red">' . "$commandGETWEBM" . 'が生成されました</font></b><br>';
// print_r($outputMOV_NUM);
print '<b><mark>' . "$outputMOV_NUM[0]" . '</mark></b><br>';
// print '<a href="' . 'https://www.google.co.jp' . '" class="btn btn-warning" target="_blank">' . "$outputMOV_NUM[0]" . '番のwebmをダウンロード</a><br>';
print '<a href="doTUBEDL.php?INTXT=' . "$myINTXT" . '&SAVEDIR=' . "$myGETSAVEDIR" . '&SAVE_YT_NUM=' . "$outputMOV_NUM[0]" . '" class="btn btn-warning" target="_blank">' . "$outputMOV_NUM[0]" . '番のwebmをダウンロード</a><br>';
} else if (preg_match('/.*mp4.*/', "$FD")){
print '<font color="blue">' . "$FD" . '</font><br>';
///// 271←これ(yt-dlp -Fのログの最左列)を取り出す
///// 271 webm 2114x1440 24 | 396.90MiB 718k https | vp9 718k video only 1440p, webm_dash
///// One Hour of Baroque Music for Walking [jDGdNyTqC-k].webm
// $commandGETMP4 = "echo 12345";
// $commandGETMP4 = 'echo "' . "$FD" . '"';
$commandGETMP4 = 'echo "' . "$FD" . '" | awk \'{print $1}\' ';
exec($commandGETMP4, $outputMOV_NUM, $retMOV);
// print '<b><font color="blue">' . "$commandGETMP4" . 'が生成されました</font></b><br>';
// print_r($outputMOV_NUM);
print '<b><mark>' . "$outputMOV_NUM[0]" . '</mark></b><br>';
///// ダウンロードボタンsubmit実装
// print '<input type="submit" value="' . "$FD" . '" class="btn btn-info"/></a><br>';
// print '<a href="https://www.google.co.jp"><input type="submit" value="' . "$FD" . '" class="btn btn-info"/></a><br>';
// print '<a href="https://www.google.co.jp">mp4をダウンロード<input type="submit" value="' . "$FD" . '" class="btn btn-primary"/></a><br>';
// print '<a href="' . "$myDOM" . rawurlencode("$n") . '" class="btn btn-primary" target="_blank">' . "$FD" . '</a><br>';
// print '<a href="' . "$myDOM" . rawurlencode("$n") . '" class="btn btn-primary" target="_blank">mp4をダウンロード</a><br>';
// print '<a href="' . "$myDOM" . rawurlencode("$n") . '" class="btn btn-primary" target="_blank">' . "$outputMOV_NUM[0]" . '番のmp4をダウンロード</a><br>';
// print '<a href="' . 'https://www.google.co.jp' . '" class="btn btn-primary" target="_blank">' . "$outputMOV_NUM[0]" . '番のmp4をダウンロード</a><br>';
print '<a href="doTUBEDL.php?INTXT=' . "$myINTXT" . '&SAVEDIR=' . "$myGETSAVEDIR" . '&SAVE_YT_NUM=' . "$outputMOV_NUM[0]" . '" class="btn btn-primary" target="_blank">' . "$outputMOV_NUM[0]" . '番のmp4をダウンロード</a><br>';
} else {
print '<font color="black">' . "$FD" . '</font><br>';
}
print '<hr>';
}