Seite 1 von 1

Arbeiten mit Queues

Verfasst: Donnerstag 2. Juni 2016, 13:21
von Newbie78
Hallo

Hoffe hier kann mir jemand vielleicht helfen, bin neu hier weil ich ein Problem habe, bzw. nicht zurecht komme. Es geht nicht um einen Code von mir sondern darum einen bestehenden anzupassen oder zu erweitern.

Ich habe ein Sonos System am laufen und auf Github gibt es dazu eine SoCo Project über dieses sich Daten aus dem Sonos System auslesen lassen z.B.:

Code: Alles auswählen

   def get_queue(self, start=0, max_items=100, full_album_art_uri=False):
        """Get information about the queue.

        :param start: Starting number of returned matches
        :param max_items: Maximum number of returned matches
        :param full_album_art_uri: If the album art URI should include the
            IP address
        :returns: A :py:class:`~.soco.data_structures.Queue` object

        This method is heavly based on Sam Soffes (aka soffes) ruby
        implementation
        """
        queue = []
        response = self.contentDirectory.Browse([
            ('ObjectID', 'Q:0'),
            ('BrowseFlag', 'BrowseDirectChildren'),
            ('Filter', '*'),
            ('StartingIndex', start),
            ('RequestedCount', max_items),
            ('SortCriteria', '')
        ])
        result = response['Result']

        metadata = {}
        for tag in ['NumberReturned', 'TotalMatches', 'UpdateID']:
            metadata[camel_to_underscore(tag)] = int(response[tag])

        # I'm not sure this necessary (any more). Even with an empty queue,
        # there is still a result object. This shoud be investigated.
        if not result:
            # pylint: disable=star-args
            return Queue(queue, **metadata)

        items = from_didl_string(result)
        for item in items:
            # Check if the album art URI should be fully qualified
            if full_album_art_uri:
                self._update_album_art_to_full_uri(item)
            queue.append(item)

        # pylint: disable=star-args
        return Queue(queue, **metadata)
Dadurch kann ich im Python mit der Abfrage

Code: Alles auswählen

>>> SonosSoCo.get_queue()
Queue(items=[<DidlMusicTrack 'Heatseeker' at 0xb6180290L>, <DidlMusicTrack 'That's The Way I Wanna Rock N Roll' at 0xb6180230L>, <DidlMusicTrack 'Meanstreak' at 0xb6180070L>, <DidlMusicTrack 'Go Zone' at 0xb6180050L>, <DidlMusicTrack 'Kissin' Dynamite' at 0xb61133d0L>, <DidlMusicTrack 'Nick Of Time' at 0xb6113c70L>, <DidlMusicTrack 'Some Sin For Nuthin'' at 0xb6113ed0L>, <DidlMusicTrack 'Ruff Stuff' at 0xb6113d50L>, <DidlMusicTrack 'Two's Up' at 0xb6113af0L>, <DidlMusicTrack 'This Means War' at 0xb6113490L>])
>>>
die Playlist der Sonos abfragen doch jetzt beist es aus.

mit SonosSoCo.get_current_track_info() kann ich das Aktuelle Lied abfragen und diese Daten auch auswerten

Code: Alles auswählen

