LINUX.ORG.RU

Как работают regexp в yt-dlp?

 ,


0

2

Привет, ЛОР!

Я уже мозг сломал, почему оно не работает. Хочу скачать видео с ютуб-канала с коллекцией по плейлистам. Имена плейлистов на кириллице, содержат пробелы. Некоторые плейлисты надо исключить. Некоторые плейлисты могут иметь название на англ. и на кириллице и с пробелами. Если бы я мог писать регулярки с опорой на какой-то regex101 и yt-dlp работал бы ожидаемо, меня бы это устроило. Но оно не работает так, как я ожидаю.

Собсно вопрос в том, что я делаю не так, что регулярки не работают?

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

Вот я показываю список плейлистов на канале, которые матчатся регулярке «testplaylist». По данным regex101 всё должно сматчится и хотя бы один плейлист с идентичным именем должен быть в выводе команды. Но у меня ничего не вывелось.

desktop:~$ ./bin/yt-dlp --print playlist_title --match-filters 'playlist=~testplaylist' https://www.youtube.com/@maxmuller8233/playlists --no-warning
desktop:~$

Добавляю в фильтр отрицание ! всего условия матчинга и получаю результат. Т.е. как будто бы выражение валидное, но почему-то при инвертировании логики меняется и сама логика.

desktop:~$ ./bin/yt-dlp --print playlist_title --match-filters 'playlist!=~testplaylist' https://www.youtube.com/@maxmuller8233/playlists --no-warning
testplaylist кириллица
тестовыйплейлист
тестовый плейлист
test playlist
testplaylist
desktop:~$

Все иные попытки запихать выражение в разные кавычки, слеши тоже не дают результата.

Доходит до смешного! Вот такое выражение с точным сравнением вывода и фильтра работает только в инвертированом виде. Тут мы не видим плейлиста с именем testplaylist

desktop:~$ ./bin/yt-dlp --print playlist_title --match-filters 'playlist!=testplaylist' https://www.youtube.com/@maxmuller8233/playlists --no-warning
testplaylist кириллица
тестовыйплейлист
тестовый плейлист
test playlist
desktop:~$

Убираем отрицание и не видим ничего

deskop:~$ ./bin/yt-dlp --print playlist_title --match-filters 'playlist=testplaylist' https://www.youtube.com/@maxmuller8233/playlists --no-warning
desktop:~$

Ну и напоследок весёлые факты из моего дебага — паттерн регулярки t.*

deskop:~$ ./bin/yt-dlp --print playlist_title --match-filters 'playlist~=t.*' https://www.youtube.com/@maxmuller8233/playlists --no-warning
testplaylist кириллица
test playlist
testplaylist
deskop:~$

Паттерн регулярки te.*

deskop:~$ ./bin/yt-dlp --print playlist_title --match-filters 'playlist~=te.*' https://www.youtube.com/@maxmuller8233/playlists --no-warning
deskop:~$

deskop:~$ python -V
Python 3.12.6
deskop:~$ ./bin/yt-dlp --version
2024.10.07
deskop:~$ bash --version
GNU bash, версия 5.2.26(1)-release (x86_64-redhat-linux-gnu)
★★★★

Добавил --verbose и стало понятно, что матчинг также происходит и во время загрузки списка плейтистов из раздела (таба) «Плейлисты» канала:

[youtube:tab] Extracting URL: https://www.youtube.com/@maxmuller8233/playlists
[youtube:tab] @maxmuller8233/playlists: Downloading webpage
[debug] [youtube:tab] Selected tab: 'playlists' (playlists), Requested tab: 'playlists'
[download] entry does not pass filter (playlist_title=testplaylist), skipping ..

То есть загрузка прекращается ещё не начавшись. В то время как само поле playlist_title становится доступно только после скачивания плейлиста. Видно, что загрузка списка плейлистов выполняется с помощью экстрактора youtube:tab. Фильтрация по имени экстрактора также доступна. Если добавить ещё один --match-filters, которые объединяются по логике ИЛИ, то загрузка списка плейлистов происходит успешно, как и последующий матчинг видео по playlist_title:

$ yt-dlp https://www.youtube.com/@maxmuller8233/playlists --print playlist_title --match-filters 'playlist_title=testplaylist' --match-filters 'extractor=youtube:tab'
testplaylist

$
stabilitron
()