Как выгрузить свои видео с youtube-канала если их очень много

В свете последних событий перед множеством людей встал вопрос как скачать все свои видео с ютуба и самое главное как это сделать быстро. Если на вашем канале всего пару тысяч видео, а то и меньше, то тут не должно возникнуть сложностей и достаточно будет запустить специальную штуку, которая сделает это автоматически.

Есть такая штука, называется yotube-dl. Я её использую под линуксом, но учитывая что есть одноименный метод для python, то ей можно пользоваться под виндой. Для скачивания всего видео с канала, подчеркну, всего опубликованного видео канала, достаточно запустить простую команду:

youtube-dl https://www.youtube.com/channel/UCJXflYyDkjhggjHfy0Ww4GnA

В качестве ссылки указываем ссылку на канал. При желании можно указать ссылку на плейлист, тогда программа скачает видео только изх плей листа.

Имейте в виду. Эта команда скачает только те видео, которые опубликованы. Доступные по ссылке и черновики она не скачает. Это придется качать вручную.

К сожалению данный способ подходит только для тех, у кого не так много видео. В моем случае речь идет о 28 664 видео. С помощью данного способа на скачивание всего этого количества уйдет очень много времени, которого у меня нет от слова совсем ибо задача из числа «надо вчера».

Заказчиком является муниципально учреждение и пришел приказ из администрации переехать на рутуб. Проблема заключается не только в том, чтобы скачать с ютуба и загрузить на рутуб, но и заменить все это дело на сайте. Задачка не из простых.

Первое и самое очевидное: качать надо в несколько потоков, не меньше 10, а лучше побольше. Но тут надо смотреть по возможностям компьютера в плане объема оперативной памяти и пропускной способности интернета. Получив задачу, я сел писать программу. На написание и тестирование у меня ушло чуть больше двух дней.

Почему критичен объем оперативной памяти. Причина проста. Скачивание видео производится стандартной библиотекой requests, а она, если не ошибаюсь, содержимое загруженного файла держит в оперативной памяти. Не самый лучший вариант, но это необходимо для облегчения контроля. Если использовать тот же curl, то он может вылететь с ошибкой не докачав файл и тогда нам потребуется выполнять HEAD-запрос на получение заголовка Content-Length. Но и тут мы можем получить проблему, сервера гугла иногда возвращают Content-Length со значением 0. Вот и приходится городить огород с кучей запросов. По-этому я выбрал вариант с одним запросом и загрузкой файла с помощью requests.

На requests я перешел когда уже было скачано больше 4 тысяч видео. В какой-то момент я заметил недокачанные видео. Это при том, что сначала видео качается во временную папку, а уже после завершения загрузки происходило перемещение. Но такой подход, как оказалось, не спасал от ошибок и «битые» видео попадали в папку к остальным. Набросав простенький скрипт проверки, было отсортировано 131 видео, которое было загружено не до конца.

Вторым очевидным требованием стало хранение информации в БД, и естественно в MySQL или подобной. Почему требуется БД, это лучший вариант для многопоточности и для выборки нужной информации. Например та же SQLite не позволяет работать в несколько потоков. Ну а хранение информаци в файле в принципе смешно даже как вариант рассматривать.

Первым делом нам надо нафигачить в базу информации. В качестве инфомации у нас выступает либо ссылка на видеоролик, либо идентификатор в виде строки из разных букв, цифр и других знаков. Источником этих данных можеть быть не только ютуб. В моем случае это был сайт, точнее его база данных, где хранились ссылки на сюжеты. Первостепенная задача решить вопрос работы сайта, а потом уже спасать все остальное.

Если на вашем канале меньше 20 000 роликов, то инфу можно взять из Toutube API, вытреся список uploads. В моем случае это не вариант, ибо на канале заказчика больше 20 тысяч видосов. Мне придется это выгружать с помощью selenium тупо шерстя постраничную навигацию в «творческой студии». Другого варианта мне найти не удалось.

Как собрать список видео с помощью Youtube API

Как и способ озвученный вначале, этот способ соберет список только опубликованных видео, то есть доступных для анонимного пользователя. Видео доступное по ссылке или сро статусом черновик этот способ не позволит скачать.

Для работы этого скрипта потпребуется получить токен Youtube API. Скрипт писал на Python.

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import requests, json, sys, pymysql

list_id = 'UUPRhjhgggCEA6DX8i2Dncwj4w'#Идентивикатор списка

api_key = '<Youtube API key>'#Тут указываем наш токен

url = f'https://www.googleapis.com/youtube/v3/playlistItems?&part=snippet&playlistId={list_id}&maxResults=50&&key={api_key}'


def init_db():
	con = pymysql.connect('localhost', 'db_name', 'pass', 'db_user',  charset='utf8', cursorclass=pymysql.cursors.DictCursor)
	cur = con.cursor()
	cur.execute("SET CHARSET 'utf8';")
	return con

yids = []

con = init_db()
cur = con.cursor()


page_token = None
all_count = 0
while True:
	if page_token:
		full_url = f'{url}&pageToken={page_token}'
	else:
		full_url = url

	response = requests.get( full_url )
	res_json = json.loads( response.content )
	all_count += len(res_json['items'])
	for item in res_json['items']:
		yid = item['snippet']['resourceId']['videoId']
		if yid not in yids:
			yids.append(yid)
			cur.execute( 'INSERT INTO `all_video`(y_id) VALUES (%s)', ( yid, ) )
			if len(yids) % 50 == 0:
				con.commit()

	try:
		page_token = res_json['nextPageToken']
	except:
		break


con.commit()

Этот скрипт берет список идентификаторов видео и записывает их в базу данных. Дальше я уже работаю со списком из базы. Собираю дополнительную информацию, как то: заголовок, качество, дата публикации и т.д.

На текущий момент (3 мая 2022 года) пока происходит скачивание видосов из списка, который я взял из базы данных. На очереди стоит ещё один список из базы старого сайта, там чуть больше 18 тысяч роликов. Параллельно с этим начну колупать сбор всего списка видосов. По мере продвижения в этом вопросе, буду дополнять статью.

Если хочешь быть в курсе, там вверху есть ссылка на мой тедлеграм-канал. Пока он пуст ибо я его создал недавно, но я надеюсь буджу туда писать.

На сайте отсутствует реклама

Автор не получает прямой выгоды. Если считаете что материал полезен, поддержите проект

Номер карты

Заранее спасибо!

Бидюков Денис

Эксперт по сайтам

Занимаюсь продвижением личного бренда с помощью сайта и SEO. Если Вы хотите из обычного сантехника, электрика, врача или фотографа стать востребованным и высокооплачиваемым  специалистом, то я с легкостью Вам помогу.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *