0

我有一个媒体播放器,我想将我正在播放的内容发送到 trakt.tv,除了标题/路径中的外国字母外,一切正常。系统运行python 2.7.3

def getStatus(self,ip,timeout=10.0):
    oPchStatus = PchStatus()
    try:
        oResponse = urlopen("http://" + ip + ":8008/playback?arg0=get_current_vod_info",None,timeout)
        oPchStatus = self.parseResponse(oResponse.readlines()[0])
    return oPchStatus

这将返回类似这样的东西。

<?xml version="1.0"?>
<theDavidBox>
  <request>
    <arg0>get_current_vod_info</arg0>
    <module>playback</module>
  </request>
  <response>
    <currentStatus>pause</currentStatus>
    <currentTime>3190</currentTime>
    <downloadSpeed>0</downloadSpeed>
    <fullPath>/opt/sybhttpd/localhost.drives/HARD_DISK/Storage/NAS/Videos/FILMS/A.Haunted.House.(2013)/A Haunted House.avi</fullPath>
    <lastPacketTime>0</lastPacketTime>
    <mediatype>OTHERS</mediatype>
    <seekEnable>true</seekEnable>
    <title/>
    <totalTime>4860</totalTime>
  </response>
  <returnValue>0</returnValue>
</theDavidBox>

下一步采用上述方法并将每个项目分配给一个变量。

class PchStatus:
    def __init__(self):
        self.status=EnumStatus.NOPLAY
        self.fullPath = u""
        self.fileName = u""
        self.currentTime = 0
        self.totalTime = 0
        self.percent = 0
        self.mediaType = ""
        self.currentChapter = 0 # For Blu-ray Disc only
        self.totalChapter = 0 # For Blu-ray Disc only
        self.error = None

class PchRequestor:

    def parseResponse(self, response):
        oPchStatus = PchStatus()
        try:
            response = unescape(response)
            oXml = ElementTree.XML(response)
            if oXml.tag == "theDavidBox": # theDavidBox should be the root
                if oXml.find("returnValue").text == '0' and int(oXml.find("response/totalTime").text) > 90:#Added total time check to avoid scrobble while playing adverts/trailers
                    oPchStatus.totalTime = int(oXml.find("response/totalTime").text)
                    oPchStatus.status = oXml.find("response/currentStatus").text
                    oPchStatus.fullPath = oXml.find("response/fullPath").text
                    oPchStatus.currentTime = int(oXml.find("response/currentTime").text)

等等。使用上面返回的 xml,

oPchStatus.totalTime 为“4860” oPchStatus.status 为“暂停” oPchStatus.fullPath 为“/opt/sybhttpd/localhost.drives/HARD_DISK/Storage/NAS/Videos/FILMS/A.Haunted.House.(2013) /A Haunted House.avi" oPchStatus.currentTime 将是 "3190"

就像我说的那样,这在标题中出现外国字母之前效果很好。像 Le.Fabuleux.Destin.d'Amélie.Poulain.(2001).avi 这样的标题将使 oPchStatus.fullPath 包含字符串“/opt/sybhttpd/localhost.drives/HARD_DISK/Storage/NAS/Videos/Le.Fabuleux。 Destin.d'Am\xe9lie.Poulain.(2001).avi"

并不是

“/opt/sybhttpd/localhost.drives/HARD_DISK/Storage/NAS/Videos/Le.Fabuleux.Destin.d'Amélie.Poulain.(2001).avi”

正如我想要的那样。

进一步在脚本中有例程来扫描 xml 文件的文件名并创建 FILENAME.watched 所以我需要文件名与实际文件名匹配,而不是替换任何字母。

确保正确编码这些类型的文件名的最佳方法是什么?我试图提供尽可能多的信息,但如果您需要更多信息,请询问。

4

1 回答 1

0

Python 只是通过向您显示字符的转义码来使您的字符串值以 ASCII 可打印é\xe9.

关于链接源代码的一些注释:

  • 您不应该要解析的响应转换为 unicode。改为解析原始字节。解析器希望自己解码内容。事实上,ElementTree 解析器将再次对数据进行编码,以便能够对其进行解析。

  • 当您在字节串中有 XML 时,我会改用该ElementTree.fromstring()函数;是的,在它下面ElementTree.XML()像你一样使用,但是记录在案fromstring()API

否则,您的示例输入将完全按照应有的方式工作。如果我在文件路径中使用非 ASCII 字符从您的示例创建 XML 文档,我会得到以下信息:

>>> tree = ElementTree.fromstring(response)
>>> print tree.find("response/fullPath").text
/opt/sybhttpd/localhost.drives/HARD_DISK/Storage/NAS/Videos/Le.Fabuleux.Destin.d'Amélie.Poulain.(2001).avi
>>> tree.find("response/fullPath").text
u"/opt/sybhttpd/localhost.drives/HARD_DISK/Storage/NAS/Videos/Le.Fabuleux.Destin.d'Am\xe9lie.Poulain.(2001).avi"

如您所见,unicode()结果中.text包含一个é字符(Unicode 代码点 U+00E9,LATIN SMALL LETTER E WITH ACUTE)。当打印为 Python 文字时,Python 通过为我提供该代码点的 Python 转义码来确保它可以在 ASCII 上下文中打印,\xe9. 这是正常的,没有任何损坏。

于 2013-02-17T13:33:35.390 回答