Python URL编码错误
我是一名新手程序员,但一直在使用python为MusicBrainz Picard应用程序开发插件。外接程序设计用于从last.fm的API获取艺术家/曲目数据,以自动对曲目进行评分。然而,我遇到了一个错误,如果有人能帮助我,我将不胜感激。错误是: E:19:37:25网络请求错误:下载错误-服务器回复:未找到(QT代码203,HTTP代码404) E:19:37:25 LastFM AutoRate:Track 2 Chainz(Fork)错误解析响应:无法解码JSON对象 代码如下:Python URL编码错误,python,Python,我是一名新手程序员,但一直在使用python为MusicBrainz Picard应用程序开发插件。外接程序设计用于从last.fm的API获取艺术家/曲目数据,以自动对曲目进行评分。然而,我遇到了一个错误,如果有人能帮助我,我将不胜感激。错误是: E:19:37:25网络请求错误:下载错误-服务器回复:未找到(QT代码203,HTTP代码404) E:19:37:25 LastFM AutoRate:Track 2 Chainz(Fork)错误解析响应:无法解码JSON对象 代码如下: PLU
PLUGIN_NAME = 'LastFM AutoRate'
PLUGIN_AUTHOR = 'Zachary Zuno'
PLUGIN_DESCRIPTION = '''Use LastFM to automatically rate your music
library.'''
PLUGIN_VERSION = "0.1"
PLUGIN_API_VERSIONS = ["0.15"]
from PyQt4 import QtCore
from json import loads
from functools import partial
from picard import log
from picard.metadata import register_track_metadata_processor
from picard.webservice import REQUEST_DELAY
from picard.webservice import XmlWebService
LASTFM_HOST = "ws.audioscrobbler.com"
LASTFM_PORT = 443
LASTFM_KEY = "0a8b8f968b285654f9b4f16e8e33f2ee"
LASTFM_PATH = "/2.0"
REQUEST_DELAY[(LASTFM_HOST, LASTFM_PORT)] = 50
def encode_str(s):
# Yes, that's right, Last.fm prefers double URL-encoding
s = QtCore.QUrl.toPercentEncoding(s)
s = QtCore.QUrl.toPercentEncoding(unicode(s))
return s
def result(album, metadata, data, reply, error):
listeners = []
playcount = []
try:
data = loads(data)["artist"]
for k, v in data.items():
if k.startswith("stats"):
listeners.append(v["listeners"])
if k.startswith("stats"):
playcount.append(v["playcount"])
metadata["listeners"] = listeners
metadata["playcount"] = playcount
log.debug(u"%s: Track %s (%s) Parsed response (listeners: %s,
playcount: %s)", PLUGIN_NAME, metadata["artist"], metadata["title"],
str(listeners), str(playcount))
except Exception as e:
log.error(u"%s: Track %s (%s) Error parsing response: %s",
PLUGIN_NAME, metadata["artist"], metadata["title"], str(e))
finally:
album._requests -= 1
album._finalize_loading(None)
def process_track(album, metadata, release, track):
artist = metadata["albumartist"]
path = u"/2.0/?method=artist.getinfo&artist=%s&api_key=LASTFM_KEY&format=json" % (encode_str(artist))
album.tagger.xmlws.download(
LASTFM_HOST,
LASTFM_PORT,
path,
partial(result, album, metadata),
priority=True
)
album._requests += 1
register_track_metadata_processor(process_track)
很明显,这个错误是由你在评论中说的双重编码引起的。你有没有试过没有这种编码?你从哪里得到这个代码(以及评论的信息)?如果您正在复制和粘贴一些未指明但很古老的代码(可能是另一个长期废弃的last.fm插件),很有可能这是last.fm 5年前修复的一个bug的解决方法,它花了几年时间维护旧脚本的向后兼容性,在没有人再依赖它之后,最终放弃了它。错误消息中的第一个链接实际上是有效的,问题是你的第二个链接。我复制了旧代码。不幸的是,我没有足够的能力去了解变化是什么。在我看来,这个问题在URL中是什么?已编码为%3F。我尝试不使用双重编码,但得到了相同的错误。我被难住了。好吧,从一个快速的谷歌上,你显然是从中复制的,因为你还复制了他最后的.fm API密钥,而不是你自己的。出于某种原因,你复制了他插件的最早版本而不是当前版本,所以你复制了他在2011年修复的一个bug。我不知道该说什么,除了“不要那样做”。如果你修复了这个bug,你仍然会错过过去7年中的所有其他修复,以及对last.fm API或Picard API的任何更改。