[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