>>> SonosSoCo.get_current_track_info()
{u'album': 'Blow Up Your Video', u'artist': 'AC/DC', u'title': 'Heatseeker', u'uri': 'x-file-cifs://192.168.0.100/Harddisk/music/ACDC/Blow%20up%20your%20Video/01%20Heat%20Seeker.mp3', u'playlist_position': '1', u'duration': '0:03:47', u'position': '0:02:07', u'album_art': u'http://192.168.0.84:1400/getaa?u=x-file-cifs%3a%2f%2f192.168.0.100%2fHarddisk%2fmusic%2fACDC%2fBlow%2520up%2520your%2520Video%2f01%2520Heat%2520Seeker.mp3&v=4', u'metadata': '<DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><item id="-1" parentID="-1" restricted="true"><res protocolInfo="x-file-cifs:*:audio/mpeg:*" duration="0:03:47">x-file-cifs://192.168.0.100/Harddisk/music/ACDC/Blow%20up%20your%20Video/01%20Heat%20Seeker.mp3</res><r:streamContent></r:streamContent><upnp:albumArtURI>/getaa?u=x-file-cifs%3a%2f%2f192.168.0.100%2fHarddisk%2fmusic%2fACDC%2fBlow%2520up%2520your%2520Video%2f01%2520Heat%2520Seeker.mp3&v=4</upnp:albumArtURI><dc:title>Heatseeker</dc:title><upnp:class>object.item.audioItem.musicTrack</upnp:class><dc:creator>AC/DC</dc:creator><upnp:album>Blow Up Your Video</upnp:album><upnp:originalTrackNumber>1</upnp:originalTrackNumber><r:albumArtist>AC/DC</r:albumArtist></item></DIDL-Lite>'}
>>>
Doch die Queue kann ich nicht bearbeiten, Ziel ist es eigentlich die Daten für das nächste Lied zu erhalten um dieses auch anzeigen zu können. Kann mir jemand helfen die Queue auzulesen bzw das nächste lied zu ermitteln ?

Danke

Re: Rbeiten mit Queues

Verfasst: Donnerstag 2. Juni 2016, 13:34
von DasIch
Newbie78 hat geschrieben:Doch die Queue kann ich nicht bearbeiten,[...]
Was meinst du damit?

Die Queue hat anscheinend schon das aktuelle Lied und das nächste. Man wird doch sicherlich an die Elemente in der Queue kommen und von einem DidlMusicTrack Objekt aus an weitere Informationen über ein Lied.

Re: Rbeiten mit Queues

Verfasst: Donnerstag 2. Juni 2016, 13:43
von Newbie78
Hallo

Danke fürs schnelle Antworten, wie kann ich dann den "Title" des aktuellen Liedes in der Queue suchen und dann den Nächsten in eine Variable Schreiben, oder mit der DidlMusicTrack arbeiten ?

Re: Arbeiten mit Queues

Verfasst: Donnerstag 2. Juni 2016, 14:26
von BlackJack
@Newbie78: Was wäre denn in Deinem Beispiel das nächste Lied? Das erste in der Queue? Dann müsstest Du halt schauen wie Du da dran kommst. In dem DocString von der `get_queue()`-Methode steht, das es sich um den Typ `soco.data_structures.Queue` handelt. Der ist allerdings sehr spärlich dokumentiert: soco.data_structures.Queue. Wenn man in den Quelltext schaut, sieht man, dass diese Klasse von `ListOfMusicInfoItems` erbt, die wiederum von `list` erbt. Also kann man ganz normal über den Index auf das erste Element zugreifen. Sofern es so ein Element gibt — die Queue könnte ja auch leer sein.

Re: Arbeiten mit Queues

Verfasst: Freitag 3. Juni 2016, 10:14
von Newbie78
@BlackJack

Hallo

Danke für die Antwort doch das verstehe ich jetzt nicht, wie kann ich auf diese `list` zugreifen ? Gibt es da einen befehl ? Also kann ich nicht die Queue auslesen und mit dem `title`vergleichen und das Nächste Lied als z.B. `title2`ablegen ?

Re: Arbeiten mit Queues

Verfasst: Freitag 3. Juni 2016, 10:30
von Sirius3
@Newbie78: Wie man mit Listen arbeitet, steht in jedem Grundlagentutorial. Zum Beispiel mit einer for-Schleife, in der man den Titel jeden Liedes vergleichen kann.

Re: Arbeiten mit Queues

Verfasst: Freitag 3. Juni 2016, 11:09
von Newbie78
Hallo

hab jedoch wo gelesen das queues sich anders verhalten und nicht so einfach ausgelesen werden können und verglichen ? Wie gesagt Neu mit Python und deshalb frage ich halt ob mir hier jemand behilflich sein kann.

Re: Arbeiten mit Queues

Verfasst: Freitag 3. Juni 2016, 11:13
von Sirius3
soco.data_structures.Queue hat nichts mit Queue.Queue zu tun, sondern ist eine Subklasse von list.