Мои скрипты: различия между версиями
Владимир (обсуждение | вклад) м Содержимое страницы заменено на «Тут я буду аккумулировать мои наработки и автоматизации, в данном случае на python. Автоматизация выравнивания громкости звуковых дорожек. Что это из себя представляет. Представим, что мы скачали сериала или фильм, с закадровым перевод...» Метки: замена визуальный редактор отключён |
Владимир (обсуждение | вклад) мНет описания правки |
||
| Строка 10: | Строка 10: | ||
Для это существует множество методов, но самый популярный и мощный, основании конечно же на ИИ, это | Для это существует множество методов, но самый популярный и мощный, основании конечно же на ИИ, это | ||
= YT-DLP Downloader Script = | |||
Простой и мощный Python-скрипт для автоматизации скачивания видео с помощью утилиты [[yt-dlp]]. Скрипт автоматически определяет наилучший доступный HLS-поток и загружает его в несколько потоков для максимальной скорости. | |||
== Назначение == | |||
Скрипт предназначен для упрощения процесса загрузки видео. Его ключевые возможности: | |||
* '''Автоматический выбор качества:''' Самостоятельно находит HLS-поток с самым высоким разрешением. | |||
* '''Многопоточная загрузка:''' Ускоряет скачивание, используя несколько потоков одновременно. | |||
* '''Пакетная обработка:''' Может обрабатывать список ссылок из файла <code>links.txt</code>. | |||
* '''Гибкая настройка:''' Позволяет через аргументы командной строки указать папку для сохранения, количество потоков и режим постобработки. | |||
* '''Опциональная постобработка:''' По умолчанию отключен вызов <code>ffmpeg</code> для исправления контейнера, что ускоряет процесс, но его можно включить при необходимости. | |||
== Установка == | |||
Перед использованием скрипта убедитесь, что в вашей системе установлены необходимые компоненты. | |||
# '''[[Python]]''': Требуется Python версии 3.6 или выше. | |||
# '''[[yt-dlp]]''': Основная утилита для скачивания. Установить можно через pip: | |||
# <pre>pip install yt-dlp</pre> | |||
# '''[[FFmpeg]]''' (Опционально): Необходим, если вы планируете использовать функцию исправления видеофайлов (аргумент <code>--use-fixup</code>). | |||
# '''Сам скрипт:''' Сохраните исходный код в файл с именем <code>downloader.py</code>. | |||
== Использование == | |||
Скрипт запускается из командной строки. Основной способ работы — через аргументы. | |||
=== Источник ссылок === | |||
Скрипт сначала ищет файл <code>links.txt</code> в той же директории. | |||
* '''Если файл найден и не пуст''', скрипт обработает все ссылки из него по очереди. Каждая ссылка должна быть на новой строке. | |||
* '''Если файл пуст или отсутствует''', скрипт запросит ввести одну ссылку для скачивания в консоли. | |||
=== Аргументы командной строки === | |||
Вы можете настроить работу скрипта с помощью следующих аргументов: | |||
* <code>-h, --help</code>: Показать справочное сообщение и выйти. | |||
* <code>-p PATH, --path PATH</code>: Указать путь к папке для сохранения файлов. Если не указан, файлы сохраняются рядом со скриптом. | |||
* <code>-t THREADS, --threads THREADS</code>: Задать количество потоков для скачивания. По умолчанию: 6. | |||
* <code>--use-fixup</code>: Включить постобработку видео с помощью <code>ffmpeg</code>. По умолчанию отключена. | |||
=== Примеры команд === | |||
* '''Простой запуск (6 потоков, сохранение в текущую папку, без постобработки):''' | |||
<pre>python downloader.py</pre> | |||
* '''Скачать в 12 потоков в указанную папку:''' | |||
<pre>python downloader.py -t 12 -p "D:\Видео\Новинки"</pre> | |||
* '''Скачать с включенной постобработкой <code>ffmpeg</code>:''' | |||
<pre>python downloader.py --use-fixup</pre> | |||
== Исходный код == | |||
{| class="mw-collapsible mw-collapsed" style="width: 100%; border: 1px solid #a2a9b1;" | |||
!<div style="text-align: left; padding: 0.5em;">Показать/скрыть исходный код</div> | |||
|- | |||
|<syntaxhighlight lang="python"> | |||
import subprocess | |||
import os | |||
import re | |||
import argparse | |||
# --- НАСТРОЙКИ --- | |||
LINKS_FILE = "links.txt" # Имя файла со ссылками | |||
# ----------------- | |||
def get_best_format(url: str) -> str | None: | |||
""" | |||
Получает список форматов, находит последний ID типа 'hls-<число>' и возвращает его. | |||
""" | |||
print(f"\n🔎 Получаю список форматов для видео: {url}") | |||
try: | |||
command = ["yt-dlp", "-F", url] | |||
result = subprocess.run(command, capture_output=True, text=True, check=True, encoding='utf-8') | |||
lines = result.stdout.split('\n') | |||
hls_format_ids = [] | |||
format_regex = re.compile(r"^(?P<id>hls-\d+)\s") | |||
for line in lines: | |||
match = format_regex.match(line.strip()) | |||
if match: | |||
hls_format_ids.append(match.group('id')) | |||
if not hls_format_ids: | |||
print("❌ Форматы 'hls-<число>' не найдены для этой ссылки.") | |||
return None | |||
best_format_id = hls_format_ids[-1] | |||
print(f"✅ Найдено лучшее качество (последний в списке 'hls-'): {best_format_id}") | |||
return best_format_id | |||
except FileNotFoundError: | |||
print("❌ ОШИБКА: `yt-dlp` не найден. Убедитесь, что он установлен и доступен в PATH.") | |||
return None | |||
except subprocess.CalledProcessError as e: | |||
print(f"❌ ОШИБКА: yt-dlp вернул ошибку при получении форматов. Возможно, ссылка неверна.") | |||
print(e.stderr) | |||
return None | |||
except Exception as e: | |||
print(f"❌ Произошла непредвиденная ошибка: {e}") | |||
return None | |||
def download_video(url: str, format_id: str, threads: int, output_path: str | None, use_fixup: bool): | |||
""" | |||
Запускает скачивание видео с указанным ID формата, количеством потоков и путем сохранения. | |||
""" | |||
print(f"🚀 Начинаю загрузку с ID '{format_id}' в {threads} потоков...") | |||
if use_fixup: | |||
print("🛠️ Постобработка ffmpeg (fixup) ВКЛЮЧЕНА.") | |||
else: | |||
print("🛠️ Постобработка ffmpeg (fixup) ОТКЛЮЧЕНА.") | |||
try: | |||
command = [ | |||
"yt-dlp", | |||
"-f", format_id, | |||
"-N", str(threads), | |||
url | |||
] | |||
if not use_fixup: | |||
command.extend(["--fixup", "never"]) | |||
if output_path: | |||
if not os.path.exists(output_path): | |||
print(f"📁 Создаю папку для сохранения: {output_path}") | |||
os.makedirs(output_path) | |||
command.extend(["-P", output_path]) | |||
subprocess.run(command, check=True) | |||
print("✅ Загрузка успешно завершена!") | |||
except FileNotFoundError: | |||
print("❌ ОШИБКА: `yt-dlp` не найден. Убедитесь, что он установлен.") | |||
except subprocess.CalledProcessError: | |||
print("❌ ОШИБКА: Произошла ошибка во время скачивания.") | |||
except Exception as e: | |||
print(f"❌ Произошла непредвиденная ошибка при скачивании: {e}") | |||
def process_url(url: str, threads: int, output_path: str | None, use_fixup: bool): | |||
""" | |||
Полный процесс обработки одной ссылки: получение формата и скачивание. | |||
""" | |||
url = url.strip() | |||
if not url: | |||
return | |||
best_format_id = get_best_format(url) | |||
if best_format_id: | |||
download_video(url, best_format_id, threads, output_path, use_fixup) | |||
def main(): | |||
""" | |||
Главная функция скрипта. | |||
""" | |||
parser = argparse.ArgumentParser( | |||
description=""" | |||
Скрипт для автоматического скачивания видео с помощью yt-dlp. | |||
Основная логика работы: | |||
1. Автоматически находит HLS-поток ('hls-<число>') с самым высоким качеством. | |||
2. Скачивает видео в несколько потоков для ускорения процесса. | |||
3. Позволяет гибко настраивать параметры через аргументы командной строки. | |||
4. Источник ссылок: файл 'links.txt' или прямой ввод, если файл пуст. | |||
""", | |||
formatter_class=argparse.RawTextHelpFormatter | |||
) | |||
parser.add_argument( | |||
'-p', '--path', | |||
type=str, | |||
help='Полный путь к папке для сохранения скачанных файлов.\nПример: "C:\\Users\\User\\Downloads"\nЕсли аргумент не указан, файлы сохраняются в ту же папку,\nгде находится скрипт.' | |||
) | |||
parser.add_argument( | |||
'-t', '--threads', | |||
type=int, | |||
default=6, | |||
help='Количество одновременных потоков для скачивания каждого файла.\nБольше потоков может ускорить загрузку, но увеличивает нагрузку на сеть.\n(По умолчанию: 6)' | |||
) | |||
parser.add_argument( | |||
'--use-fixup', | |||
action='store_true', | |||
help='Флаг для принудительного включения постобработки видео с помощью ffmpeg.\nЭто может исправить ошибки в контейнере (например, MPEG-TS в MP4),\nно замедляет процесс. По умолчанию эта функция отключена.' | |||
) | |||
args = parser.parse_args() | |||
urls_to_download = [] | |||
if os.path.exists(LINKS_FILE) and os.path.getsize(LINKS_FILE) > 0: | |||
print(f"📖 Найден файл '{LINKS_FILE}'. Читаю ссылки из него.") | |||
with open(LINKS_FILE, 'r', encoding='utf-8') as f: | |||
urls_to_download = [line for line in f if line.strip()] | |||
if not urls_to_download: | |||
print(f"📝 Файл '{LINKS_FILE}' пуст или не найден.") | |||
user_url = input("➡️ Введите ссылку на видео для скачивания: ") | |||
if user_url: | |||
urls_to_download.append(user_url) | |||
if not urls_to_download: | |||
print(" ссылок для скачивания нет. Завершаю работу.") | |||
return | |||
print(f"\nНачинаю обработку {len(urls_to_download)} ссылок...") | |||
print(f"Параметры: Потоков = {args.threads}, Путь = '{args.path or 'Папка со скриптом'}'") | |||
print("-" * 30) | |||
for url in urls_to_download: | |||
process_url(url, threads=args.threads, output_path=args.path, use_fixup=args.use_fixup) | |||
print("-" * 30) | |||
print("🎉 Все задачи выполнены!") | |||
if __name__ == "__main__": | |||
main() | |||
</syntaxhighlight> | |||
|} | |||
Версия от 16:19, 19 октября 2025
Тут я буду аккумулировать мои наработки и автоматизации, в данном случае на python.
Автоматизация выравнивания громкости звуковых дорожек.
Что это из себя представляет. Представим, что мы скачали сериала или фильм, с закадровым переводом. Так как закадровый перевод всегда поверх оригинальной дорожки, получается, что оригинальная дорожка, простыми словами становится тише.
Есть студии которые заглушают дорожку только в местах где идет пере озвучка. Я не разу не встречал случаев когда кто то бы специально заглушал оригинальную озвучку чтобы не снижать громкость остальных звуков. Всё же живём в век технологий.
Для это существует множество методов, но самый популярный и мощный, основании конечно же на ИИ, это
YT-DLP Downloader Script
Простой и мощный Python-скрипт для автоматизации скачивания видео с помощью утилиты yt-dlp. Скрипт автоматически определяет наилучший доступный HLS-поток и загружает его в несколько потоков для максимальной скорости.
Назначение
Скрипт предназначен для упрощения процесса загрузки видео. Его ключевые возможности:
- Автоматический выбор качества: Самостоятельно находит HLS-поток с самым высоким разрешением.
- Многопоточная загрузка: Ускоряет скачивание, используя несколько потоков одновременно.
- Пакетная обработка: Может обрабатывать список ссылок из файла
links.txt. - Гибкая настройка: Позволяет через аргументы командной строки указать папку для сохранения, количество потоков и режим постобработки.
- Опциональная постобработка: По умолчанию отключен вызов
ffmpegдля исправления контейнера, что ускоряет процесс, но его можно включить при необходимости.
Установка
Перед использованием скрипта убедитесь, что в вашей системе установлены необходимые компоненты.
- Python: Требуется Python версии 3.6 или выше.
- yt-dlp: Основная утилита для скачивания. Установить можно через pip:
pip install yt-dlp
- FFmpeg (Опционально): Необходим, если вы планируете использовать функцию исправления видеофайлов (аргумент
--use-fixup). - Сам скрипт: Сохраните исходный код в файл с именем
downloader.py.
Использование
Скрипт запускается из командной строки. Основной способ работы — через аргументы.
Источник ссылок
Скрипт сначала ищет файл links.txt в той же директории.
- Если файл найден и не пуст, скрипт обработает все ссылки из него по очереди. Каждая ссылка должна быть на новой строке.
- Если файл пуст или отсутствует, скрипт запросит ввести одну ссылку для скачивания в консоли.
Аргументы командной строки
Вы можете настроить работу скрипта с помощью следующих аргументов:
-h, --help: Показать справочное сообщение и выйти.-p PATH, --path PATH: Указать путь к папке для сохранения файлов. Если не указан, файлы сохраняются рядом со скриптом.-t THREADS, --threads THREADS: Задать количество потоков для скачивания. По умолчанию: 6.--use-fixup: Включить постобработку видео с помощьюffmpeg. По умолчанию отключена.
Примеры команд
- Простой запуск (6 потоков, сохранение в текущую папку, без постобработки):
python downloader.py
- Скачать в 12 потоков в указанную папку:
python downloader.py -t 12 -p "D:\Видео\Новинки"
- Скачать с включенной постобработкой
ffmpeg:
python downloader.py --use-fixup
Исходный код
Показать/скрыть исходный код
|
|---|
import subprocess
import os
import re
import argparse
# --- НАСТРОЙКИ ---
LINKS_FILE = "links.txt" # Имя файла со ссылками
# -----------------
def get_best_format(url: str) -> str | None:
"""
Получает список форматов, находит последний ID типа 'hls-<число>' и возвращает его.
"""
print(f"\n🔎 Получаю список форматов для видео: {url}")
try:
command = ["yt-dlp", "-F", url]
result = subprocess.run(command, capture_output=True, text=True, check=True, encoding='utf-8')
lines = result.stdout.split('\n')
hls_format_ids = []
format_regex = re.compile(r"^(?P<id>hls-\d+)\s")
for line in lines:
match = format_regex.match(line.strip())
if match:
hls_format_ids.append(match.group('id'))
if not hls_format_ids:
print("❌ Форматы 'hls-<число>' не найдены для этой ссылки.")
return None
best_format_id = hls_format_ids[-1]
print(f"✅ Найдено лучшее качество (последний в списке 'hls-'): {best_format_id}")
return best_format_id
except FileNotFoundError:
print("❌ ОШИБКА: `yt-dlp` не найден. Убедитесь, что он установлен и доступен в PATH.")
return None
except subprocess.CalledProcessError as e:
print(f"❌ ОШИБКА: yt-dlp вернул ошибку при получении форматов. Возможно, ссылка неверна.")
print(e.stderr)
return None
except Exception as e:
print(f"❌ Произошла непредвиденная ошибка: {e}")
return None
def download_video(url: str, format_id: str, threads: int, output_path: str | None, use_fixup: bool):
"""
Запускает скачивание видео с указанным ID формата, количеством потоков и путем сохранения.
"""
print(f"🚀 Начинаю загрузку с ID '{format_id}' в {threads} потоков...")
if use_fixup:
print("🛠️ Постобработка ffmpeg (fixup) ВКЛЮЧЕНА.")
else:
print("🛠️ Постобработка ffmpeg (fixup) ОТКЛЮЧЕНА.")
try:
command = [
"yt-dlp",
"-f", format_id,
"-N", str(threads),
url
]
if not use_fixup:
command.extend(["--fixup", "never"])
if output_path:
if not os.path.exists(output_path):
print(f"📁 Создаю папку для сохранения: {output_path}")
os.makedirs(output_path)
command.extend(["-P", output_path])
subprocess.run(command, check=True)
print("✅ Загрузка успешно завершена!")
except FileNotFoundError:
print("❌ ОШИБКА: `yt-dlp` не найден. Убедитесь, что он установлен.")
except subprocess.CalledProcessError:
print("❌ ОШИБКА: Произошла ошибка во время скачивания.")
except Exception as e:
print(f"❌ Произошла непредвиденная ошибка при скачивании: {e}")
def process_url(url: str, threads: int, output_path: str | None, use_fixup: bool):
"""
Полный процесс обработки одной ссылки: получение формата и скачивание.
"""
url = url.strip()
if not url:
return
best_format_id = get_best_format(url)
if best_format_id:
download_video(url, best_format_id, threads, output_path, use_fixup)
def main():
"""
Главная функция скрипта.
"""
parser = argparse.ArgumentParser(
description="""
Скрипт для автоматического скачивания видео с помощью yt-dlp.
Основная логика работы:
1. Автоматически находит HLS-поток ('hls-<число>') с самым высоким качеством.
2. Скачивает видео в несколько потоков для ускорения процесса.
3. Позволяет гибко настраивать параметры через аргументы командной строки.
4. Источник ссылок: файл 'links.txt' или прямой ввод, если файл пуст.
""",
formatter_class=argparse.RawTextHelpFormatter
)
parser.add_argument(
'-p', '--path',
type=str,
help='Полный путь к папке для сохранения скачанных файлов.\nПример: "C:\\Users\\User\\Downloads"\nЕсли аргумент не указан, файлы сохраняются в ту же папку,\nгде находится скрипт.'
)
parser.add_argument(
'-t', '--threads',
type=int,
default=6,
help='Количество одновременных потоков для скачивания каждого файла.\nБольше потоков может ускорить загрузку, но увеличивает нагрузку на сеть.\n(По умолчанию: 6)'
)
parser.add_argument(
'--use-fixup',
action='store_true',
help='Флаг для принудительного включения постобработки видео с помощью ffmpeg.\nЭто может исправить ошибки в контейнере (например, MPEG-TS в MP4),\nно замедляет процесс. По умолчанию эта функция отключена.'
)
args = parser.parse_args()
urls_to_download = []
if os.path.exists(LINKS_FILE) and os.path.getsize(LINKS_FILE) > 0:
print(f"📖 Найден файл '{LINKS_FILE}'. Читаю ссылки из него.")
with open(LINKS_FILE, 'r', encoding='utf-8') as f:
urls_to_download = [line for line in f if line.strip()]
if not urls_to_download:
print(f"📝 Файл '{LINKS_FILE}' пуст или не найден.")
user_url = input("➡️ Введите ссылку на видео для скачивания: ")
if user_url:
urls_to_download.append(user_url)
if not urls_to_download:
print(" ссылок для скачивания нет. Завершаю работу.")
return
print(f"\nНачинаю обработку {len(urls_to_download)} ссылок...")
print(f"Параметры: Потоков = {args.threads}, Путь = '{args.path or 'Папка со скриптом'}'")
print("-" * 30)
for url in urls_to_download:
process_url(url, threads=args.threads, output_path=args.path, use_fixup=args.use_fixup)
print("-" * 30)
print("🎉 Все задачи выполнены!")
if __name__ == "__main__":
main()
|