プロジェクト概要
前提条件
- Pythonプログラミングの基本的な知識(変数、関数、クラスの概念)
- VSCodeエディタの基本操作ができること
- ターミナル(コマンドライン)の基本的な使用経験
- Gitとバージョン管理の基礎知識
- インターネット接続環境の確保
開発環境
- Python 3.7以上
- VSCode(Visual Studio Code)
- Git(バージョン管理システム)
- GitHubアカウント
- yt-dlp
- FFmpeg(ファイル形式変換時に必要)
プロジェクト内容
このプロジェクトでは、yt-dlpライブラリを使用した動画ダウンロードツールを構築します。初心者でも段階的に学習できるよう、基本的な環境設定から高度なカスタマイズ機能まで、4つのステップに分けて実装していきます。
プロジェクトの核となるのは、yt-dlpライブラリを使用した動画ダウンロード技術です。このライブラリはyoutube-dlのフォーク版として開発され、YouTubeをはじめとする多数の動画プラットフォームに対応しています。単純なダウンロード機能にとどまらず、動画品質の選択、ファイル形式の指定、字幕の自動取得など、実用的な機能を備えたツールを開発します。
データ処理においては、動画の詳細情報を事前に取得し、ユーザーが適切な判断を行えるシステムを構築します。また、ダウンロード完了後には生成されたファイルの一覧表示機能も実装し、実際の業務で活用できる実用的なツールを作成できます。
開発プロセスでは、オブジェクト指向プログラミングの概念を活用し、VideoDownloaderクラスを中心とした構造化されたコード設計を採用します。各機能を独立したメソッドとして実装することで、コードの可読性と保守性を向上させ、将来的な機能拡張も容易に行えるようになります。
実装内容
- yt-dlpライブラリの基本実装と動画ダウンロード機能
- 仮想環境の構築と依存関係管理(requirements.txt)
- 動画品質選択システム(480p、720p、1080p、最高画質)
- ファイル形式変換機能(MP4、AVI、MKV形式対応)
- 字幕自動取得機能(利用可能な字幕の自動ダウンロード)
- 動画情報表示機能(タイトル、再生時間、ファイルサイズ)
- URL検証機能とエラーハンドリング
- GitHubでのバージョン管理とポートフォリオ公開
得られるスキル
- yt-dlpライブラリ(動画ダウンロードと高度なオプション設定)
- ファイル形式変換技術(FFmpegを使用した動画変換処理)
- ユーザーインターフェース設計(コマンドライン操作の最適化)
- エラーハンドリング(例外処理と安定性の確保)
得られる経験
- 実際の動画プラットフォームとの連携経験
- ユーザビリティを考慮したツール開発手法の習得
- 設定管理とカスタマイズ機能の実装経験
得られる成果物
- 完全に動作する動画ダウンロードツール
- GitHubでのポートフォリオとして活用可能なプロジェクト
- 完全なPythonソースコード
このプロジェクトから応用できること
- yt-dlpライブラリを使用して教育機関向け動画管理ツールの開発
- 動画品質選択機能を活用した企業研修動画の一括保存システム構築
- ファイル形式変換技術を使用したバックアップサービス提供
- エラーハンドリング技術を応用した動画コンテンツ品質管理ツール開発
- カスタマイズ機能を利用したオフライン視聴用動画準備自動化
- yt-dlpとファイル変換技術を組み合わせた動画変換サービス事業化
Step1:開発環境の準備とプロジェクト構造の作成
このステップでは、YouTubeダウンロードツールプロジェクトを始めるための開発環境を整備し、必要なファイル構造を作成していきます。プログラミングを始める前の準備段階として、とても重要な作業になります。
※Step1の内容がわからない際は、下記記事にGitHubとVSCodeの連携について詳細を記載しているためご参照ください。

