[vlc-devel] [PATCH 1/4] share: add wrapper script for the YoutubeDL Python module
Steve Lhomme
robux4 at ycbcr.xyz
Tue Sep 22 07:35:04 CEST 2020
> diff --git a/share/ytdl-extract.py b/share/ytdl-extract.py
> new file mode 100755
> index 0000000000..71c79e0156
> --- /dev/null
> +++ b/share/ytdl-extract.py
> @@ -0,0 +1,102 @@
> +#! /usr/bin/python3
> +#
> +# Copyright (C) 2020 RĂ©mi Denis-Courmont
> +#
> +# This program is free software; you can redistribute it and/or modify it
> +# under the terms of the GNU Lesser General Public License as published by
> +# the Free Software Foundation; either version 2.1 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> +# GNU Lesser General Public License for more details.
> +#
> +# You should have received a copy of the GNU Lesser General Public License
> +# along with this program; if not, write to the Free Software Foundation,
> +# Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
> +
> +import sys
> +import youtube_dl
> +
> +class logger(object):
> + def debug(self, msg):
> + pass
> +
> + def warning(self, msg):
> + pass
> +
> + def error(self, msg):
> + sys.stderr.write(msg)
> +
> +def formats_choose_best(fmts):
> + # Pick our preferred format out of many
> + best_abr = -1
> + best_height = -1
> + best_format = None
> +
> + for f in fmts:
> + if 'height' in f and f['height']:
> + height = f['height']
> + else:
> + height = 0
> +
> + if height < best_height:
> + continue
> +
> + if 'abr' in f and f['abr']:
> + abr = f['abr']
> + else:
> + abr = 0
> +
> + if height == best_height or abr < best_abr:
> + continue
> +
> + best_abr = abr
> + best_height = height
> + best_format = f
> +
> + return best_format
> +
> +def entry_extract(entry):
> + # Process a given entry of a playlist
> + if 'formats' in entry:
> + fmt = formats_choose_best(entry['formats'])
> + else:
> + fmt = entry
> +
> + if 'title' in entry:
> + print('#EXTINF:,,' + entry['title'].splitlines()[0])
> +
> + if 'url' in fmt:
> + print('#EXTVLCOPT:no-ytdl') # don't parse recursively
> + print(fmt['url'])
> + else:
> + print('vlc://nop')
> +
> +def url_extract(url):
> + opts = {
> + 'logger': logger(),
> + }
> +
> + dl = youtube_dl.YoutubeDL(opts)
> + #dl.add_default_info_extractors()
> +
> + # Process a given URL
> + infos = dl.extract_info(url, download=False)
What happens if there's an error here ? Should the function/script
return an error rather than an empty M3U ?
> +
> + print('#EXTM3U')
> +
> + if 'title' in infos:
> + print('#PLAYLIST:' + infos['title'].splitlines()[0])
> +
> + if 'entries' in infos:
> + # URL is a playlist: iterate over entries
> + for entry in infos['entries']:
> + entry_extract(entry)
> + else:
> + # URL is a single media
> + entry_extract(infos)
> +
> +
> +url_extract(sys.argv[1])
> --
> 2.28.0
More information about the vlc-devel
mailing list