AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Get Cover Art (Online oder iTunes / WMP)

Get Cover Art (Online oder iTunes / WMP)

Offene Frage von "arne99"
Ein Thema von arne99 · begonnen am 3. Jul 2007 · letzter Beitrag vom 3. Mai 2008
Antwort Antwort
Benutzerbild von arne99
arne99

Registriert seit: 11. Jan 2005
Ort: Hamburg
158 Beiträge
 
Turbo Delphi für Win32
 
#1

Get Cover Art (Online oder iTunes / WMP)

  Alt 3. Jul 2007, 08:18
Moin, ich brauche mal eure Hilfe

Ich würde gerne wissen wie ich per API auf existierende Cover Arts von iTunes oder WMP zugreifen kann. Wenn nicht vorhanden, würde ich gern diese per Artist und Title Abfrage aus Amazon greifen.

Gibt es schon Möglichkeiten? bzw. Ansätze? Danke

Edit: Habe soeben ein Python Script gefunden, mag wer Ansätze geben es auf Delphi zu übertragen?[b]

Code:
#!/Library/Frameworks/Python.framework/Versions/Current/bin/python

import sys, os, urllib, string, xml.dom.minidom, traceback

class AmazonCoverArt(object):
   LICENSE_FILE = "amazonLicense.txt"
   BASE_URLS = {
      "US":"http://webservices.amazon.com/onca/xml?Service=AWSECommerceService",
      "UK":"http://webservices.amazon.co.uk/onca/xml?Service=AWSECommerceService",
      "DE":"http://webservices.amazon.de/onca/xml?Service=AWSECommerceService",
      "JP":"http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService",
      "FR":"http://webservices.amazon.fr/onca/xml?Service=AWSECommerceService",
      "CA":"http://webservices.amazon.ca/onca/xml?Service=AWSECommerceService"}
   FULL_URL = string.Template(
      "${baseURL}&AWSAccessKeyId=${accessKey}&Operation=${operation}&SearchIndex=${searchIndex}&"
      +"Title=${title}&Artist=${artist}&Keywords=${keywords}&ResponseGroup=${responseGroup}")

   licenseKey = ""

   def __init__(self):
      if os.access(self.LICENSE_FILE, os.R_OK):
         f = open(self.LICENSE_FILE)
         self.licenseKey = f.readline().strip()
         f.close()

   def search(self, artist='', album='', keywords=''):
      if self.licenseKey == "": return []
      url = self.getURL(artist, album, keywords)
      covers = []
      c = None
      try:
         c = urllib.urlopen(url)
         xmlStr = c.read()
         covers = self.getCovers(xmlStr)
         c.close()
      except:
         if c: c.close()
      return covers

   def getCovers(self, xmlStr):
      covers = []
      usedURLs = []
      try:
         rootNode = xml.dom.minidom.parseString(xmlStr)
         #print rootNode.toprettyxml().encode('ascii', 'ignore')
         itemNodes = rootNode.getElementsByTagName("Item")
         for itemNode in itemNodes:
            for tagName in ("SmallImage","MediumImage","LargeImage"):
               imageNodes = itemNode.getElementsByTagName(tagName)
               for imageNode in imageNodes:
                  cover = self.getCoverInfo(imageNode)
                  if cover["url"] not in usedURLs:
                     covers.append(cover)
                     usedURLs.append(cover["url"])
      except:
         traceback.print_exc(file=sys.stdout)
         raise
      return covers

   def getCoverInfo(self, imageNode):
      cover = {}
      cover["url"] = imageNode.getElementsByTagName("URL")[0].childNodes[0].data
      cover["w"] = imageNode.getElementsByTagName("Height")[0].childNodes[0].data
      cover["h"] = imageNode.getElementsByTagName("Width")[0].childNodes[0].data
      return cover

   def getURL(self, artist, album, keywords):
      d = {}
      d['baseURL'] = self.BASE_URLS['US']
      d['accessKey'] = self.licenseKey
      d['operation'] = 'ItemSearch'
      d['searchIndex'] = 'Music'
      d['responseGroup'] = 'Images'
      d['keywords'] = urllib.quote_plus(keywords)
      d['artist'] = urllib.quote_plus(artist)
      d['title'] = urllib.quote_plus(album)
      return self.FULL_URL.substitute(d)

