Entwickler-Ecke

Internet / Netzwerk - Songtexte online suchen


Bergmann89 - Fr 10.07.09 16:04
Titel: Songtexte online suchen
HI,

ich such ne Möglichkeit, mit der ich die Songtexte von http://www.LyricWiki.org runter laden kann. Weiß jmd von euch wie ich das in nem Programm realisieren kann?

MfG & Thx Bergmann


Gausi - Fr 10.07.09 16:11

Ja, weiß ich. :mrgreen:


Bergmann89 - Fr 10.07.09 16:21

hehe, gut das wars dann auch schon.... xD

ne spaß. wie mach ich das?

MfG Bergmann.


Andreas L. - Fr 10.07.09 16:29

Zuerst musst du die Suchfunktion der Seite ansteuern. Suchen wir mal nach "faith no more land of sunshine":

http://lyricwiki.org/Special:GoogleSearchResults?cx=partner-pub-7265006513689515%3Aenbi50a4igp&cof=FORID%3A9&ie=UTF-8&q=faith+no+more+land+of+sunshine&sa=Search#869
So einen String kannst du dir ja problemlos zusammen bauen. Die Seite lädst du dann mit IdHttp.get in eine StringList und extrahierst dir die Suchergebnisse (dazu musst du dir den HTML-Code Ergebnisseite ansehen, jedes Suchergebnis hat einen ähnlichen HTML-Code den du als Suchmuster verwenden kannst).

Hast du die URL extrahiert, z. B.

Quelltext
1:
http://lyricwiki.org/Faith_No_More:Land_Of_Sunshine                    


lLädst du diese URL ebenfalls in eine StringList und extrahierst alles zwischen <div class="lyricbox"> und </div>.

Was du alles brauchst: TStringList, Suche in: Delphi-Forum, Delphi-Library TIDHTTP, Suche in: Delphi-Forum, Delphi-Library POS, Suche in: Delphi-Forum, Delphi-Library COPY, Suche in: Delphi-Forum, Delphi-Library POSEX


ffgorcky - Fr 10.07.09 16:33

