Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Get Cover Art (Online oder iTunes / WMP) (https://www.delphipraxis.net/95204-get-cover-art-online-oder-itunes-wmp.html)

arne99 3. Jul 2007 07:18


Get Cover Art (Online oder iTunes / WMP)
 
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()

arne99 3. Jul 2007 08:53

Re: Get Cover Art (Online oder iTunes / WMP)
 
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?

CCRDude 3. Jul 2007 10:01

Re: Get Cover Art (Online oder iTunes / WMP)
 
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?

arne99 3. Jul 2007 12:14

Re: Get Cover Art (Online oder iTunes / WMP)
 
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.

CCRDude 3. Jul 2007 13:25

Re: Get Cover Art (Online oder iTunes / WMP)
 
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 ;)

arne99 3. Jul 2007 14:08

Re: Get Cover Art (Online oder iTunes / WMP)
 
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.

OregonGhost 3. Jul 2007 14:28

Re: Get Cover Art (Online oder iTunes / WMP)
 
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.

CCRDude 3. Jul 2007 14:30

Re: Get Cover Art (Online oder iTunes / WMP)
 
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).

made in Germany 3. Mai 2008 15:44

Re: Get Cover Art (Online oder iTunes / WMP)
 
gibts noch eine andere möglichkeit um auf die daten zuzugreifen oder muss ich mich da anmelden?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:11 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