UID´s verursachen Zugriffsfehler

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
RonaldRonald
User
Beiträge: 7
Registriert: Samstag 27. November 2010, 16:28

Hey Leute,

ich will mittels id3reader.py oder ähnlichem die ID3-Tags von Mp3s auslesen. Der Zugriff erfolgt über UID´s. Doch anscheinend mag id3reader und ähnliche das nicht und geben einen Zugriffs- oder Filenamenfehler zurück. Ich vermute eben, dass das an der UID liegt. Ideen, oder Erfahrungen dazu? Kann ich die UID irgendwie vorher auflösen?

Danke und viele Grüße, Ronald
BlackJack

@RonaldRonald: Was sind in diesem Zusammenhang denn UIDs?
RonaldRonald
User
Beiträge: 7
Registriert: Samstag 27. November 2010, 16:28

beispielsweise habe ich die url "kinkerkanker.com/79234213nc4294n423c61284n"
Der letzte Teil ist die UID und der Server löst die dann auf in "kinkerkanker.com/einemp3.mp3"
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Bitte beschreibe doch noch mal für den Laien in Sachen id3reader das genaue Vorgehen! Schön wäre natürlich auch der bisherige Quellcode oder ein relevantes Schnipsel.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

RonaldRonald hat geschrieben:beispielsweise habe ich die url "kinkerkanker.com/79234213nc4294n423c61284n"
Der letzte Teil ist die UID und der Server löst die dann auf in "kinkerkanker.com/einemp3.mp3"
Jetzt stellt sich dein Problem auf einmal völlig anders dar. Was du möchtest ist also das Herunterladen einer Datei via HTTP.

Da sollte sich mit urllib2 etwas machen lassen.
RonaldRonald
User
Beiträge: 7
Registriert: Samstag 27. November 2010, 16:28

hm.. moment:

Code: Alles auswählen

from ID3 import *
....

#oder auch
import mad
...

# wahlweise so:
mf = mad.MadFile("http://kinkerkanker.com/79234213nc4294n423c61284n")
track_length_in_ms = mf.total_time()
	
# oder so..
id3r = id3reader.Reader("kinkerkanker.com/79234213nc4294n423c61284n")
track_length_in_ms = id3r.getValue('TT2')
Wenn eine solche UID auf ein Bild zeigt, dann wird die UID vom Server aufgelöst und der Rechtsklick im Browser auf die Eigenschaften des Bildes zeigt dann die bspw. "kinkerkanker.com/einbild.jpg" an.
Ich vermute, das mad, id3reader u.ä. hier nicht die UID brauchen, sondern die url, auf die die UID tatsächlich zeigt. Also eben "kinkerkanker.com/einemp3.mp3"..

urllib2 schau ich mir mal an!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mir ist nach wie vor nicht klar, was Du überhaupt machen willst! Allerdings solltest Du folgendes bedenken: Du gibst eine URL als Parameter an eine Funktion. Diese müßte dann selbständig erkennen, dass es sich nicht um ein lokales File handelt, sondern, dass sie diese erst über Netzwerkzugriff runterladen muss. Ob die API das kann, weiß ich nicht, aber ich würde mir mal die Doku zu diesen beiden Funktionen / Klassen angucken. Da dürfte ja beschrieben sein, was sie erwarten.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
RonaldRonald
User
Beiträge: 7
Registriert: Samstag 27. November 2010, 16:28

Immer noch nicht klar, was ich machen will... Hm, mist! Also: Der Codeschnipsel aus meinem letzten Beitrag läuft nicht und ich vermute das liegt daran, dass die UID´s (sozusagen redirect) Probleme machen, weil eben mad oder id3reader damit nicht umgehen können.

Ich kanns grad nicht hier testen, aber ich vermute, dass ich die UID-Url "http://kinkerkanker.com/79234213nc4294n423c61284n" mit geturl nach "kinkerkanker.com/einemp3.mp3" bekomme und dann hoffentlich keinen Zugriffsfehler mehr bekomme. Werds nachher mal testen...

Code: Alles auswählen

geturl- this returns the real URL of the page fetched.This is useful because urlopen (or the opener object used) may have followed a redirect. The URL of the page fetched may not be the same as the URL requested
Danke erstmal, melde mich! Ronald
lunar

Bei id3reader handelt es sich wohl um ein Modul von Ned Batchelder, welches nur mit lokalen Dateien funktioniert.

