[Release] Amazon Music

  • Hi zusammen,

    aufgrund der traumhaften Temperaturen und ein paar anderer Hobbies, wie Familie, Freunde, Job etc., ist die Motivation etwas am Addon zu machen gerade nicht sonderlich hoch. :whistling: ...aber keine Sorge ganz untätig war ich dennoch nicht.

    Ich verfolge gerade einen noch stärkeren generischen Ansatz und habe dafür einiges umgebaut und u.a. neue Strukturen implementiert. Soll heißen jede Amazon-Abfrage durchläuft ab einem bestimmten Punkt immer den selben Code zur Listgenerierung und zum Abspielen der Songs. Das sollte helfen Redundanzen zu minimieren und Anpassungen sofort überall wirksam werden zu lassen.

    Hier ein paar Impressionen der Datenstrukturen. trackInfo ist zum Setzen/Füllen der Kodi-Items vorgesehen und trackMeta ist u.a. für URL Parameter, Farb- und Bildinformationen etc. gedacht.

    setItem als generische Funktion für Kodi-Items und setImage beinhaltet die Settings-Weiche zum Anzeigen/Versorgen aller Bildchen...

    ...und setUrl zum Setzen der Addon-Paramter per URL, also was aufgerufen werden soll nachdem man auf einen Listeintrag geklickt hat.

    Python
    def setUrl(self,query):
            url = {
                'mode':     query['mode'],
                'asin':     query['asin'],
                'objectId': query['objectId']
            }
            return self.addonBaseUrl + '?' + urllib.urlencode(url)

    Wenn diese Version mal vorzeigbar ist wird sie einen größeren Umbau hinter sich haben und hoffentlich die gewünschten farblichen Listeinträge vollständig und richtig anzeigen. Darüber hinaus wird es vermutlich noch einen zusätzlichen Schalter in den Settings geben, sodass die eingefärbten Listeinträge an- und abgeschaltet werden können. Dann kann jeder selbst entscheiden was er gerne sehen möchte. 8)

    @peat, deinen Vorschlag finde ich super und werde ich mir auf jeden Fall noch ansehen wie soetwas umgesetzt werden kann.

  • Genau ...spacy :) ...gönne dir mal ein bißchen Pause fürs Privatleben...das Addon läuft nicht weg...ist bisher schon toll geworden und es gibt auch wieder andere Monate ...wo das Wetter dann vielleicht nicht so mitspielt...aber die Motivation wiederum ansteigen läßt.

    Das Glück deines Lebens hängt ab von der Beschaffenheit deiner Gedanken.

  • Jetzt habe ich mal eine Spezialfrage an die (Python) Entwickler unter uns. Vielleicht sehe ich nur den Wald vor lauter Bäumen nicht, aber ich finde einfach keinen Fehler. ?(
    Problem: Über eine Schleife werden die Amazon Daten verarbeitet und schrittweise Kodi als Listeintrag übergeben. Bei der Zuweisung der Titelinformation im zweiten und allen nachfolgenden Einträgen wird jedoch immer der Eintrag vom ersten Durchlauf zugewiesen. Alle anderen Felder stimmen zu 100% und beim Start (Aufruf von setData) wird das komplette Listitem immer neu initialisiert.

    Ich führe folgenden Code zum Iterieren über ein Array aus. Mit jedem Loop werden (unterschiedliche) Albeninformationen verarbeitet.

    Python
    for item in param['albums']:
      inf, met = self.setData(item,{'mode':'lookup'})
      url, li  = self.setItem(inf,met)
      itemlist.append((url, li, True))


    setData startet mit der Initialisierung von info und meta

    Python
    def setData(self,item,filter):
      info = self.trackInfo
      meta = self.trackMeta

    danach folgt

    Python
    if info['title'] == None and 'albumName' in item:
      info['title'] = item['albumName']


    So sehen die Rohdaten von Amazon aus:

    und das wird in der Schleife generiert, enthält folgende Reihenfolge (item, info, meta)...und im zweiten Teil sieht man unter title die Information des ersten Durchlaufs mit "Back from the Edge [Explicit]", "Voicenotes" hätte ich erwartet.

    Code
    2019-06-30 11:15:12.673 T:140264152938240  NOTICE: plugin.audio.amazonmedia: {u'asin': u'B01LFX0UCS', u'justification': {u'asin': u'B017T679VK', u'reason': u'Weil Sie sich Justin Bieber angeh\xf6rt haben', u'title': u'Love Yourself', u'cause': u'Mp3Consumption', u'artist': u'Justin Bieber'}, u'albumArtImageUrl': u'https://m.media-amazon.com/images/I/41EBMaPDuVL.jpg', u'artistAsin': u'B001QA3DC0', u'averageOverallRating': 4.701045388, u'isMusicSubscription': True, u'albumName': u'Back from the Edge [Explicit]', u'totalReviewCount': 51, u'isFreeOnDemandPlayable': False, u'artistName': u'James Arthur', u'originalReleaseDate': 1477605600000, u'isFree': True, u'totalNumberOfTracks': 17, u'isPrime': True}
    2019-06-30 11:15:12.673 T:140264152938240  NOTICE: plugin.audio.amazonmedia: {u'album': u'Back from the Edge [Explicit]', u'genre': None, u'rating': 4.701045388, u'title': u'Back from the Edge [Explicit]', u'year': None, u'duration': None, u'tracknumber': None, u'discnumber': None, u'artist': u'James Arthur'}
    2019-06-30 11:15:12.673 T:140264152938240  NOTICE: plugin.audio.amazonmedia: {u'isPlayable': u'true', u'asin': u'B01LFX0UCS', u'purchased': False, u'isUnlimited': True, u'mode': u'lookup', u'objectId': None, u'color': u'%s', u'isPrime': True, u'thumb': u'https://m.media-amazon.com/images/I/41EBMaPDuVL.jpg'}
    
    
    2019-06-30 11:15:12.693 T:140264152938240  NOTICE: plugin.audio.amazonmedia: {u'asin': u'B0766D6MFL', u'justification': {u'asin': u'B07CY2X4TK', u'reason': u'Weil Sie sich Selena Gomez angeh\xf6rt haben', u'title': u'Back To You', u'cause': u'Mp3Consumption', u'artist': u'Selena Gomez'}, u'albumArtImageUrl': u'https://m.media-amazon.com/images/I/41SGoaMQkGL.jpg', u'artistAsin': u'B004E4PJWW', u'averageOverallRating': 5.0, u'isMusicSubscription': True, u'albumName': u'Voicenotes', u'totalReviewCount': 10, u'isFreeOnDemandPlayable': False, u'artistName': u'Charlie Puth', u'originalReleaseDate': 1525989600000, u'isFree': True, u'totalNumberOfTracks': 13, u'isPrime': True}
    2019-06-30 11:15:12.693 T:140264152938240  NOTICE: plugin.audio.amazonmedia: {u'album': u'Voicenotes', u'genre': None, u'rating': 5.0, u'title': u'Back from the Edge [Explicit]', u'year': None, u'duration': None, u'tracknumber': None, u'discnumber': None, u'artist': u'Charlie Puth'}
    2019-06-30 11:15:12.693 T:140264152938240  NOTICE: plugin.audio.amazonmedia: {u'isPlayable': u'true', u'asin': u'B0766D6MFL', u'purchased': False, u'isUnlimited': True, u'mode': u'lookup', u'objectId': None, u'color': u'%s', u'isPrime': True, u'thumb': u'https://m.media-amazon.com/images/I/41SGoaMQkGL.jpg'}

    Einmal editiert, zuletzt von spacy (30. Juni 2019 um 16:15)

  • hi @spacy
    dein problem kann ich dir erklären:
    das liegt daran, wie python den zuweisungs-operator (=) bei solchen datenstrukturen verwendet. wenn du in der setData metode info und meta initialisierts mit dem als klassen-member vorhandenen datum self.trackInfo bzw self.trackMeta wird nicht wirklich eine komplette neue instanz dieser struktur erzeugt sondern deine variable info zeigt nun auf die gleichen daten wie deine variable self.trackInfo. wenn du nun info['title'] änderst wird auch self.trackInfo['title'] geändert.

    dieses zuweisungsverfahren nennt man copy-by-reference (es wird keine neue kopie erstellt sondern nur auf die vorhandenen daten referenziert) im gegensatz zu copy-by-value (es wird ein neues datenelement erstellt mit den gleichen werten). ist ganz gut beschrieben in https://stackoverflow.com/questions/3975…shallow-or-deep inklusive wie man dein proplem lösen kann.

    das führt dann in der zeiten iteration der schleife dazu, dass info nicht mehr mit einer dictionary belegt wird, bei dem alle werte None sind und somit trifft info['title'] == None nicht mehr zu und info['title'] = item['albumName'] wird nicht ausgeführt.


    super arbeit, die du da geleistet hast, die amazon web api herauszuarbeiten und dann in dein plugin zu gießen. das hatte ich bei meinem plugin nur ganz grob angefangen, ist dann aber am zeitmangel gescheitert. aber wenn du das so sauber weiterführst sollte dein plugin das weiaus robustere und performantere sein im vergleich zu meinem. außerdem wesentlich sauberer programmiert :whistling: bei meinem sieht man immer noch die ursprünge aus dem ersten amazon video plugin. bin da leider auch nie wirklich zum refactoren gekommen...

  • @piet vielen Dank im doppelten Sinne und die Ausgangsbasis war schon sehr hilfreich und lehrreich. :thumbup:
    Darauf muss man erst einmal kommen, sowas hatte ich in anderen Programmiersprachen bisher nicht gesehen (oder unbewußt immer übersehen). Da muss ich direkt mal den Code prüfen ob das noch an anderen Stellen Auswirkungen hat.
    Hast Du evtl. auch eine Idee zu diesem Post? Ich würde schon gern immer alle Grafiken anzeigen ohne Metadaten zu "verlieren".

    Nachtrag...was man nicht im Kopf hat.
    Die Initialisierung der Strukturen nehme ich jetzt direkt in der Funktion vor, damit umgehe ich das Problemchen.

  • ...mal wieder ein Status...wenn man über die Alben einsteigt und danach die Songs angezeigt werden, wird nun auch der einzelne Song entsprechend eingefärbt. Dies funktioniert jedoch ausschließlich beim Einstieg über die Alben, d.h. auch über die Albensuche kommt etwas Farbe ins Spiel.
    Wenn die gleiche Abfrage nicht mit der Alben-ID sondern mit Song-ID's durchgeführt wird liefert Amazon keine "gekauft" Information mit. Hier scheint der Bedarf seitens Amazon wohl nicht vorzuliegen die Datenstrukturen konsistent zu halten (was eigentlich der gesamten Webobfläche von Amazon helfen würde :rolleyes: oder zumindest dem Coding dahinter). Dennoch ist der zweite Lookup sehr hilfreich zur Anreicherung von Metadaten.
    Technisch gesehen habe ich das halbe Programm sehr umfangreich umgebaut und jetzt wird die gesamte Listaufbereitung über einen Kamm geschoren. Soweit ich das überblicken konnte funktioniert noch bzw. wieder alles :whistling: und es wirkt auf mich irgendwie "runder" in den einzelnen Sichten.

    Im nächsten Schritt werde ich mir den Vorschlag von @peat näher ansehen, einen Schalter in den Settings bzgl. Farbgestaltung einbauen und natürlich noch einmal alles durchtesten (man kennt ja den Fehlerteufel).
    Sobald das halbwegs vorzeigbar ist gibt's eine neue Version per Update.

    Edit: Jetzt bin ich tatsächlich selbst ein wenig überrascht ...heute lief es wie am Schnürchen (und das kommt auch nicht so oft vor). Gerade die für mich gefühlt große Stationsbaustelle hatte sich binnen Minuten aufgelöst und der Wunsch von peat war deutlich leichter zu implementieren als gedacht (und dabei waren gleich neue Ideen entstanden). So gesehen bin ich jetzt mit den Themen erst einmal durch, quasi fertig (ist man nie, ist schon klar ;) , aber wenigstens für den Moment). Ich werde morgen das Ganze noch einmal testen und wenn nichts hochkommt gibt's morgen Abend das Update.

  • Super...spacy :) ...die gekauften Songs von einen gekauften Album sind auch farblich gekennzeichnet...nun klappt auf Anhieb das man die richten Songs gleich findet...wenn man das gesamte Album nicht gekauft hat.

    Das Glück deines Lebens hängt ab von der Beschaffenheit deiner Gedanken.

  • Hallo spacy.

    Auch von mir erst einmal vielen Dank für die tolle Arbeit. Es ist schon beeindruckend dass in so kurzer Zeit ein so tolles Plugin geschrieben wurde.

    Mir sind da allerdings noch zwei kleine Problemchen in Verbindung mit Amazon Prime aufgefallen.

    1. Wird irgendwo anders bereits auf Prime Music zugegriffen (z.B. per Sonos), verhindert Amazon einen weiteres Abspielen von einer anderen Quelle. Sonos gibt eine Meldung, dass irgendwo bereits Musik abgespielt wird - mit dem Hinweis dass das zuerst beendet werden muss. Die Prime Music App von Amazon bietet an, den laufenden Stream zu beenden und stattdessen auf dem aktuellen Gerät zu starten.
    Bei "Amazon Media" wird oben rechts zwar eine Fehlermeldung angezeigt und auf das Logfile verwiesen.
    Ein ähnlicher Hinweis, dass bereits woanders ein Stream läuft wäre sehr hilfreich.
    Außerdem scheint an dieser Stelle die App in einen Fehler-loop zu verfallen, aus der sie schwerlich befreit werden kann.
    2. Das Gegenstück zu 1. "Amazon Media" scheint nach dem Beenden eines Streams bzw. der gesamten App den Zugriff auf Prime Music nicht wieder freizugeben. Jedenfalls gelingt es mir nicht, auf meinem Sonos einen Stream zu starten. Die App scheint das noch immer zu blockieren.

    Dennoch finde ich das Ergebnis bereits jetzt schon sehr beeindruckend. Vielen Dank dafür :)

  • Moin zusammen,
    wenn ihr Fehler findet und/oder neue Features wünscht bitte alles melden. Ich will mir das gern alles nach und nach ansehen.
    Darüber hinaus freut es mich, dass mein Addon bei euch Zuspruch findet und ihr einen Nutzen daraus ziehen könnt. :thumbup:

    @dazoam ich hatte mir das gerade noch einmal angesehen. Im Fall eines Parallelbetriebs von Prime erhält der zweite Client "MAX_CONCURRENCY_REACHED" als Rückmeldung. Mein Programm sagt in dem Fall "schreibe einen LogEintrag, mach aber weiter". Kodi hatte zuvor die Playlist erhalten und bei Abspielproblemen mit einem Song springt Kodi von sich aus auf den nächsten Song. Somit beginnt das Spiel von vorn bis die Playlist abgearbeitet ist. Das ist der von dir beschriebene Fehler-Loop.
    Vorstellbar wäre im Fall von "MAX_CONCURRENCY_REACHED" die Playlist, also den Player zu stoppen und eine entsprechende Meldung auszugeben. Das muss ich mir gleich mal ansehen.

    Mal eine andere Frage:
    Nutzt jemand von euch die Kodi-eigene App oder Yatse zur Remotesteuerung? Werden bei Euch Bilder und weitere Details in der aktuellen Playlist angezeigt?
    Ich sehe dort nur Bilder nach der ersten Amazon-Anmeldung per User/Passwort und nach einer gewissen Zeit nur noch "plugin://plugin.audio.amazon..."
    Die komplette Menüstruktur funktioniert und alle Metadaten und Bilder werden gezeigt, auch das Abspielen funktioniert, nur die Playlistdarstellung ist leer.
    Sieht aus als wäre da irgendwo ein Timeout im Hintergrund, oder der Kodi-Player bekommt etwas nicht mit, oder ich habe im Programm etwas vergessen, oder, oder, oder...ich habe gerade keine Idee woran das liegen könnte. ?(

  • @dazoam ich habe eine Lösung gefunden den Player zu stoppen, zusätzlich wird eine Meldung ausgegeben. Wenn ich es heute noch schaffe, schiebe ich das Update noch auf GitHub. Ich hatte es bei mir ein paar mal getestet und es funktionierte wie gewünscht, das müsste natürlich noch in anderen Umgebungen verifiziert werden.
    Die Logik sieht in etwa so aus:
    - Kodi läuft
    - Amazon wird angefragt
    - ein Song soll abgespielt werden
    - Rückmeldung von Amazon "da läuft irgendwo anders bereits etwas"
    - Stoppe das Abspielen in Kodi und gib eine Meldung aus

    Ob durch das Addon über die Amazon-Schnittstellen die "andere Instanz" gestoppt werden kann, weiß ich aktuell nicht. Wäre sicher ein cooles Feature, stelle ich mir aber gerade nicht einfach vor und funktioniert vermutlich nur in einer sehr engen Client-Server-Kopplung, denn der Client muss irgendwie auf das "Stopp" - Signal reagieren und alles einstellen.

    Nach meinem Verständnis kann das Kodi als Client auf keinen Fall leisten. So wie ich das bisher sehe agiert Kodi nach dem "Fire-and-forget" Prinzip. Soll heißen mit jedem Click wird das Addon immer neu initialisiert, ausgenommen davon sind die "zurück" Buttons, was manchmal hilreich und manchmal störend ist.

    Edit: Warum lange warten...ich habs gleich erledigt. 8)

  • Version 19 steht jetzt zur Verfügung mit folgenden Änderungen:
    - die letzten Sucheinträge stehen jetzt in allen Kategorien zur Verfügung
    - ein paar Code Optimierungen, kleinere Korrekturen
    - nicht abspielbare Songs werden schneller übersprungen (ohne Fehlermeldung)

    Ich konnte mein Anzeigeproblem am Smartphone aus diesem Post weiter eingrenzen. Wenn die Playlist so wie sie ist abgespielt wird, funktioniert alles wie gewünscht, alle Bilder und Texte sind sichtbar. Gebe ich jedoch über Yatse eine Zufallswidergabe vor fehlen sämtliche Informationen. D.h. einen Schritt weiter und dennoch keine Idee zur Lösung 8o

  • Danke für die neuen Updates...spacy :) ...Habe die Addon Versionen mal getestet: ...Um sich neu anzumelden...also wenn man das Addon zurückgesetzt hat...kam man über Android 8 (Nvidia Shield TV) mit der Version 19 noch rein nach Amazon...allerdings hatte unser einer keine Chance mehr mit Version 20 ...auch nicht wenn man das Addon komplett gelöscht und neu installiert hat.

    Hier mal ein Auszug von der [definition=9,2]kodi.[definition='1','0']log[/definition][/definition]

    Das Glück deines Lebens hängt ab von der Beschaffenheit deiner Gedanken.

  • Moin zusammen,

    bug fix steht bereit, bitte noch einmal probieren...offensichtlich funktioniert die Anmeldung nicht wenn gzip dafür aktiviert wird, naja ohne gehts ja auch und soo viele Daten werden da ja nicht hin und her geschupst. :whistling:

    Für alles Nachfolgende läuft die Kommunikation über die gzip Komprimierung, was zu einer besseren Reaktionszeit führen sollte.

  • Es funktioniert nun wieder ...danke für den schnellen FIX ...spacy...und habe die Version 21 mal weiter getestet mit einen gekauften Album... wobei man nur einen Song daraus gekauft hatte...man kann diesen Song mit den PAPLayer ohne Probleme starten...dieser wird auch bis zum Ende abgespielt ...aber danach ist man dann ohne Vorwarnung automatisch raus aus Kodi.

    Das Glück deines Lebens hängt ab von der Beschaffenheit deiner Gedanken.

  • Du meinst Kodi wurde beendet? Bevor ich auf gut Glück etwas am Code ändere ohne es so wie du testen zu können, könntest du vielleicht eine Programmanpassung bei dir lokal vornehmen und erneut testen?
    Im Kodi Ordner unter "addons" -> "plugin.audio.amazonmedia" findest du die Datei "amazonmedia.py" in dieser Datei nach Zeile 2003 "xbmc.sleep(100)" einfügen.

    Das müsste danach so aussehen:
    Vorher

    Python
    if 'statusCode' in obj and obj['contentResponse']['statusCode'] == 'CONTENT_NOT_ELIGIBLE' or obj['contentResponse']['statusCode'] == 'BAD_REQUEST':
                    return

    Nachher:

    Python
    if 'statusCode' in obj and obj['contentResponse']['statusCode'] == 'CONTENT_NOT_ELIGIBLE' or obj['contentResponse']['statusCode'] == 'BAD_REQUEST':
                    xbmc.sleep(100)
                    return

    Wenn meine Theorie stimmt, dürfte es an der Verarbeitungsgeschwindigkeit von Kod selbst liegen bzw. der Speicherbereinigung nach Abarbeitung des Addons und durch diese kurze Pause von 100ms Kodi nicht mehr stolpern.

  • Kodi crasht auch komplett unter Windows mit den neuen Code...wenn man mit den PAPlayer diese bezahlten Songs abspielt von einen gekauften Album wobei nicht alle Songs gekauft wurden...also er möchte dann die nächsten Songs von diesen Album abspielen ... kann es aber nicht...weil man halt diese weiteren Songs nicht gekauft hatte.

    Wenn man diesen gleichen gekauften Song mit den VideoPlayer abspielt...dann kommt danach eine Fehlermeldung das der nächste Song aus der Liste nicht gefunden wurde...aber Kodi crasht nicht.

    Das Glück deines Lebens hängt ab von der Beschaffenheit deiner Gedanken.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!