下载youtube mp3-元数据编码问题(python、youtube dl、ffmpeg)
我正在尝试使用youtube-dl.exe和ffmpeg.exe(Windows 7)从youtube下载音频,但在编码方面遇到了一些问题。我必须手动解析元数据,因为当我尝试使用下载youtube mp3-元数据编码问题(python、youtube dl、ffmpeg),python,encoding,ffmpeg,metadata,youtube-dl,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 我收到错误:无法将视频标题解释为“%(艺术家)-(
--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字符:
我已尝试使用iso-8859-2、utf-8和mbcs对最终命令进行重新编码:
x = x.decode('cp1250').encode('iso-8859-2')
但非ascii字符仍然不可读。传递unicode命令将返回UnicodeEncodeError
你知道怎么解决这个问题吗?由此看来,我认为你遇到了这个问题
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))
每个模板字段后都缺少一个
s
。应该是——标题“%(艺术家)s-%(标题)s”中的元数据
。您还应该传递--addmetadata
,将元数据写入文件。因此,最终命令将如下所示:
youtube dl--来自标题“%(艺术家)s-%(标题)s”的元数据--提取音频--音频格式mp3--添加元数据https://www.youtube.com/watch?v=DaU94Ld3fuM
非常感谢,这很好用!据我记忆所及,我曾尝试使用“%(艺术家)s”和“%(标题)s”,但我从未使用过——添加元数据。所有非ascii字符都出现在最终标记中。我想这对我不起作用?运行命令后:[download]00:10时100%的6.69MiB[fromtitle]解析艺术家:Aerosmith[fromtitle]解析标题:走这条路(歌词)[HD][ffmpeg]向“Aerosmith-走这条路(歌词)[HD]-xBg2LP223_8.m4a]添加元数据[ffmpeg]目的地:Aerosmith-走这条路(歌词)[HD]-xBg2LP223_8.mp3删除原始文件Aerosmith-Walk This Way(歌词)[HD]-xBg2LP223_8.m4a(pass-k to keep)[ffmpeg]将缩略图添加到“Aerosmith-Walk This Way(歌词)[HD xBg2LP223_8.mp3”
中,但mp3文件中没有元数据?谢谢您的回答,但文件名本身不是问题。问题是在文件中编码元数据,但dstftw已经起到了帮助作用。
>>> slugify(u'My International Text: åäö')
u'my-international-text-aao'