GitHubリポジトリの作成
まず最初に、プロジェクト専用のGitHubリポジトリを作成しましょう。
- GitHubの公式サイトにアクセスし、自分のアカウントでログインします
- 画面右上の「+」アイコンをクリックし、ドロップダウンメニューから「New repository」を選択します
- 新しいリポジトリの作成ページで、以下の情報を入力します
リポジトリの設定
- Repository name 「youtube_video_downloader」と入力
- Description 「yt-dlpを使用したYouTube動画ダウンロードツール」と入力
- Visibility 「Public」を選択(ポートフォリオとして公開するため)
- Initialize this repository with
- 「Add a README file」のチェックは外す(Step4で作成するため)
- 「Add .gitignore」で「Python」を選択
- 「Choose a license」は「None」のままにする
- 「Create repository」ボタンをクリックしてリポジトリを作成します
プロジェクトフォルダの作成
次に、プロジェクトを管理するための親フォルダを作成しましょう。
Windows・macOS共通
- デスクトップや任意の場所に新しいフォルダを作成します
- フォルダ名は任意ですが、ここでは例として「PythonPortfolio」に設定します
この親フォルダが、今後のプロジェクト全体を管理するルートディレクトリとなります。複数のプロジェクトを整理して管理するために作成しておくと便利です。
VSCodeでプロジェクトを開く
作成したGitHubリポジトリをローカルにクローンして開きましょう。
- VSCodeを起動します
- 左側のアクティビティバーからソース管理アイコン(分岐のようなアイコン)をクリックします
- 「リポジトリの複製」ボタンをクリックします
- 「GitHubから複製」を選択します
- 先ほど作成した「youtube_video_downloader」リポジトリを選択します
- リポジトリ宛先として先ほど作成した親フォルダを選択します
- 「クローンしたリポジトリを開きますか」というウィンドウが表示されたら「開く」をクリックします
VSCodeの左側にエクスプローラーパネルが表示され、現在のプロジェクトフォルダの中身が確認できるようになります。
仮想環境の作成とアクティベート
Python開発において仮想環境は非常に重要です。仮想環境とは、プロジェクトごとに独立したPython実行環境を作成する仕組みのことです。これにより、プロジェクト間でのライブラリの競合を防ぎ、クリーンな開発環境を維持できます。
詳しくは下記記事をご参照ください。
Windows環境での仮想環境作成
- VSCodeの上部メニューから「ターミナル」→「新しいターミナル」を選択
- 以下のコマンドで仮想環境を作成します
python -m venv myenv
- 仮想環境をアクティベートします
myenv\Scripts\activate
macOS環境での仮想環境作成
- VSCodeの上部メニューから「ターミナル」→「新しいターミナル」を選択
- 以下のコマンドで仮想環境を作成します
python3 -m venv myenv
- 仮想環境をアクティベートします
source myenv/bin/activate
重要なポイント
- 仮想環境名は「myenv」として作成
- ターミナルの行頭に「(myenv)」と表示されることを確認
- この表示があることで、仮想環境が正常にアクティベートされていることがわかります
プロジェクトファイル構造の作成
次に、今回のYouTubeダウンロードプロジェクトに必要なファイルを作成していきます。VSCodeのエクスプローラーパネルを使用してファイルを作成しましょう。
メインプログラムファイルの作成
- VSCodeの左側エクスプローラーパネルで「新しいファイル」アイコン(ファイルの絵とプラスのマークがあるアイコン)をクリック
- ファイル名を「video_downloader.py」として作成
この「video_downloader.py」ファイルが、今回のYouTube動画ダウンロード機能を実装するメインプログラムとなります。.py拡張子はPythonスクリプトファイルであることを示しており、実行可能なプログラムコードを記述するために使用します。
依存関係管理ファイルの作成
続いて、プロジェクトで使用するライブラリを管理するためのファイルを作成します。
- 同じくエクスプローラーパネルで「新しいファイル」アイコンをクリック
- ファイル名を「requirements.txt」として作成
requirements.txtファイルは、Pythonプロジェクトで使用する外部ライブラリとそのバージョンを記録するための重要なファイルです。これにより、他の開発者や本番環境でも同じライブラリ環境を再現できます。
requirements.txtの内容設定
作成した「requirements.txt」ファイルをVSCodeで開き、以下の内容を記述してください。
yt-dlp==2025.5.22
今回のプロジェクトでは、yt-dlpというライブラリを使用します。
- yt-dlp YouTube、Internet Archive、その他の動画プラットフォームから動画をダウンロードするための強力なライブラリです。youtube-dlのフォーク版として開発され、より活発にメンテナンスされています。YouTubeの動画を効率的にダウンロードする際に使用します
プロジェクト構造の確認
この時点で、VSCodeのエクスプローラーパネルには以下のような構造が表示されているはずです。
youtube_video_downloader/
├── myenv/ # 仮想環境フォルダ
├── video_downloader.py # メインプログラムファイル
├── requirements.txt # 依存関係管理ファイル
└── .gitignore # Git除外設定ファイル(GitHub作成時に自動生成)
この基本構造が、今回のYouTubeダウンロードプロジェクトの基盤となります。GitHubで作成したリポジトリをクローンしたため、必要なファイルが最初から含まれています。
仮想環境が正常にアクティベートされていることを再度確認し(ターミナルに「(myenv)」が表示されている状態)、次のステップに進む準備を整えましょう。
ライブラリのインストール
仮想環境がアクティベートされている状態で、VSCodeのターミナルから以下のコマンドを実行します。
pip install -r requirements.txt
このコマンドにより、requirements.txtに記載されたyt-dlpライブラリがインストールされます。インストール処理には数十秒程度かかる場合がありますので、しばらくお待ちください。
インストールが完了すると、ターミナルに「Successfully installed yt-dlp-2025.5.22」のようなメッセージが表示され、プロジェクトの環境準備が完了します。
Step2:yt-dlpライブラリの基本実装
このステップでは、yt-dlpライブラリを使用してYouTube動画をダウンロードする基本機能を実装します。クラス構造を活用して、再利用可能で管理しやすいコードを作成していきます。
VideoDownloaderクラスの作成
まず、動画ダウンロード機能をまとめて管理するクラスを作成します。このクラスの中に、今後必要な機能をすべてdef文(関数)として実装していきます。
「video_downloader.py」ファイルを開き、以下のコードを記述してください。
# 動画ダウンロードに必要なライブラリをインポート
import yt_dlp # YouTubeなどの動画をダウンロードするためのライブラリ
import os # ファイルやフォルダの操作を行うためのライブラリ
class VideoDownloader:
def __init__(self):
# ダウンロードした動画を保存するフォルダ名を設定
self.download_path = "downloads"
# 保存フォルダが存在しない場合は作成する
self.setup_download_directory()
initメソッドはクラスの初期化を行う特別な関数です。ここでダウンロード先のフォルダパスを設定し、ディレクトリの作成機能を呼び出します。
ダウンロードディレクトリの設定機能
次に、クラス内にsetup_download_directoryメソッドを実装します。
def setup_download_directory(self):
# 指定したフォルダが存在するかチェック
if not os.path.exists(self.download_path):
# フォルダが存在しない場合は新規作成
os.makedirs(self.download_path)
print(f"ダウンロードフォルダ '{self.download_path}' を作成しました")
else:
# 既にフォルダが存在する場合はそのまま使用
print(f"ダウンロードフォルダ '{self.download_path}' を使用します")
このメソッドはクラス内で定義されているため、selfキーワードを使用してクラスの属性にアクセスできます。
yt-dlpオプションの設定
動画ダウンロードのオプション設定を管理するメソッドを追加します。
def get_download_options(self):
# yt-dlpのダウンロード設定を辞書形式で定義
options = {
# 動画品質を720p以下の最高画質に設定(format:品質指定オプション)
'format': 'best[height<=720]',
# プレイリスト全体ではなく単一動画のみダウンロード(noplaylist:単体ダウンロード設定)
'noplaylist': True,
# 保存するファイル名の形式を指定(outtmpl:出力ファイル名テンプレート)
'outtmpl': f'{self.download_path}/%(title)s.%(ext)s',
}
# 設定した辞書を返す
return options
formatオプションは動画の品質を制御し、noplaylistでプレイリスト全体のダウンロードを防ぎます。outtmplでファイル名の形式を指定しています。
動画ダウンロード機能の実装
メインのダウンロード機能をクラス内に実装します。
def download_video(self, url):
try: # エラーが発生する可能性のある処理を囲む
# 先ほど設定したダウンロードオプションを取得
options = self.get_download_options()
# yt-dlpオブジェクトを作成して動画ダウンロードを実行
with yt_dlp.YoutubeDL(options) as downloader:
print(f"動画情報を取得中: {url}")
# 実際にダウンロードする前に動画の詳細情報を取得(extract_info:情報抽出機能)
info = downloader.extract_info(url, download=False)
# 取得した情報から動画タイトルを表示(存在しない場合は「不明」)
print(f"タイトル: {info.get('title', '不明')}")
# 再生時間を分かりやすい形式で表示
print(f"再生時間: {self.format_duration(info.get('duration', 0))}")
print("ダウンロードを開始します...")
# 実際に動画ファイルをダウンロード実行
downloader.download([url])
print("ダウンロードが完了しました")
except Exception as e: # 何らかのエラーが発生した場合の処理
# エラー内容をユーザーに分かりやすく表示
print(f"エラーが発生しました: {str(e)}")
try-except文を使用してエラーハンドリングを行い、extract_infoメソッドで動画情報を事前に取得してからダウンロードを実行します。
時間フォーマット機能の実装
再生時間を見やすい形式に変換するメソッドを追加します。
def format_duration(self, seconds):
# 秒数が存在しない場合は「不明」を返す
if not seconds:
return "不明"
# 秒数を時間・分・秒に分解して計算
hours = seconds // 3600 # 1時間=3600秒で割って時間を算出
minutes = (seconds % 3600) // 60 # 余りを60で割って分を算出
remaining_seconds = seconds % 60 # 最終的な余りが秒数
# 時間の有無に応じて適切な表示形式を選択
if hours > 0:
return f"{hours}時間{minutes}分{remaining_seconds}秒"
elif minutes > 0:
return f"{minutes}分{remaining_seconds}秒"
else:
return f"{remaining_seconds}秒"
このメソッドでは、秒数を時間、分、秒に分解して日本語形式で表示します。整数除算(//)と剰余演算(%)を使用して計算しています。
ユーザー入力処理機能の実装
ユーザーからの入力を処理し、ダウンロードを実行する機能を追加します。
def run(self):
# プログラムの開始画面を表示
print("=== YouTube動画ダウンローダー ===")
print("動画のURLを入力してください")
print("例: https://archive.org/details/BigBuckBunny_124(テスト用)")
print()
# ユーザーが終了するまで無限ループで入力を受け付け
while True:
# ユーザーからURL入力を受け取り、前後の空白を除去
url = input("動画URL(終了する場合は 'q' を入力): ").strip()
# 'q'が入力された場合はプログラム終了
if url.lower() == 'q':
print("プログラムを終了します")
break
# 何も入力されていない場合は再入力を促す
if not url:
print("URLを入力してください")
continue
# URLの形式が正しいかチェック
if not self.validate_url(url):
print("有効なURLを入力してください")
continue
# 全てのチェックが通った場合、動画ダウンロードを実行
self.download_video(url)
print()
while Trueでループを作成し、ユーザーが終了を選択するまで継続してURL入力を受け付けます。
URL検証機能の実装
入力されたURLが有効かどうかを確認するメソッドを追加します。
def validate_url(self, url):
# 対応している動画サイトのドメイン一覧
valid_domains = ['archive.org', 'youtube.com', 'youtu.be']
# 入力されたURLに対応ドメインが含まれているかチェック
return any(domain in url for domain in valid_domains)
any()関数を使用して、指定されたドメインのいずれかがURLに含まれているかを確認します。
メイン実行部分の実装
プログラムのエントリーポイントを作成します。
def main():
# VideoDownloaderクラスのインスタンスを作成
downloader = VideoDownloader()
# プログラムの実行を開始
downloader.run()
# このファイルが直接実行された場合のみmain関数を呼び出し
if __name__ == "__main__":
main()
if name == “main”により、このファイルが直接実行された場合のみmain関数が呼び出されます。
動作テスト実行
VSCodeのターミナルでプログラムを実行してテストします。
python video_downloader.py
プログラムが正常に起動し、URL入力画面が表示されることを確認してください。
本プロジェクトでは動作テスト用として、Internet ArchiveのサンプルURL「https://archive.org/details/BigBuckBunny_124」を使用します。このURLを入力すると以下のような出力が表示されます。
動画情報を取得中: https://archive.org/details/BigBuckBunny_124
[archive.org] Extracting URL: https://archive.org/details/BigBuckBunny_124
[archive.org] BigBuckBunny_124: Downloading webpage
[archive.org] BigBuckBunny_124: Downloading JSON metadata
タイトル: Big Buck Bunny
再生時間: 9分56秒
ダウンロードを開始します...
[archive.org] Extracting URL: https://archive.org/details/BigBuckBunny_124
[archive.org] BigBuckBunny_124: Downloading webpage
[archive.org] BigBuckBunny_124: Downloading JSON metadata
[info] BigBuckBunny_124: Downloading 1 format(s): 2
[download] Destination: downloads/Big Buck Bunny.avi
[download] 100% of 316.85MiB in 01:45
ダウンロードが完了しました
yt-dlpライブラリは動画のダウンロード進行状況を詳細に表示し、完了まで進行率をリアルタイムで確認できます。ダウンロードされた動画ファイルは「downloads」フォルダ内に保存されるので確認してください。また、自分の保存したいYouTubeのURLで試してみてください。
Step3:ダウンロード品質とオプションのカスタマイズ
このステップでは、動画の品質選択機能、ファイル形式の指定、詳細オプション設定など、より実用的なカスタマイズ機能を実装します。ユーザーのニーズに合わせて柔軟にダウンロード設定を変更できるようになります。
品質選択機能の実装
VideoDownloaderクラス内に、動画品質を選択するメソッドを追加します。
def select_quality(self):
print("\n=== 動画品質を選択してください ===")
# 動画品質の選択肢を辞書形式で定義
quality_options = {
'1': {'format': 'best[height<=480]', 'description': '480p (標準画質)'},
'2': {'format': 'best[height<=720]', 'description': '720p (高画質)'},
'3': {'format': 'best[height<=1080]', 'description': '1080p (フルHD)'},
'4': {'format': 'best', 'description': '最高画質(サイズ大)'}
}
# 選択肢をユーザーに表示
for key, value in quality_options.items():
print(f"{key}. {value['description']}")
# ユーザーが正しい選択をするまで繰り返し
while True:
# 選択番号の入力を受け取り
choice = input("選択番号を入力してください (1-4): ").strip()
# 有効な選択肢の場合はformat文字列を返す
if choice in quality_options:
return quality_options[choice]['format']
# 無効な選択の場合は再入力を促す
print("無効な選択です。1-4の番号を入力してください。")
このメソッドでは、辞書構造を使用して複数の品質オプションを管理し、ユーザーの選択に応じて適切なformat文字列を返します。
ファイル形式選択機能の実装
動画のファイル形式を選択する機能をクラス内に追加します。
def select_format(self):
print("\n=== ファイル形式を選択してください ===")
# ファイル形式の選択肢を辞書形式で定義
format_options = {
'1': {'ext': 'mp4', 'description': 'MP4形式(汎用性が高い)'},
'2': {'ext': 'avi', 'description': 'AVI形式(高品質)'},
'3': {'ext': 'mkv', 'description': 'MKV形式(高機能)'},
'4': {'ext': 'any', 'description': 'オリジナル形式(変換なし)'}
}
# ファイル形式の選択肢をユーザーに表示
for key, value in format_options.items():
print(f"{key}. {value['description']}")
# ユーザーが正しい選択をするまで繰り返し
while True:
# ファイル形式の選択番号を入力受け取り
choice = input("選択番号を入力してください (1-4): ").strip()
# 有効な選択肢の場合は拡張子を返す
if choice in format_options:
return format_options[choice]['ext']
# 無効な選択の場合は再入力を促す
print("無効な選択です。1-4の番号を入力してください。")
format_options辞書により、異なるファイル形式の特徴を説明付きで提供し、ユーザーが適切な選択を行えるようにしています。
get_download_optionsメソッドの変更
既存のget_download_optionsメソッドをget_custom_download_optionsに変更し、ユーザーの選択に基づいてオプションを動的に生成できるようにします。
def get_custom_download_options(self, quality_format, file_format):
# カスタマイズされたダウンロードオプションを設定
options = {
# ユーザーが選択した品質設定を適用
'format': quality_format,
# プレイリスト全体ではなく単一動画のみダウンロード
'noplaylist': True,
# 保存ファイル名の形式を指定
'outtmpl': f'{self.download_path}/%(title)s.%(ext)s',
# 動画の詳細情報をJSONファイルとして保存(writeinfojson:情報ファイル出力機能)
'writeinfojson': True,
# 利用可能な字幕ファイルをダウンロード(writesubtitles:字幕ダウンロード機能)
'writesubtitles': True,
# 自動生成字幕もダウンロード(writeautomaticsub:自動字幕取得機能)
'writeautomaticsub': True,
}
# オリジナル形式以外が選択された場合はファイル変換を設定
if file_format != 'any':
# ダウンロード後の変換処理を設定(postprocessors:後処理機能)
options['postprocessors'] = [{
# FFmpeg動画変換ツールを使用
'key': 'FFmpegVideoConvertor',
# 指定されたファイル形式に変換
'preferedformat': file_format,
}]
# 設定完了したオプション辞書を返す
return options
新しく追加されたオプションの説明
- writeinfojson 動画の詳細情報をJSONファイルとして保存
- writesubtitles 利用可能な字幕ファイルをダウンロード
- writeautomaticsub 自動生成字幕もダウンロード
- postprocessors ファイル形式変換の設定
設定確認表示機能の実装
選択された設定を確認表示するメソッドを追加します。
def display_settings(self, quality_format, file_format):
print("\n=== 現在の設定 ===")
# ユーザーが選択した設定内容を表示
print(f"動画品質: {quality_format}")
print(f"ファイル形式: {file_format}")
print(f"保存先: {self.download_path}/")
print("追加機能: 動画情報・字幕も同時ダウンロード")
# ユーザーに最終確認を求める
confirm = input("\nこの設定でダウンロードしますか? (y/n): ").strip().lower()
# yまたはyesが入力された場合はTrueを返す
return confirm == 'y' or confirm == 'yes'
このメソッドは、ユーザーが設定を確認してからダウンロードを開始できるようにする確認機能を提供します。
download_videoメソッドの変更
既存のdownload_videoメソッドをdownload_video_with_optionsに変更して、カスタム設定に対応させます。
def download_video_with_options(self, url, quality_format, file_format):
try: # エラー処理のためのtry文開始
# ユーザーの選択に基づいたカスタムオプションを取得
options = self.get_custom_download_options(quality_format, file_format)
# yt-dlpオブジェクトを作成してダウンロード処理開始
with yt_dlp.YoutubeDL(options) as downloader:
print(f"\n動画情報を取得中: {url}")
# ダウンロード前に動画の詳細情報を取得
info = downloader.extract_info(url, download=False)
# 取得した動画情報を表示
print(f"タイトル: {info.get('title', '不明')}")
print(f"再生時間: {self.format_duration(info.get('duration', 0))}")
print(f"ファイルサイズ: {self.format_filesize(info.get('filesize', 0))}")
# 設定確認画面を表示し、ユーザーの承認を得る
if self.display_settings(quality_format, file_format):
print("\nダウンロードを開始します...")
# 実際の動画ダウンロードを実行
downloader.download([url])
print("ダウンロードが完了しました")
# ダウンロード完了後のファイル一覧を表示
self.show_downloaded_files(info.get('title', 'unknown'))
else:
# ユーザーがキャンセルした場合の処理
print("ダウンロードをキャンセルしました")
except Exception as e: # エラーが発生した場合の処理
print(f"エラーが発生しました: {str(e)}")
メソッド名を変更し、品質とファイル形式のパラメータを受け取るように拡張しました。
ファイルサイズ表示機能の実装
ダウンロード前にファイルサイズを確認できる機能を追加します。
def format_filesize(self, size_bytes):
# ファイルサイズが不明な場合の処理
if not size_bytes:
return "不明"
# バイト数を適切な単位に変換
for unit in ['B', 'KB', 'MB', 'GB']:
# 1024未満の場合は現在の単位で表示
if size_bytes < 1024.0:
return f"{size_bytes:.1f} {unit}"
# 1024で割って次の単位に変換
size_bytes /= 1024.0
# 非常に大きなファイルの場合はTB単位で表示
return f"{size_bytes:.1f} TB"
for文と1024による除算を使用して、バイト数を適切な単位(KB、MB、GB)に変換して表示します。
ダウンロード完了ファイル表示機能の実装
ダウンロード完了後に生成されたファイル一覧を表示する機能を追加します。
def show_downloaded_files(self, title):
print(f"\n=== ダウンロード完了ファイル ===")
# downloadsフォルダ内のファイル一覧を取得
for filename in os.listdir(self.download_path):
# 動画タイトルに関連するファイルのみ表示
if title.replace(" ", "_") in filename or title in filename:
# ファイルの完全パスを作成
filepath = os.path.join(self.download_path, filename)
# ファイルサイズを取得
filesize = os.path.getsize(filepath)
# ファイル名とサイズを表示
print(f"・{filename} ({self.format_filesize(filesize)})")
os.listdirとos.path.getsizeを使用して、ダウンロードされたファイルとそのサイズを一覧表示します。
runメソッドの変更
runメソッドを変更して、新しいカスタム機能を活用します。
def run(self):
# プログラムの開始画面を表示
print("=== YouTube動画ダウンローダー ===")
print("動画のURLを入力してください")
print("例: https://archive.org/details/BigBuckBunny_124(テスト用)")
print()
# ユーザーが終了するまで無限ループ
while True:
# URL入力を受け取り
url = input("動画URL(終了する場合は 'q' を入力): ").strip()
# 終了コマンドのチェック
if url.lower() == 'q':
print("プログラムを終了します")
break
# 空入力のチェック
if not url:
print("URLを入力してください")
continue
# URL形式の検証
if not self.validate_url(url):
print("有効なURLを入力してください")
continue
# ユーザーに動画品質を選択させる
quality_format = self.select_quality()
# ユーザーにファイル形式を選択させる
file_format = self.select_format()
# 選択された設定でダウンロードを実行
self.download_video_with_options(url, quality_format, file_format)
print()
メソッドの流れにselect_qualityとselect_formatを追加し、カスタム設定でのダウンロードを実行するように変更しました。
動作テスト実行
VSCodeのターミナルでプログラムを実行してテストします。
python video_downloader.py
サンプルURL「https://archive.org/details/BigBuckBunny_124」を入力後、品質とファイル形式の選択画面が表示され、設定確認を経てダウンロードが実行されることを確認してください。ダウンロード完了後には、動画ファイルと共に情報ファイル(.info.json)や字幕ファイルも生成されます。ダウンロードされたファイルは「downloads」フォルダ内に保存されるので確認してください。また、自分の保存したいYouTubeのURLで試してみてください。
Step4:プロジェクトをGitHubにアップロード
このステップでは、完成したYouTubeダウンロードツールをGitHubにアップロードし、ポートフォリオとして活用できる形にします。最終的なファイル整理とコードの公開を行っていきます。
.gitignoreファイルの更新
既存の.gitignoreファイルに、プロジェクト固有の除外設定を追加します。
VSCodeで「.gitignore」ファイルを開き、以下の内容を末尾に追加してください。
# Virtual environment
myenv/
# Downloaded video files
downloads/
*.mp4
*.avi
*.mkv
*.webm
*.flv
# Video metadata files
*.info.json
*.description
*.annotations.xml
# Subtitle files
*.vtt
*.srt
*.ass
*.ttml
これらを追加する理由について説明します。
- myenv/ 仮想環境フォルダはプロジェクト固有のため、リポジトリに含める必要がありません
- downloads/ ダウンロードされた動画ファイルの保存フォルダを除外
- 動画ファイル形式 MP4、AVI、MKVなどの動画ファイルはサイズが大きいため除外
- メタデータファイル yt-dlpが生成する情報ファイルを除外
- 字幕ファイル 自動ダウンロードされる字幕ファイルを除外
README.mdファイルの作成
「README.md」ファイルをVSCodeのエクスプローラーパネルで新規作成し、以下の内容を記述してください。
# YouTube動画ダウンロードツール
## プロジェクト内容
yt-dlpライブラリを使用してYouTube動画を効率的にダウンロードするツールです。動画品質の選択、ファイル形式の指定、字幕の自動取得など、様々なカスタマイズ機能を備えています。Pythonを使った動画処理技術とユーザーインターフェース設計を学習することを目的として実装しました。動作テストとしてInternet Archiveの教育動画も利用できます。
## プロジェクト構成
```
youtube_video_downloader/
├── video_downloader.py # メインプログラム
├── requirements.txt # 依存関係管理
├── README.md # プロジェクト説明書
└── .gitignore # Git除外ファイル設定
```
## 必要要件/開発環境
- **Python 3.7以上**
- **インターネット接続** (動画ダウンロードのため)
- **VSCode** (開発環境)
- **Git** (バージョン管理)
- **FFmpeg** (ファイル形式変換時に必要)
### 使用ライブラリ
- **yt-dlp 2025.5.22** 動画ダウンロード処理
## 機能
- **動画品質選択** 480p、720p、1080p、最高画質から選択可能
- **ファイル形式変換** MP4、AVI、MKV形式への変換対応
- **字幕自動取得** 利用可能な字幕ファイルの自動ダウンロード
- **メタデータ保存** 動画の詳細情報をJSONファイルで保存
- **ダウンロード進行表示** リアルタイムで進行状況を確認
- **エラーハンドリング** 接続エラーや不正URLへの対応
- **ファイルサイズ表示** ダウンロード前のサイズ確認機能
- **URL検証機能** 対応サイトの自動判別
## 実行方法
### 1. リポジトリのクローン
```bash
git clone https://github.com/yourusername/youtube_video_downloader.git
cd youtube_video_downloader
```
### 2. 仮想環境の作成・アクティベート
**Windows**
```bash
python -m venv myenv
myenv\Scripts\activate
```
**macOS**
```bash
python3 -m venv myenv
source myenv/bin/activate
```
### 3. 依存関係のインストール
```bash
pip install -r requirements.txt
```
### 4. プログラムの実行
```bash
python video_downloader.py
```
実行後、URL入力画面が表示されます。
YouTubeのURLを入力して動画をダウンロードできます。
停止するには 'q' を入力してください。
## 使用例
動作テスト用として以下のURLで確認できます。
```
https://archive.org/details/BigBuckBunny_124
```
## 対応サイト
- YouTube (youtube.com, youtu.be)
- Internet Archive (archive.org)
## ダウンロードファイル
動画ファイルは「downloads」フォルダに保存されます。
設定により以下のファイルが生成されます。
- 動画ファイル (.mp4, .avi, .mkv等)
- 動画情報ファイル (.info.json)
- 字幕ファイル (.vtt, .srt等)
## 開発者
YuYu
プロジェクトのコミット・プッシュ
プロジェクトの全ての変更をGitHubに反映させましょう。
変更のステージングとコミット
- VSCodeの左側のアクティビティバーからソース管理アイコンをクリックします
- 変更内容セクションで、すべての変更ファイルを確認します
- 各ファイルの横にある「+」アイコンをクリックしてステージングします
- コミットメッセージ入力欄に「Add YouTube video downloader with yt-dlp」と入力します
- 「コミット」ボタンをクリックします
GitHubへのプッシュ
- コミット完了後、「変更の同期」または「プッシュ」ボタンをクリックします
- 初回の場合、GitHub認証が求められる場合があります
- 認証完了後、ローカルの変更がGitHubリポジトリに反映されます
GitHubでの確認
プロジェクトが正常にアップロードされたか確認しましょう。
- ブラウザでGitHubリポジトリページを開きます
- 以下のファイルが正しくアップロードされていることを確認します
- video_downloader.py (メインプログラムファイル)
- requirements.txt (依存関係管理ファイル)
- README.md (プロジェクト説明書)
- .gitignore (更新された除外設定ファイル)
- README.mdが適切に表示され、プロジェクトの説明が読みやすく表示されていることを確認します
- ファイル一覧にmyenv/フォルダやdownloads/フォルダ、動画ファイルが含まれていないことを確認します(.gitignoreで除外されているため)
これで本格的なYouTubeダウンロードツールが完成し、GitHubでのポートフォリオ公開も完了しました。作成したプロジェクトは、就職活動や案件獲得時の実績として活用できる実用的なツールとなっています。
このyt-dlp技術を基盤として、教育分野や企業の動画管理ニーズに対応できるサービスを開発することが可能です。特に、定期的な動画収集や品質管理が必要な業務では、高い価値を提供できる技術として活用できます。
まとめ
このプロジェクトを通じて、yt-dlpライブラリを使用した動画ダウンロードツールの開発から実践的なアプリケーション構築まで幅広く学習することができました。
得られたスキル
- yt-dlpライブラリ – 動画ダウンロードと高度なオプション設定
- ファイル形式変換技術 – FFmpegを使用した動画変換処理
- ユーザーインターフェース設計 – コマンドライン操作の最適化
- エラーハンドリング – 例外処理と安定性の確保
得られた経験
- 実際の動画プラットフォームとの連携経験
- ユーザビリティを考慮したツール開発手法の習得
- 設定管理とカスタマイズ機能の実装経験
- プロジェクト管理の基本的な流れの理解
- GitHubを使用したバージョン管理の実践的経験
得られた成果物
- 完全に動作する動画ダウンロードツール
- GitHubでのポートフォリオとして活用可能なプロジェクト
- 完全なPythonソースコード
次に学ぶべきこと
- GUI(tkinter)を使用した視覚的なインターフェースの追加
- 設定ファイル(JSON/YAML)による設定の永続化
- ログ機能の実装によるダウンロード履歴の管理
- プレイリスト一括ダウンロード機能の実装
- 定期実行機能による自動ダウンロードシステムの構築
このプロジェクトから応用できること
- yt-dlpライブラリを使用して教育機関向け動画管理ツールの開発による案件受注
- 動画品質選択機能を活用した企業研修動画の一括保存システムの構築
- ファイル形式変換技術を使用したYouTubeチャンネルのバックアップサービスの提供
- エラーハンドリング技術を応用した動画コンテンツの品質管理ツールとしての活用
- カスタマイズ機能を利用したオフライン視聴用動画準備の自動化
- yt-dlpとファイル変換技術を組み合わせた動画ファイル変換サービスの事業化
このyt-dlp技術を基盤として、教育分野や企業の動画管理ニーズに対応できるサービスを開発することが可能です。特に、定期的な動画収集や品質管理が必要な業務では、高い価値を提供できる技術として活用できます。
本コンテンツへの意見や質問