python - Python URL 编码错误
问题描述
我是一名新手程序员,但一直在使用 python 为 MusicBrainz Picard 应用程序开发插件。该插件旨在从 last.fm 的 API 获取艺术家/曲目数据以自动对曲目进行评分。但是,我收到一个错误,如果有人可以帮助我,我将不胜感激。错误是:
E:19:37:25 https://ws.audioscrobbler.com:443/2.0/?method=artist.getinfo&artist=2%2520Chainz&api_key=0a8b8f968b285654f9b4f16e8e33f2ee&format=json 的网络请求错误:下载https ://ws.audioscrobbler 时出错。 com:443/2.0/%3Fmethod=artist.getinfo&artist=2%252520Chainz&api_key=0a8b8f968b285654f9b4f16e8e33f2ee&format=json - 服务器回复:未找到(QT 代码 203,HTTP 代码 404) E:19:37:25 LastFM AutoRate:Track 2 Chainz(Fork ) 解析响应错误:无法解码 JSON 对象
这是代码:
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)
解决方案
推荐阅读
- java - Head First Design Pattern:何时不使用接口(特别是在 Java 的“接口”中)
- php - wow.js 和 animate.css 不适用于 wordpress 主题
- gdb - 在 gdb 中使用 xb 命令解决长度限制
- android - 从其他片段返回到第二个片段
- c# - 在foreach循环中获取gridview复选框值
- google-chrome-extension - 如何正确设置扩展的内容安全策略
- android - 是否可以返回一个 HashSet
从房间数据库? - python - 文件名 Python 的组合条件
- google-apps-script - 希望根据对谷歌表单的响应更新表格
- javascript - HTML & JS 问题:如果按下数字、符号或字母键,如何将焦点放在 HTML 输入元素上