@RonaldRonald: Wie kommst Du denn darauf, dass ein Modul irgendeines Programmiers auf magische Weise Deine UIDs verstehen würde?
Computer können nicht denken, Du musst schon dezidierte Anweisungen geben, also zuerst die UID auflösen, dann die Datei herunterladen und anschließend deren ID3-Tags auslesen.
RonaldRonald
User
Beiträge: 7
Registriert: Samstag 27. November 2010, 16:28

Oh.. Was heißt denn hier lokal? Gleiche Domain, gleicher Server?

Ja... Keine Ahnung, wie ich darauf kam, dass die UID automatisch verstanden wird. Ich kenne die genauen Abläufe nicht, wie die UIDs aufgelöst werden und da sie so problemlos bei Bildern in html aufgelöst wurden, hab ich nicht weiter drüber nachgedacht. :oops:
Aber mir war ja schon im ersten Posting danach, dass ich die UID auflösen muss...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

RonaldRonald hat geschrieben:Oh.. Was heißt denn hier lokal? Gleiche Domain, gleicher Server?
"lokal" heißt in diesem Kontext, dass eine Datei in Deinem Dateisystem liegen muss. Im Moment tut sie das ja augenscheinlich nicht, sondern sie liegt im Web und ist nur über das http-Protokoll erreichbar. Dieses Aufspüren und anschließende Runterladen musst Du eben selber programmieren, bevor diese id3-Geschichten stattfinden können.
RonaldRonald hat geschrieben: Ja... Keine Ahnung, wie ich darauf kam, dass die UID automatisch verstanden wird. Ich kenne die genauen Abläufe nicht, wie die UIDs aufgelöst werden und da sie so problemlos bei Bildern in html aufgelöst wurden, hab ich nicht weiter drüber nachgedacht. :oops:
Was auf einem Webserver oder lokal per JavaScript in einem Browser passiert hat ja nix mit Python oder einem spezifischen Modul davon zu tun! Da sollte man nicht von verschiedenen Technologien versuchen zu schließen.
Aber mir war ja schon im ersten Posting danach, dass ich die UID auflösen muss...
Ja nicht nur auflösen, sondern auch runterladen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
RonaldRonald
User
Beiträge: 7
Registriert: Samstag 27. November 2010, 16:28

So... Es wird...

Code: Alles auswählen

import mutagen
...
url= "http://kinkerkanker.com/79234213nc4294n423c61284n"
u = urllib2.urlopen(url)
redirectUrl = u.geturl()
x = urllib.urlretrieve(redirectUrl)
tmp_url = x[0]
audio = MP3(tmp_url)
track_length_in_ms = audio.info.length
print track_length_in_ms
In der Variable "redirectUrl" steht jetzt die aufgelöste Url. urlretrieve speichert die Datei lokal im temp-verzeichnis und mit mutagen bekomme ich die tracklänge. Das ist schonmal super, dauert aber wegen dem Dateidownload pro Datei ne Sekunde. eigentlich zuviel... Weiß jemand Rat?

Ansonsten: Als "track_length_in_ms" bekomme ich hier Zahlen zurück wie "170.448", "154.728", aber auch "167.76", obwohl das auch um die 3 min sein müssten. Liegt das an den Float-zahlen, wie kann ich umgehen, dass offenbar die letzte Null wegfällt?

Danke Vielmals, Ronald
BlackJack

@RonaldRonald: Um die Metadaten aus einer MP3-Datei auszulesen, braucht man halt die Datei. Die stehen auch nicht zwingend am Anfang und wenn es eine Datei ist, die mit variabler Bitrate kodiert ist, muss man sich auch die ganze Datei anschauen um die Spielzeit zuverlässig bestimmen zu können.

Ob Du da noch eine Null hinten dranstehen hättest in der Zeichenkettendarstellung würde ja am Wert nichts ändern. Das sind *Sekunden* und keine Millisekunden. Vielleicht verwechselst Du hier gerade den Punkt als Trenner zwischen Vor- und Nachkommaanteil einer Fliesskommazahl mit einem Punkt als Gruppierungszeichen für grosse Zahlen.
RonaldRonald
User
Beiträge: 7
Registriert: Samstag 27. November 2010, 16:28

Vielleicht verwechselst Du hier gerade den Punkt als Trenner zwischen Vor- und Nachkommaanteil einer Fliesskommazahl mit einem Punkt als Gruppierungszeichen für grosse Zahlen.
ganz genau das hab ich getan...

Hm.. Ich habe vermutet, dass die Metadaten immer an ähnlicher stelle stehen und deshalb nicht die gesamte MP3 herhalten muss... Weil so ist das ja relativ unpraktisch.. Aber gut, akzeptiert!
Danke!
Antworten