🚦
YouTubeのShort動画を簡単に判定する方法
概要
以前作成した以下の記事で、YouTubeのライブ配信や動画投稿をDiscordにリアルタイムで通知するシステムを構築しました。
YouTube通知Botを作る!Node.jsとPostgreSQLでほぼリアルタイム通知
しかし、登録しているチャンネルでショート動画の投稿が増えてきたため、通知や管理のためにショート動画を判定するロジックを追加することにしました。
YouTubeのショート動画の特徴
YouTubeのショート動画は以下の特徴を持っています。
- 60秒以内
- 正方形または縦長である必要があります。
- 動画タイトルもしく説明に
#Shorts
を含める(デスクトップOSからの投稿の場合)
例えば以下の動画がショート動画に該当します。
YouTubeショート動画を判定する方法
YouTube Data APIではショート動画を直接判定する方法が提供されていないため、別のアプローチを検討しました。
上記の条件をコードに落とし込むことも可能ですが、より簡単で確実な方法として、リダイレクト判定を活用しました。
判定ロジック
- ショート動画用のURL
https://youtube.com/shorts/<videoId>
にアクセスします。 - リダイレクトされる先が
https://youtube.com/watch?v=<videoId>
であれば通常動画。 - リダイレクトされずにそのまま表示される場合はショート動画と判定します。
以下は、Node.jsでこの判定を行う関数の例です.
ショート動画判定用のNode.js関数
import fetch from 'node-fetch';
/**
* YouTube動画がShort動画か通常動画かを判定する
* @param {string} videoId - 判定対象の動画ID
* @returns {Promise<boolean>} - Short動画の場合はtrue、それ以外はfalse
*/
export async function isShort(videoId) {
const url = `https://youtube.com/shorts/${videoId}`;
try {
// リダイレクトを追跡する設定
const response = await fetch(url, { method: 'HEAD', redirect: 'follow' });
// レスポンスURLが/shorts/を含む場合はShort動画
if (response.url.includes('/shorts/')) {
return true; // Short動画
}
// それ以外の場合は通常動画
return false;
} catch (error) {
console.error('⛔️ isShort関数内でエラーが発生:', error.message);
return false; // 判定できない場合は通常動画として扱う
}
}
使用例
これを以下のように呼び出すことで戻り値によってショート動画か通常動画かを扱えるようになりました。
// 使用例: 判定結果を取得して用途に応じた処理を行う
const type = await isShort(videoId) ? 'short' : 'video';
if (type === 'short') {
console.log('ショート動画です。');
} else {
console.log('通常動画です。');
}
まとめ
この関数を活用することで、ショート動画を区別して以下のような用途に対応可能です。
- Discord通知メッセージの内容をショート動画か通常動画かで切り替える
- データベースに保存する際、動画のタイプをステータスとして管理
- WebアプリのUIでショート動画と通常動画を異なる形式で表示
リダイレクトを利用したシンプルな判定方法を取り入れることで、効率的にショート動画を扱えるようになりました。ぜひ参考にしてみてください!
Discussion