【问题标题】:Downloading youtube mp3 - metadata encoding issue (python, youtube-dl, ffmpeg)下载 youtube mp3 - 元数据编码问题(python、youtube-dl、ffmpeg)
【发布时间】:2015-08-03 06:21:25
【问题描述】:

我正在尝试使用 youtube-dl.exe 和 ffmpeg.exe (Windows 7) 从 youtube 下载音频,但我在编码时遇到了一些问题。我必须手动解析元数据,因为当我尝试使用时

--metadata-from-title "%(artist) - %(title)" --extract-audio --audio-format mp3 https://www.youtube.com/watch?v=DaU94Ld3fuM

我收到错误:无法将视频标题解释为“%(artist) - %(title)”

不管怎样,我写了一些代码来用 ffmpeg 保存元数据:

def download(url, title_first=False):
    if (0 == subprocess.call('youtube-dl --extract-audio --audio-format mp3 %s' % url)):
        #saves file in current directory in format: VID_TITLE-VID_ID.mp3
        video_id = url[url.find('=')+1:] #video id from URL (after ?v=)
        for f in os.listdir('.'):
            if video_id in f:
                filename = f
                break
        os.rename(filename, video_id+'.mp3') #name without non-ascii chars (for tests)
        video_title = filename[: filename.find(video_id)-1]

        output = video_title + '.mp3'
        title, artist = '', ''
        try: #parsing the title
            x = video_title.find('-')
            artist = video_title[:x].strip()
            title = video_title[x+1:].strip()
            if (title_first): output = '%s - %s.mp3' % (title, artist)
        except:
            pass

        x = 'ffmpeg -i "%s" -metadata title="%s" -metadata artist="%s" -acodec copy -id3v2_version 3 -write_id3v1 1 "%s"' \
                        % (video_id+'.mp3', title, artist, output)
        print x
        subprocess.call(x)

文件被下载,然后被裁剪到给定的开始和持续时间(上面的代码是一个简化版本)。文件名很好,但是当我用 AIMP3 打开文件时,它显示垃圾而不是非 ascii 字符:

我尝试使用 iso-8859-2、utf-8 和 mbcs 重新编码最终命令:

x = x.decode('cp1250').encode('iso-8859-2')

但非 ascii 字符仍然不可读。传递 unicode 命令返回 UnicodeEncodeError...

知道如何解决这个问题吗?

【问题讨论】:

    标签: python encoding ffmpeg metadata youtube-dl


    【解决方案1】:

    从这个SO article我认为你遇到了这个问题

    import re
    from unicodedata import normalize
    
    _punct_re = re.compile(r'[\t !"#$%&\'()*\-/<=>?@\[\\\]^_`{|},.:]+')
    
    def slugify(text, delim=u'-'):
        """Generates an slightly worse ASCII-only slug."""
        result = []
        for word in _punct_re.split(text.lower()):
            word = normalize('NFKD', word).encode('ascii', 'ignore')
            if word:
                result.append(word)
        return unicode(delim.join(result))
    

    用法:

    >>> slugify(u'My International Text: åäö')
    u'my-international-text-aao'
    

    【讨论】:

    • 感谢您的回答,但文件名本身不是问题。问题是在文件中编码元数据,但 dstftw 已经有所帮助。
    【解决方案2】:

    您在每个模板字段后缺少s。应该是--metadata-from-title "%(artist)s - %(title)s"。您还应该通过 --add-metadata 将元数据写入文件。所以最终的命令将如下所示:

    youtube-dl --metadata-from-title "%(artist)s - %(title)s" --extract-audio --audio-format mp3 --add-metadata https://www.youtube.com/watch?v=DaU94Ld3fuM

    【讨论】:

    • 非常感谢,效果很好!据我所知,我曾尝试使用“%(artist)s”和“%(title)s”,但我从未使用过 --add-metadata。所有非 ascii 字符都出现在最终标签中。
    • 我认为这对我不起作用?运行您的命令后:[download] 100% of 6.69MiB in 00:10 [fromtitle] parsed artist: Aerosmith [fromtitle] parsed title: Walk This Way (lyrics) [HD] [ffmpeg] Adding metadata to 'Aerosmith - Walk This Way (lyrics) [HD]-xBg2LP223_8.m4a' [ffmpeg] Destination: Aerosmith - Walk This Way (lyrics) [HD]-xBg2LP223_8.mp3 Deleting original file Aerosmith - Walk This Way (lyrics) [HD]-xBg2LP223_8.m4a (pass -k to keep) [ffmpeg] Adding thumbnail to "Aerosmith - Walk This Way (lyrics) [HD]-xBg2LP223_8.mp3" 但 mp3 文件中没有元数据?
    猜你喜欢
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 2022-08-17
    • 2020-06-03
    • 2015-05-29
    • 2012-09-22
    相关资源
    最近更新 更多