下载youtube mp3 - 元数据编码问题(python,youtube-dl,ffmpeg)

时间:2015-05-21 14:06:17

标签: python encoding ffmpeg metadata youtube-dl

我尝试使用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

我收到错误:无法将视频标题解释为"%(艺术家) - %(标题)"

无论如何,我写了一些用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字符:

enter image description here

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

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

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

从此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'