19. YouTube player

音楽を聴く目的でYouTubeを時々利用するが、興味深い音楽ソースが沢山有る。
そこで、raspiをプレーヤーとして利用し、ブラウザからリモート再生できないかとネットで調べたら、丁度良さげなPHPサンプルプログラムが見つかり作ってみた。(画像表示無しで音楽再生のみ)

●必要なAPのインストール


$ cd $HOME
$ sudo pip3 install mps-youtube
$ sudo pip3 install youtube-dl
$ sudo apt-get install mpv
※プレーヤーAPは、参考サイトの"omxplayer"を導入せず"mpv"を使う事にした。

●下記方法で導入APの動作確認


1.「mps-youtube」(mpsyt)を起動する。
    $ mpsyt
2.プレーヤーの設定
    set player mpv
3.「/」に続けて検索key wordを入れて目的の音源を探す
    /<検索key word> 例)/michael jackson
4. 一覧に該当音源を見つけたら、その左側の番号を入力する

●問題無く動作したので、ApacheとPHPを導入し、Apacheのユーザー"www-data"にsudo権限を設定してPHPのexec()で各種コマンドを実行できるようにした。また、参考サイトのPHPプログラムで使用している関数も追加導入した。


$ sudo visudo
※最終行に下記を追記
www-data  ALL=(ALL) NOPASSWD: ALL

参考サイトのPHPプログラムで使用しているmb系関数の導入
$ sudo apt-get install php-mbstring

●各種導入が終わり、参考サイトから入手したPHPプログラムを使いブラウザからYouTube音楽再生できた。
ところが、暫くすると、下記の様なエラーとなり使用できなくなった。


Error 403 Daily Limit Exceeded. The quota will be reset at midnight Pacific Time (PT). 
You may monitor your quota usage and adjust limits in the API Console: 
https://console.developers.google.com/apis/api/translate/quotas?project=655912152876

ネットで調べると、どうやら、"mps-youtube"(mpsyt)を連続長時間利用するには、googleに登録して"API key"を取得する必要が有るようだ。しかし、そこまでするほど使用頻度が多い訳ではないので、mpsytを使わない方法を検討。
色々試したところ、事前に調べたYouTubeのContent IDを"mpv"で再生させる方法なら長時間使用してもエラーにならなかったので、お気に入りのContent IDを集めてリスト表示し、選択した音楽を"mpv"で再生させる方法に入手したPHPプログラムを大幅改造することにした。

●作成機能:

  1. Content IDの登録済み音楽一覧の表示選択
  2. 未登録Content IDを指定しての再生
  3. USB Audioの選択チェックボックス
  4. 再生実行中の選択した音楽の情報表示(YouTubeに登録されている情報)
  5. 再生時間経過の表示 (プレーヤーから情報得られないので目安程度の精度)

完成ブラウザ画面

選曲画面


再生中画面

●事前にYouTubeで調べたContent IDのプレイリストをプログラムに組み込む


●プレイリスト (array('Content ID', 'Title', 'time')
$play_list = array(array('song',"YouTube Content ID : ",""),   ←これはContent ID入力用
	array('C2ELgd_8J9k',"The Best Of Soul, R&B, Smooth Jazz 2 - Denise King - PLAYaudio","1:50:07"),
	array('KFH046IYwb4',"Manhattan Jazz Quartett - Vocal Jazz Classics","0:53:25"),
	:
	:
	array('_sI_Ps7JSEk',"New York Jazz Lounge - Bar Jazz Classics","0:49:50"),
	array('c9xtkAZSK50',"Motown Jazz - Smooth Jazz Music & Jazz Instrumental Music for Relaxing and Study | Soft Jazz","4:22:04")
	);

●HTML内にプレイリスト作成
	<?php
		for ($i = 1; $i < count($play_list); $i++){
			$value = $play_list[$i][0];
			$title = $play_list[$i][1];
			$ptime = $play_list[$i][2];
			$att = $att_is[$i];
			echo "<label>
				<input type='radio' name='search_mode' value=$value $att >
				$title ($ptime)
				</label><br>";
		}
	?>

●Content IDの入力欄をHTML内に作成


●Content IDが未登録のものはYouTubeで調べたIDを入力して再生させる
	<label>
		<input type='radio' name='search_mode' value='song' <?php echo $att_is_song_mode;?> >
		<?php echo _($play_list[0][1]); ?>
		<input type='text' name='search' value='<?php echo $my_ytp->search_keyword; ?>' >
	</label><br>

●USBオーディオ対応


●HTML内に選択チェックボックス
	<div>
		<label>
			USB Audio   :
			<input type='checkbox' name="usb_audio" value="true" <?php echo $att_is_usb_audio; ?> >
			<?php echo ("(USB Audio)"); ?>
		</label>
	</div>

●USB Audioチェックボックスの状態でmpvのオプションを変える
/* command setting with device switch USB Audio or jack speaker */
if ( $my_ytp->usb_audio == "true" ){
	$my_ytp->path_mply = "/usr/bin/mpv --no-video --vo=null --audio-device='alsa/plughw:CARD=PCM2702,DEV=0' https://youtu.be/"; // use USB audio
}else{
	$my_ytp->path_mply = "/usr/bin/mpv --no-video --vo=null --audio-device='auto' https://youtu.be/"; // use onboard audio jack
}

●YouTubeより再生ソースの情報を入手して表示


●"youtube-dl"コマンドで情報を得る
	echo "【再生情報】<br><div style='font-size:12px;'>";
	$command2  = "sudo youtube-dl --get-description https://youtu.be/";
	if ($this->search_mode == "song"){
		$command2 .= $this->search_keyword;
	} else {
		$command2 .= $this->search_mode;
	}
	$command2  = trim( $command2 );
	exec($command2, $output, $return_var);
	for($i = 0; $i < count($output) ; $i++){
		echo "$output[$i]<br>";
	}
	echo "</div>";

●おおよその再生経過時間の表示


●音楽ソースの再生時間データをjavascriptに設定して、1秒毎にカウントする
---PHP内---
	if( $this->search_mode == "song"){
		exec("sudo youtube-dl -e --get-duration https://youtu.be/".$this->search_keyword,$output,$return_var);
		$title = $output[0];   ←Content ID指定の場合はYouTubeから時間情報を得る
		if(substr_count($output[1],":") < 2)
			$play_time = "00:".$output[1];
		else
			$play_time = $output[1];
	}else{
		foreach($this->play_list as $ply){
			if($ply[0] == $this->search_mode){
				$title=$ply[1];
				$play_time=$ply[2];   ←プレイリスト指定の場合はプレイリストから時間取得
				break;
			}
		}
	}
	echo ("
		【再生】<br><span class='ptitle'>{$title}</span> ($play_time)<br>
		<p>再生時間:<span id='PlayTime1' class='ptime'>Play time</span> --
		-- 残り時間:<span id='PlayTime2' class='ptime'>Play time</span></p>
		<script type='text/javascript'>
			playTime('$play_time');
			interval = setInterval('countDown()',1000);   ←1秒毎にカウント処理
		</script>
	");
			
●javascriptで再生時間のカウントを行う
	<script type="text/javascript">
		var interval;
		var tm_delay = 8;   ←実際の音楽再生開始が遅いのでカウント開始タイミングの調整
		var ptime_a = new Date("2020/01/01 0:00:00");   ←カウントアップ用(年月日は関係ないが適当な値が必要)
		var ptime_b = "";
		function playTime(time) {
			ptime_b = new Date("2020/01/01 " + time);   ←カウントダウン用(年月日は関係ないが適当な値が必要)
		}
		function countDown() {
			if (tm_delay > 0) tm_delay--;
			else{
				 ptime_a.setSeconds(ptime_a.getSeconds() + 1);
				 ptime_b.setSeconds(ptime_b.getSeconds() - 1);
			}
			var date_a = ptime_a.toLocaleString();
			var date_b = ptime_b.toLocaleString();
			if (ptime_b.getDate() != 1){
				clearInterval(interval);
				document.getElementById("PlayTime2").innerHTML = "終了";
				window.location.href = "?status=stop";
			}else{
				document.getElementById("PlayTime1").innerHTML = date_a.split(' ')[1];
				document.getElementById("PlayTime2").innerHTML = date_b.split(' ')[1];
			}
		}
	</script>

【参考】

  1. Raspberry PiをYoutube音楽プレーヤーにする(コマンド・ラインでオーディオ再生する)
  2. RasPi+Mpsyt+PHPで簡易Youtube音楽プレーヤー
  3. Call to undefined function mb_strtolower()と出た
  4. youtube-dl
  5. ApacheとPHPのインストール~ SOCKET SERVER
  6. Error 403 Daily Limit Exceeded
  7. Option "--no-video" breaks seeking in videos

2019/06/13