From 1419ad72d34049a8166c6c11477556e713f7c0d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=B0=D0=B1=D1=8B=D1=88=D0=B5=D0=B2=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC?= Date: Thu, 11 Aug 2022 20:24:35 +0300 Subject: [PATCH] Now create config with comments --- README.md | 29 ++++++++++++++++------------- main.py | 53 ++++++++++++++++++++++++++++++++++------------------- 2 files changed, 50 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 53c6f6c..bd4bbd5 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,41 @@ -# [Youtube Music Playlist Downloader](https://github.com/MBQbUtils/YoutubeMusicPlaylistDownloader) +# Youtube Music Playlist Downloader Скрипт скачивает плейлисты с YouTube и вырезает аудиодорожки. Если какие-то видео уже скачаны, они пропускаются. ## Как использовать -После первого запуска создаётся `config.json` +При первом запуске создаётся `config.json` Он имеет следующую структуру: + ```js { - // Путь до каталога с плейлистами + /* Путь до каталога с плейлистами */ "path": "./output/path/", - "format": "original", // Формат звука + "format": "original", /* Формат звука */ /* Используйте формат "original", чтобы не менять формат звука и не зависеть от наличия ffmpeg Форматы: - 'aac', 'alac', 'flac', - 'm4a', 'mp3', 'opus', - 'vorbis', 'wav' + "aac", "alac", "flac", + "m4a", "mp3", "opus", + "vorbis", "wav" */ - "playlists": [ // Ссылки на плейлисты с музыкальными клипами - "https://www.youtube.com/playlist?list=PLL_example", - "https://www.youtube.com/playlist?list=PLL_example2" + "playlists": [ /* Ссылки на плейлисты с музыкальными клипами */ + "https://www.youtube.com/playlist?list=PLL_example", /* Пример первый */ + "https://www.youtube.com/playlist?list=PLL_example2" /* Пример последний */ ] } ``` Добавьте ссылки на плейлисты в `config.json` -и запустите скрипт заново. +сохраните изменения и продолжите работу скрипта, нажав `Enter`. + Не удаляйте файл `playlists.cache`. -Он позволяет не скачивать по новой треки при повторном запуске. +Он позволяет не скачивать заново треки при повторном запуске. + `config.json` поддерживает комментарии в стиле `/* комментарий */`. Чтобы докачать новые видео из плейлиста, просто перезапустите скрипт ## Установка 1. [**Скачайте скрипт**](https://github.com/MBQbUtils/YoutubeMusicPlaylistDownloader/releases/latest/download/main.exe) -2. Запустите его первый раз (он создаст всё необходимое и завершит работу) +2. Запустите его, он создаст всё необходимое 3. Следуйте инструкциям выше. ## Благодарности diff --git a/main.py b/main.py index 2b23b75..571db4f 100644 --- a/main.py +++ b/main.py @@ -5,34 +5,49 @@ Если какие-то видео уже скачаны, они пропускаются. """ +import json import os +import re import sys +import textwrap import time import traceback import yt_dlp -import json -import re -from urllib import request def read_config(): - data = { - 'path': './out/', - 'format': 'original', - 'playlists': [] - } - + config_content = """ + { + /* Путь до каталога с плейлистами */ + "path": "./output/path/", + "format": "original", /* Формат звука */ + /* Используйте формат "original", чтобы не менять формат звука + и не зависеть от наличия ffmpeg + Форматы: + "aac", "alac", "flac", + "m4a", "mp3", "opus", + "vorbis", "wav" + */ + "playlists": [ /* Ссылки на плейлисты с музыкальными клипами */ + "https://www.youtube.com/playlist?list=PLL_example", /* Пример первый */ + "https://www.youtube.com/playlist?list=PLL_example2" /* Пример последний */ + ] + }""" + config_content = textwrap.dedent(config_content).strip() + config_path = os.path.abspath('config.json') try: - with open('config.json', encoding='utf-8') as f: - json_string = re.sub(pattern=r'\/\*[\s\S]*?\*\/', repl='', string=f.read()) - data = json.loads(json_string) - except FileNotFoundError: - with open('config.json', 'w', encoding='utf-8') as f: - json.dump(data, f, indent=4) - readme_source = 'https://raw.githubusercontent.com/MBQbUtils/YoutubeMusicPlaylistDownloader/main/README.md' - readme_path = 'README.md' - request.urlretrieve(readme_source, readme_path) - return data + if not os.path.exists(config_path): + with open(config_path, 'w', encoding='utf-8') as f: + f.write(config_content) + print(f"Edit config at {config_path!r}") + input("And then press Enter...") + with open(config_path, encoding='utf-8') as f: + config_content = f.read() + config_content = re.sub(pattern=r'\/\*[\s\S]*?\*\/', repl='', string=config_content) + return json.loads(config_content) + except: + print("Error on read config:") + raise def output(text):