Kannst Du denn mal genauer beschreiben, was Du denn als Ausgabe haben möchtest?
Möchtest Du nur z.B. diese Seite [http://lyricwiki.org/Die_Prinzen:Be_Cool_Speak_Deutsch] als ganzes speichern - oder möchtest Du dann nur den Songtext haben?
Um nur den Text zu speichern, bräuchtest Du ja nur nach diesem: <div class='lyricbox' > und nach dem Ende davon -also dem nächsten, direkt darauf folgenden:</div> suchen und das dazwischen ist dann doch der Text, inklusive HTML-Formatierung.


Gausi - Fr 10.07.09 16:34

Oh, das geht besser. Steht doch alles auf der Seite, was man da tun muss: http://lyricwiki.org/LyricWiki:REST :zwinker:

Alternativ gehts auch über SOAP, aber auf den Delphi-Tagen haben wir ja dieses Jahr gelernt, dass SOAP sowieo Mist ist, und REST viel toller. :D

Mal ein Auszug aus meinem Player-Code:
Erstmal ein paar Hilfsfunktionen - das ist die Version für Delphi 7, also String = AnsiString = UTF8String.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
function StringToURLString(aString: String): String;
var i: integer;
begin
    result := '';
    for i := 1 to length(aString) do
      result := result + '%'  + IntToHex(Ord(aString[i]),2)
end;

function WordUppercase(s: String): String;
var
    i: Integer;
    tmp: String;
begin
    s := LowerCase(s);
    result := s;

    with TStringList.Create do try
        Delimiter := ' ';
        DelimitedText := s;
        for i := 0 to Count-1 do
            if (Strings[i] <> ''then
            begin
                tmp := Strings[i];
                tmp[1] := Upcase(tmp[1]);
                Strings[i] := tmp;
            end;
        Delimiter := '_';//#32;
        result := DelimitedText;
    finally
        Free;
    end;
end;


Die eigentliche Lyric-Such-Methode ist dann stark gekürzt so: (d.h. ohne Thread-Kram und Exception-Handling)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
LyricQuery := 'http://lyricwiki.org/api.php?func=getSong&artist='
                        + StringToURLString(WordUppercase(UTF8Encode((aArtist))))
                        + '&song='
                        + StringToURLString(WordUppercase(UTF8Encode((aTitel))))
                        + '&fmt=text';
myLyrics := idHttp1.Get(LyricQuery);


Bergmann89 - Fr 10.07.09 17:38

wunderhübsch. funzt alles 1a. danke!


Bergmann89 - Sa 11.07.09 16:27

HI,

1 Problem hab ich noch und zwar bleibt das ganze Prog hängen, solange TidHTTP arbeitet, kann man das ändern?

MfG Bergmann


Gausi - Sa 11.07.09 17:04

Ja, das kann man auch ändern. Eine Möglichkeit wäre diese Antifreeze-Komponente von den Indys, die aber vom Gefühl her irgendwie Murks ist. Besser ist es, das herunterladen in einen Thread auszulagern.


Bergmann89 - Sa 11.07.09 17:59

HI,

hab die Suche jetzt komplet in nen Thread ausgelagert, aber wenn ich gesucht hab hageltes beim schließen des Progs Fehlermeldungen: Ungültiges Fensterhandle.
So hab ich das gemacht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
  
TSearchThread = class(TThread)
    abort: Boolean;
    procedure Execute; override;
  end;

procedure TSearchThread.Execute;
begin
  [Quelltext zur LyricSuche mit schleife die die Datein durchzählt. 
   wenn abort = true bricht die schleife ab...]
end;

procedure TForm1.StartSearchClick(Sender: TObject);
var i: Integer;
begin    
  //SearchThread erstellen
  Thread := TSearchThread.Create(True);
  Thread.FreeOnTerminate := True;
  Thread.Resume;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Assigned(Thread) then Thread.Terminate;
end;

Hab noch nie mit Thread programmiert und weiß net wo ich den Fehler suchen soll...

MfH & Thx Bergmann


Bergmann89 - Mi 05.08.09 09:09

Heyho,

irgendwie geht das REST nich mehr. Gibts noch ne andere Lsg? Ich hab mir das jetzt Stück für Stück aus den HTML-Code zusammen gebastelt, aber das is ar***-lahm!

Mfg Bergmann


Gausi - Mi 05.08.09 09:30

Argh. Diese [*selbstzensur*] von Plattenbossen. Kriegen den Hals wieder nicht voll und torpedieren ein offenes Projekt. Klar, durch die kostenlose Verbreitung von Liedtexten entgehen den armen Künstlern drölftausend Milliarden Einnahmen pro Tag. :autsch:

Aktuelle Antwort bei Lyric-Requests:
Unfortunately, due to licensing restrictions from some of the major music publishers we can no longer return lyrics through the LyricWiki API (where this application gets some or all of its lyrics).

The lyrics for this song can be found at the following URL:
<URL zum angeforderten Song>

(Please note: this is not the fault of the developer who created this application, but is a restriction imposed by the music publishers themselves.)


Da bleibt wohl als Abhilfe nur, die URL aus dieser Antwort auszulesen, die Seite aufzurufen und den Text daraus zu extrahieren, siehe auch hier [http://groups.google.com/group/lyricwiki-api/browse_thread/thread/733ccd919d654040].

Urheberrechte hin oder her, die Künstler sollen und müssen für ihre Arbeit entlohnt werden. Aber bei solchen Aktionen möchte ich einfach nur alle diese Typen in einen Sack packen und mit einem dicken Knüppel draufhauen. Da denkt man, die kriegen langsam die Kurve von wegen kein DRM, mp3 und fair-use, und dann kommt wieder sowas. :motz:


MDX - Do 06.08.09 18:56

Also scheint doch noch zu gehen wenn es die Seite http://lyricwiki.org/LyricWiki:REST noch gibt!?


Gausi - Do 06.08.09 18:59

Probier mal die Links auf der Seite aus, die als Beispiel für die Textsuche dienen sollen ;-). Die API ist nicht komplett abgeschaltet, aber die wichtigen Teile schon. :(


Bergmann89 - Mo 02.11.09 23:29

Hey,

da LyricWiki ja zwischenzeitlich komplett down war ist sie jetzt zu neuem Leben erwacht...
Mit dem kleinen aber feinen Unterschied, das der Text jetzt durch ein JavaScript geladen wird und nicht mehr direkt im Quelltext steht.
Nun die Frage: kommt man irgendwie über den JavaScript an die Lyrics, wenn ja wie und wäre das legal?

Mfg Bergmann.


platzwart - Mo 02.11.09 23:32

Um sicher zu gehen, frag doch einfach an, ob du es bei denen darfst. Aber generell würde ich sagen, dass das nicht OK ist.


Gausi - Di 03.11.09 08:50

Irgendwie geht das bestimmt. Es ist dann aber keine Methode, die sicher vor Veränderungen an der Seite ist.

Legal ist das dann natürlich keineswegs - denn die API wurde ja abgeschaltet, um genau das zu verhindern. Außerdem schädigst du mit dem automatisierten Herunterladen von Lyrics die Künstler, hast Schuld an der Weltwirtschaftskrise und bist (zumindest teilweise) Verursacher der Schweinegrippe-Pandemie. :roll:


Robert.Wachtel - Di 03.11.09 11:13

user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
[...] Alternativ gehts auch über SOAP, aber auf den Delphi-Tagen haben wir ja dieses Jahr gelernt, dass SOAP sowieo Mist ist, und REST viel toller. :D [...]

Ach je, das seh ich ja jetzt erst. :shock:

Wer verzapft denn so einen ausgemachten Unsinn? Sollte das in dieser Allgemeinheit tatsächlich Ernst gemeint sein, hat da jemand aber von seinem Metier nicht wirklich Ahnung.

Sicherlich ist REST für solche unkritischen Suchabfragen das Protokoll der Wahl, aber was ist denn mit SOA-Infrastrukturen, in denen z.B. Sicherheitsapekte oder nichtfunktionale Attribute eine Rolle spielen? Von fehlender Unterstützung von Komponier- oder Orchestrierbarkeit durch REST möchte ich gar nicht erst sprechen...


Gausi - Di 03.11.09 11:19

Das war Marco Cantu, und das war wohl so halb ernst gemeint. Begründung (in etwa): REST ist deutlich einfacher und simpler gestrickt, und reicht für viele Anwendungen aus. In seinem Vortrag hat er dann einige Beispiele genannt, wie man mit ein paar Zeilen Code da was basteln kann. IIRC was zu GoogleMaps und Twitter.

Eine allgemeine Abwertung von SOAP war das vermutlich nicht, aber oftmals ist das wohl eher mit Kanonen auf Spatzen geschossen.


Robert.Wachtel - Di 03.11.09 11:40

user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Das war Marco Cantu, und das war wohl so halb ernst gemeint. [...]

Ach so, dann bin ich ja beruhigt. ;)

Marco Cantus Beispiele zu REST beziehen sich ja tatsächlich auf den Konsum unkritischer Abfragen. Dort sehe ich auf Grund des geringeren Overheads tatsächlich Vorteile für REST gegenüber anderen Protokollen.