def main():
   aca = AmazonCoverArt()
   covers = aca.search('Elvis Costello', 'My Aim Is True')
   for cover in covers:
      print cover["url"]

if __name__ == '__main__':
    main()
Arne
// u know? ID Service www.topsta.de
  Mit Zitat antworten Zitat
Benutzerbild von arne99
arne99

Registriert seit: 11. Jan 2005
Ort: Hamburg
158 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Get Cover Art (Online oder iTunes / WMP)

  Alt 3. Jul 2007, 09:53
Hi, also nachdem ich noch weiter gesucht habe bin ich nun hier:

Delphi-Quellcode:
procedure TForm1.SpeedButton2Click(Sender: TObject);
var AmazonService : AmazonSearchPort;
    myrequest : KeywordRequest;
    ret : ProductInfo;
begin
  myrequest := KeywordRequest.Create;
  HTTPRio1.WSDLLocation := 'http://soap-eu.amazon.com/schemas3/AmazonWebServices.wsdl';
  try
    myrequest.keyword := 'Borland';
    myrequest.page := '1';
    myrequest.mode := 'dvd-de';
    myrequest.sort := '+salesrank';
    myrequest.tag :='webservices-20';
    myrequest.type_ :='lite';
    myrequest.devtag := '<meineID>';
    myrequest.locale :='de';
    ret:=ProductInfo.Create;
    try
      try
        Amazonservice := HTTPRio1 as AmazonSearchPort;
        ret:=AmazonService.KeywordSearchRequest(myrequest);
      except
        exit;
      end;

  {process Productinfo}
    finally
      ret.free;
    end;
  finally
    myrequest.free;
  end;
end;
Ich bekomme jedoch immer einen BadRequest Exception. Kann mir jemand helfen?
Arne
// u know? ID Service www.topsta.de
  Mit Zitat antworten Zitat
CCRDude
(Gast)

n/a Beiträge
 
#3

Re: Get Cover Art (Online oder iTunes / WMP)

  Alt 3. Jul 2007, 11:01
Sieht auch irgendwie merkwürdig aus, finde ich.
Du weißt zweimal ret etwas zu, denke da ist also schon mindestens ein Speicherleck, zumindest aber ein Zeichen von unvollständigem Verständnis.

Vor allem aber sehe ich nirgendwo, daß Du überhaupt spezifieren würdest, was genau Du suchst?
  Mit Zitat antworten Zitat
Benutzerbild von arne99
arne99

Registriert seit: 11. Jan 2005
Ort: Hamburg
158 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Get Cover Art (Online oder iTunes / WMP)

  Alt 3. Jul 2007, 13:14
Genau hier spezifiziere ich es:

Delphi-Quellcode:
 myrequest.keyword := 'Borland';
    myrequest.page := '1';
    myrequest.mode := 'dvd-de';
    myrequest.sort := '+salesrank';
    myrequest.tag :='webservices-20';
    myrequest.type_ :='lite';
    myrequest.devtag := '<meineID>';
    myrequest.locale :='de';
Die doppelte Zuweisung von "ret" ist wichtig. Da ich als erstes ein Create der ProductInfo mache, die ich vorher mit der Spezifikation meiner SUchkriterien erstellt habe.
Danach wird das ganze angestoßen.
Arne
// u know? ID Service www.topsta.de
  Mit Zitat antworten Zitat
CCRDude
(Gast)

n/a Beiträge
 
#5

Re: Get Cover Art (Online oder iTunes / WMP)

  Alt 3. Jul 2007, 14:25
Nun ja, ich geh mal davon aus daß devtag=devtoken, dann sehe ich trotzdem weder ein AsinSearch, UpcSearch, AuthorSearch, ArtistSearch oder wie sie alle heißen? Wußte nicht, daß Amazon jetzt schon eine Glaskugelsuche hat

Wo bitte hat Dein "Create der ProcutInfo" denn die Spezifikation bekommen? Ich sehe da nur ein "Create;" und keine übergebenen Parameter?
Und wo glaubst Du, wird dieses ProductInfo wohl wieder freigegeben?

