普段はテレビもニュースも株価も見てないが、音楽のトレンドだけは追いかけたい。
子供が運動会で踊るダンス曲や紅白歌合戦の選曲を知らないと時代に置いていかれた老害な気分になるから。
2007年のブログでも書いたね。
娘の友達の名前が全部言えること。
娘に負けないぐらい友達がいること。娘と同じ歌がうたえること。
自分だけのドライブミュージックがあること。娘のいちばんの親友でいること。
いつまでも娘の憧れであり続けること。【引用】日産 プレサージュ TV-CM
2006年CM 日産 プレサージュ 桐島かれん

学生時代はTSUTAYAのレンタルでCD借りてリッピングして……を毎月繰り返していたけれど、社会人からはYouTubeを活用してる。
例えば「Aqua Music JP」チャンネルで毎週のように15分ぐらいのTop100のランキングを作成してくれていた。
ただし、2024年でなぜか配信が中止となっている。
他にも、多くの人が流行曲を集めたYouTubeも上げてくれてるが、殆どが本人の声じゃ無いから萎えてしまった。
だったら著作権違反のない範囲で自分で作ってみるかー。
同じコンセプトで2009年頃にサイトを作ったことがある。
仕組み的にはオリコンチャートからXMLを持ってきて、ランキングTop10のYouTubeのURLをGoogleから探し、埋め込みYouTubeを表示する。
数週間かけて作成したがUXが悪くいつの間にか使わなくなった。
同じコンセプトで優秀なサイトがあったし、そもそもオリコンのランキングが時代遅れ。
で、今年に入って偶然「YouTube music charts」というサイトを見つけた。
プレイリストも提供されてるので多くの人はこれで十分かもしれない。
でも僕はフルで聞くのではなくCDカウントダウンのようにサビだけを聞き流したい。
一曲3分×100曲なら300分(5時間)かかるので通勤中に聴き終わらないし「タイパ(タイムパフォーマンス)」重要。
だったら、「死ぬまでに作りたい100」にも入ってる念願のサイトを作ってみよう。残り99は知らないけれど。
Youtubeメドレーサイト構造説明
「YouTube music charts」はTop100のCSVを公開しておりYouTube URLも提供してくれてる。
まず上記「youtube-charts-top-songs-jp-weekly-yyyymmdd」をダウンロードする(邦楽の場合)。
それをJSで読み込み順番にYouTube再生をする。
最後にChatGPT-4o様より御神託を賜わる
© 泡沫に神は微睡む/安田 のら/KADOKAWA
ほんとに ありがてぇ……ありがたいこった!
デザインまで全てをChatGPT様がやってくれる。
完成。


少なくとも僕には、JavaScriptとCSSでこれだけの要件を短期間で満たす技術力はない。
実現機能と今後の拡張
連続部分再生だけでなく次のような機能がある。
- [済] 曲を戻したり進めるボタン
- [済] 任意の位置から再生開始(例:10番目からスタート)
- [済] シーク時間の任意指定(例:30秒)
- [済] レスポンシブデザイン対応
- [済] 100曲の一覧表示
- [済] 100曲再生後に1曲目から再度ループ再生
- [済] サムネイル表示
- [済] 上昇順 or 人気順 or 新曲順の切り替えトグルボタン
- [済] サイドメニュークリックで曲ジャンプ
- [済] 再生中の曲が視覚的に分かるようにサイドバー色付け
- [済] 最大再生数の指定機能(例:50曲)
- [済] 再生中の曲名がサイドバーの先頭に表示されるように自動スクロール
- [済] 日本・米国・韓国の切り替えトグルボタン追加(邦楽、洋楽、K-POP)
- [済] リリース日、作詞・作曲表示
- [済] 過去ランキングの選択(履歴)
これでBraveブラウザを使えばバックグラウンド再生を実現してるので、聞き流しプレイヤーの出来上がり。
最後に未実装、気を付ける部分を記載しておく。
[済] 年齢制限が設けてある動画スキップ
YOASOBI「夜に駆ける」が「この動画には年齢制限が設けられており、YouTube でのみご視聴いただけます」と表示されて見れない。
このような場合には「onErrorイベント」を使用してエラーを検知し、次の動画に移るようにする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
function onYouTubeIframeAPIReady() { if (videoIds.length > 0) { player = new YT.Player('player', { height: '390', width: '640', videoId: videoIds[currentIndex], events: { 'onReady': onPlayerReady, 'onStateChange': onPlayerStateChange, 'onError': onPlayerError // エラーハンドリングを追加 } }); updateVideoInfo(); } else { console.error('No video IDs found.'); } } // 年齢制限付き動画や再生できない動画を検知 function onPlayerError(event) { console.error('動画が再生できません。次の動画に移ります。エラーコード:', event.data); nextVideo(); } |
[済] 手動スクロール中に自動で戻ってしまうのが地味にウザい
一日中利用してくれた方からのフィードバック。
これは自分で気づかなかった追加要件だった。ありがたい。
[未対応] 曲のタイトルとアーティスト名の読み上げ
曲と曲の間に帯域に応じて2秒から4秒の遅延が出てしまう。
ここで自動で読み上げてしまうのはどうだろうか?
CDカウントダウンのようなナレーションなら良いけど機械音だから逆に没入感を削ぎそうで未実施。
[未対応] 何の主題歌で使われたか?なぜ流行ってるか表示
「何の主題歌で利用されているか?」「なぜ、その曲が流行しているのか?」という情報を追加できれば嬉しい。
ただし、これはGemini等のAIを活用する他、Google等で自動検索して情報収集するしか無いかもしれない……。
※Geminiは最新情報を知らないので工夫が必要
[未対応] サビが聞き流せるようにする
本来はサビを聞きたい。
サビを抽出するには曲をダウンロードしてメルスペクトログラム等に変換して音声解析する必要がある。



そんな重たい処理を自サーバーでやりたくないし、そもそもYouTubeはダウンロードを禁止している。
もし出来るのであれば、サビの開始時間と終了時間をデータベースやJSONファイルで管理すれば良い。


現在は下記の情報よりデフォルトで曲の長さの5分の1からスタートさせている。


おわりに
LLM で実装がおかしい部分が多々あった。
デバッグのためにログを仕込むだけでも間違った修正を行いオリジナルのコードを壊してしまう。
また Vue.js で作り変えたかったが、何度やっても正しく動かなかった。
とはいえ今やコーディングの世界では、「バイブコーディング」と呼ばれる手法が流行。もはや人の実装は不要。


アクセス数は求めてない。自分が使うためのサイト。
多くの人はSpotifyやYouTube musicで既に間に合ってるだろう。
【過去作成したWebサービス】
- [閉鎖] 地域ごとのイベント情報を収集し、カレンダー形式で分かりやすく表示するサービス
- Yahooコメントを集約し、人気のある投稿をランキング形式で紹介するサイト
- 海釣り公園のデータを分析し、年間の釣果結果をグラフ化して視覚的に提供するサービス
- [今回] YouTube邦楽ランキングのCSVデータを活用し、人気曲のサビをメドレー形式で楽しめるサービス