سلام هموطنان گرامی و دوستان عزیزم 
در قرن ۲۱ام، پس از عصر دانش و ارتباطات، و در عصر هوش مصنوعی، واقعا شرمآور است که:
زمانی که ذهنهای خلاق، هوش مصنوعی خلق میکنند، متاسفانه، ذهنهای کودن و متوهم، ذهنهای مستعد را مایوس، و ذهنهای خلاق را فراری میدهند!
〰️ داریوش تصدیقی - هفتم / بهمنماه / ۱۴۰۴
ضمن عرض تسلیت، خواستم در این وضعیت نابسامان اینترنت، کدی را در اختیار شما عزیزان قرار دهم که اگر احیانا توانستید به اینترنت بینالمللی متصل شده و برای تحقیق و توسعه فردی، فیلمهایی را که به صورت Playlist در YouTube قرار گرفتهاند را ابتدا دانلود کرده و سر فرصت مشاهده نمایید، امکانش فراهم شود.
ابتدا برنامه پایتون را دانلود و نصب کنید.
سپس بسته yt-dlp را نصب نمایید:
python -m pip install -U pip
python -m pip install -U yt-dlp
سپس سورسکد ذیل را در یک فایل مثلا app.py قرار دهید.
سپس با دستور ذیل، برنامه را اجرا نمایید:
python ./app.py
در سورس کد موجود، یک متغیر به نام playlist_ids وجود دارد که برای نمونه، Id مربوط به دو Playlist قرار گرفته است. میتوانید آنها را تغییر داده و یا حتی اضافه و تکمیل نمایید.
import os
from pathlib import Path
from yt_dlp import YoutubeDL
BASE_DOWNLOAD_PATH: str = "./downloads"
def download_playlist(
base_dir: str,
playlist_id: str,
):
"""
Download a YouTube playlist in order, up to 1080p, with English subtitles
if available. Creator ID is automatically extracted from playlist metadata.
"""
playlist_url: str = f"https://www.youtube.com/playlist?list={playlist_id}"
# Step 1: Extract playlist metadata (without downloading)
with YoutubeDL(params={"quiet": True}) as ydl:
info = ydl.extract_info(url=playlist_url, download=False)
# Extract creator/uploader identifier safely
creator_id = (
info.get("uploader_id")
or info.get("uploader")
or "unknown_creator"
)
# Step 2: Build directory structure
# base_dir / creator_id / playlist_id
playlist_path = Path(base_dir) / creator_id / playlist_id
playlist_path.mkdir(parents=True, exist_ok=True)
# Archive file to track downloaded videos
archive_file = playlist_path / "downloaded.txt"
ydl_opts = {
# Best video up to 1080p + best audio, then merge
"format": "bestvideo[height<=1080]+bestaudio/best[height<=1080]",
# Preserve playlist order in filenames
"outtmpl": str(
playlist_path / "%(playlist_index)02d - %(title)s.%(ext)s"
),
# Playlist handling
"noplaylist": False,
"yesplaylist": True,
# Merge output format
"merge_output_format": "mp4",
# Error handling
"ignoreerrors": True,
"retries": 3,
# Archive to avoid re-downloading videos
"download_archive": str(archive_file),
# Subtitle settings
"writesubtitles": True,
"writeautomaticsub": True,
"subtitleslangs": ["en"],
"subtitlesformat": "vtt",
}
with YoutubeDL(ydl_opts) as ydl:
ydl.download([playlist_url])
def main() -> None:
"""
The main of program
"""
os.system(command="cls" if os.name == "nt" else "clear")
playlist_ids: list[str] = [
"PLNJUbRWljtkb0AzjG0s78goCg0xOaI9KK",
"PLgt_9NUA44-Xu6-IbAE9DDti53hhx2ltM",
]
for playlist_id in playlist_ids:
download_playlist(
playlist_id=playlist_id,
base_dir=BASE_DOWNLOAD_PATH,
)
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
pass
except Exception as error:
print(f"\n[-] {error}!")
print()
#python #download #source_code #youtube #playlist
🆔 @Dariush_Tasdighi
🆔 @LLM_OPS
🆔 @IranianExperts
🆔 @DT_PYTHON_LEARNING
.