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 は、文字のエスケープ コード\xe9.

リンクされたソース コードに関する注意事項:

  • 解析したい応答をユニコードに変換しないでください。代わりに raw バイトを解析します。パーサーは、コンテンツ自体をデコードすることを期待しています。実際、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 に答える