Aber da Du's eh besser weißt, geh ich jetzt mal
  Mit Zitat antworten Zitat
Benutzerbild von arne99
arne99

Registriert seit: 11. Jan 2005
Ort: Hamburg
158 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Get Cover Art (Online oder iTunes / WMP)

  Alt 3. Jul 2007, 15:08
Bist jetz muksch? Ich bin dankbar fuer jede Hilfe. Wenn du damit schonmal gearbeitest hast, wär es nett wenn du mir deine Ansätze weiterformulierst. Danke sehr.
Arne
// u know? ID Service www.topsta.de
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#7

Re: Get Cover Art (Online oder iTunes / WMP)

  Alt 3. Jul 2007, 15:28
CCRDude wollte damit sagen, dass die doppelte Zuweisung an ret nicht sehr sinnvoll zu sein scheint.
Du erzeugst ein Objekt vom Typ ProductInfo, weist die Referenz darauf ret zu, und weist anschließend den Rückgabewert von AmazonService.KeywordSearchRequest ebenfalls ret zu. Das erzeugte Objekt vom Typ ProductInfo geht damit verloren und erzeugt ein Speicherleck. Noch dazu wurde es niemals benutzt. Das sollte alledings nichts mit deinem Fehlerbild zu tun haben.
BadRequest bedeutet, dass die Parameter der Anfrage nicht korrekt sind. Insofern wäre es sinnvoll, die Datenfelder des Requests noch einmal genauer zu untersuchen. Bekommst du keine genaueren Fehlerangaben?

Edit: Laut einem Beispiel, dass ich eben sah, müssen tag und devtag beide identisch sein, halt deine Subscriber-ID.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
CCRDude
(Gast)

n/a Beiträge
 
#8

Re: Get Cover Art (Online oder iTunes / WMP)

  Alt 3. Jul 2007, 15:30
Nur damit wir nicht aneinander vorbeireden: suchst Du nach einer "Borland"-DVD, ist also "Borland" Dein Suchbegriff?

Ich kenne als Namen des Suchparameters halt nicht "Keyword", sondern nur AsinSearch (ISBN-10), UpcSearch (ISBN-13), AuthorSearch, ArtistSearch, ActorSearch, DirectorSearch, ManufacturerSearch und SimilaratiesSearch. Dein Block scheint mit "nur" Keyword etwas anders aufgebaut, als ich das gewohnt bin.

Ok, weiter... Dein Ansatz scheint jetzt über SOAP zu gehen, ist ja auch passend für WebServices. Andererseits hast Du nirgendwo geschrieben, woher diese AmazonSearchPort etc. kommen (als Namen für Klassen folgen die schonmal nicht dem Standard (T am Anfang), daher sehe ich die als irgendwie suspekt an ). Und eigentlich ist das ja auch nichts anderes als ein HTTP-GET plus XML, das auszuwerten ist, und "direkter" ist es vielleicht einfacher zu debuggen.

Hier eine Beispiel-URL:

Wobei Du XXXXXXXX durch die ID ersetzt, die Du schon im vorigen Beispiel verwendet hast, und YYYYYYYY durch Deine associate id.
(Anstelle von ArtistSearch kannst Du die oben von mir erwähnten Parameter ausprobieren, diverse andere "mode"-Werte wären baby,books,classical,dvd,electronics,garden,kitche n,magazines,music,pc-hardware,photo,software,tools,toys,vhs,videogames, ...)

Diese URL probierst Du einfach im Browser, schon siehst Du, ob die Anfrage funktioniert (gerade mit meinen beiden IDs getestet, die funktioniert ), und musst den Download nur noch in Dein Programm einbauen (Indy, Synapse, WinInet, wie Du magst) und dann per XMLLib, JclSimpleXml auswerten (zur Not sogar noch schlichter, weil es Dir ja eh nur um die ImageUrlLarge-Zeilen gehen wird).
  Mit Zitat antworten Zitat
made in Germany

Registriert seit: 28. Apr 2006
50 Beiträge
 
#9

Re: Get Cover Art (Online oder iTunes / WMP)

  Alt 3. Mai 2008, 16:44
gibts noch eine andere möglichkeit um auf die daten zuzugreifen oder muss ich mich da anmelden?
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz