Modul für Bildinfo's

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.
RicmanX
User
Beiträge: 69
Registriert: Donnerstag 29. August 2002, 17:10
Wohnort: Erfurt
Kontaktdaten:

@Beyond: es wäre schön wenn du das Script weiterentwickeln würdest! :)

Ich habe bemerkt, das der die ...__image__jpeg.py usw. zwar importiert, aber nicht benutzt? Jedenfalls wären auch weitere Mimetypes noch gut. Und er sollte auch die Extension der Datei (Am Bsp. Python.jpg) anstatt ".jpeg" zurückgeben.

Ansonsten echt Klasse gemacht und super nützlich! 8)
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Danke. :D

Ich werde mich mal am Wochenende daran machen etwas weiter zu coden.

Ich habe z.Z. nur ziemlich viel zu tun. Das Physikstudium an der TUM ist kein Kinderspiel und dann habe ich noch so einige andere Verpflichtungen ...

Über Mithilfe beim Programmieren für dieses Modul wäre ich sehr dankbar. Vorallem beim Implementieren von Mime-Types sollte sich die Arbeit auch gut aufteilen lassen.

U.U. werde ich auch am Wochenende ein neues Konzept für content_info einführen: Ich will das dictionary, daß jetzt ja irgendwelche Daten enthält durch ein spezielles Objekt ersetzen, daß für jeden Mime-Type spezifisch ist, aber eben allgemeine Parents hat (mittels Multiple Inheritance) z.B. können das gif- und das jpeg-Objekt beide von einem Picture-Objekt abgeleitet werden. Ist etwas eines Instanz eine Picture-Objekts hat es z.B. Höhe und Breite.

Außerdem möchte ich die Lizenz ändern z.B. LGPL oder BSD.

Vorschläge?

cu beyond
Zuletzt geändert von Beyond am Mittwoch 11. Dezember 2002, 23:54, insgesamt 1-mal geändert.
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

(Ich war vorhin wieder mal ausgeloggt worden :?: )

So jetzt ist die neue Version fertig. Die gibt's wieder unter
http://www.zope.org/Members/beyond/contentinfo
Es wäre echt toll, wenn Ihr Module z.B. für mp3, mpeg, avi, ... programmieren könntet. Ich kann gerne auch dabei mithelfen.
Für .ogg habe ich schon einen Java-Code gefunden. Er ist aber GPL und ich hätte gerne LGPL, daher habe ich den Autor angeschrieben ...

Übrigens: die extension für JPEG ist wirklich .jpeg.
RicmanX
User
Beiträge: 69
Registriert: Donnerstag 29. August 2002, 17:10
Wohnort: Erfurt
Kontaktdaten:

Das mit der Extension mein ich so, wie die Datei halt heißt. Weil im _contentinfo wird das auch ausgelesen, nur je nach Header entsprechend ausgegeben. Ich denk halt an ne "echte" Extension, sprich wie im Dateinamen. Meinetwegen auch 2 Werte, falls sich beides unterscheidet.

Zu allererst könnt ich dir die Infos für Endung/Mimetyp von mehreren Dateiarten schicken.
Gib mal Mailadresse :)
Zuletzt geändert von RicmanX am Samstag 14. Dezember 2002, 21:30, insgesamt 1-mal geändert.
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

ich hab mal zwecks lesbarkeit die beiden doppelten Posts gelöscht. Ich denk mal, daa eh beide doppelt mit gleichem text waren... :wink: :roll: . Ich mach das dann auch bei anderen topics um Ordnung zu schaffen, wenn ich mal wieder sowas bemerke, solange noch ein anderer Post mit wirklichem Namen da ist, der darauf hinweißt.
RicmanX
User
Beiträge: 69
Registriert: Donnerstag 29. August 2002, 17:10
Wohnort: Erfurt
Kontaktdaten:

Also ich hab n ziemliches Problem. "info" ist einfach n String oder so, kein Dictionary mehr. Das heißt man kommt an die Infos nicht mehr ran - bzw. ich bin zu blöd dazu :D
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Postings: Ja gut, daß die doppelten raus sind.

Mimetypes: Wichtig ist vorallem wie die Informationen in den Dateien stehen. Eine reine Zuordnung von Dateiname und Mimetype reicht leider nicht (dafür gibt es ein Python-Modul mimetypes). Aber schick mir einfach mal was Du hast. Email-Adresse -> webmaster@beyond-thoughts.com

Info: info ist jetzt ein Objekt -- sprich eine Instanz einer Klasse. siehe auch CIContentTypes.py
interessante Informationen kann man dann z.B. mit getattr oder einfach mit obj.attribut herausbekommen.

Extension: Aus dem Dateinamen kann man diese natürlich ermitteln. Das geht recht simpel ist aber nicht so verlässlich. Dafür könnte ich eine Extra-Funktion schreiben. Das andere wäre: verschiedene gültige Extensions für einen Mimetype zu defnieren und ggf. die gültige und derzeit verwendete Extension zurückzuliefern.


cu beyond
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

ich weiß zwar wie man dann die sachen da rausholt, aber das ist eigentlich nicht userfreundlich, weil du ständig überprüfen müsstest ob die attribute wirklich da sind. Das gleiche wäre es wenn du mit getattr arbeitest, weil man darauf nicht schnelle Dictionaryspeizifische Optionen anwenden kann. Ich fänd es besser wenn du noch in deine Basisklasse ne Methode einbauen könntest die gleich ein Dictionary formt, falls es gefordert wird. Soll heißen, das in deiner Klasse BasicContent eine Methode dict eingebaut werden könnte, die ein Dictionary nach der vorherigen Aufbauweise zurückliefert. Dadurch wäre es ja egal, mit welchem Contenttype du das machst, weil sich das dann vererbt.
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Ein dictionary gibt's schon: __dict__

Eine solche Vorgehensweise ist aber bad style!

Denn bei einem Dictionary weißt Du zunächst weder, ob es ein Attribut gibt noch, was es bedeutet (schlimmer).

Es ist wesentlich sinvoller mit isinstance zu prüfen ob der Content von der Klasse PictureContent ist. Denn dann weißt Du:
- es gibt width und height
- was das zu bedeuten hat.

Genau deshalb habe ich das ganze neu programmiert.

cu beyond
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

ich finde das ist berachtungsweise. :arrow: denn immerhin gibt es bei einem Dict die methoden has_key, items, keys, values. Die kann ich schnell durch for-schleifen laufen lassen, was eigentlich mein Ziel ist. Dann kann ich ähnlich wie mit getattr werte mit get rausholen.

Versteh mich nicht falsch, denn deine Klassen blieben ja erhalten und man könnte ja immer noch mit isinstance abfargen. nur lässt sich der Rest besser handhaben. Es ist ja nur eine nutzbare Option, nicht ein zwang das zu nehmen. das es das mit __dict__ schon gab, wusste ich ja nicht.
Schlechter Stil ist es meiner Meinung nach nicht, weil du ja eben abprüfen kannst was da ist etc.
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Was da ist kann man abprüfen. Nicht aber wie die Werte zu interpretieren sind. Ich habe mir daher für das .png-modul auch die Arbeit gemacht eine richtige __str__ Methode zu programmieren und auch gleich meine Referenz angegeben, sodaß man hier wirklich weiter arbeiten kann. Bei einem Flash-File ist z.B. eigentlich (habe ich aber anders implementiert) Breite und Höhe in 20*pixelzahl angegeben. Würdest Du einfach darauf zugreifen (mit anderer Implementation) käme wohl nicht das raus, was Du Dir erwartest....

Aber was ist z.B. wenn .pdf-Dokumente unterstützt werden. Da finde ich es garicht so leicht überhaupt festzulegen was Breite und Höhe dann sein soll. Man könnte sagen Breite und Höhe einer Seite, aber in .pdf-Dokumenten können Seiten verschiedener Größe auftauchen ... Soll man das Maximum nehmen? Man könnte auch alle Seiten "aneinander hängen" und davon die Maße nehmen.

Wenn es also nicht nur um Bilder geht ist die Sache nicht so einfach und intuitiv.

Nachdem es nach bisherigen Infos bei Dir aber nur um Bilder geht solltest Du immer auf PictureContent prüfen (sonst kannst Du zwar u.U. Deinen Code ausführen, aber er macht dann keinen Sinn -- so etwas sollte man verhindern! Das ist ähnlich wie ein dicker Käfer der auf dem Rücken liegt und mit den Beinen strampelt). Handelt es sich nicht um ein Bild solltest Du mit einer Fehlermedlung abrechen. Wenn doch ist ja eh alles bestens ...

Aber wenn Dir Deine Methode leichter fällt, mach es so. Ich habe auch schon einiges mit WFM-Status zusammen-gehackt. Da gibt's noch viel mehr Sachen, die man machen kann 8) ...

Was ich Dir sagen will: Sei Dir im Klaren was Du tust und wo Fehler in Deinem Code dadurch auftauchen können. Kommentiere diese Stellen v.a. wenn Du mit anderen zusammenarbeitest.

cu beyond
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

:wink: hab das ein wenig eng gesehen, weil ich eben nur Bilder brauche...

ich hab mich heute auch mal schlau gemacht in bezug auf mp3 und avi, aber außer tausend Editoren die sagen, die sagen sie wären die besten im umwandeln, hab ich keinen Hinweis oder Quellcode gefunden, der dir nützlich sein könnte. tut mir leid.
RicmanX
User
Beiträge: 69
Registriert: Donnerstag 29. August 2002, 17:10
Wohnort: Erfurt
Kontaktdaten:

Falls sich manche Leute wundern, neue URL ist jetzt http://www.pythonarea.net/cgi-bin/paf/m ... o/index.pl
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Man muß z.B. nach "file format specifications" suchen. Bei SourceForge gibt's einige mp3-Projekte. Diese können z.B. mp3-Daten auslesen.

Für .ogg habe ich eines gefunden.

@Milan: Hättest Du Interesse es in das Modul einzuarbeiten?
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

neugierig bin ich schon, aber ich habe keine Ahnung, wie du deine Module aufgebaut hast. am besten schickst du mir mal ne mail, wo drin steht was es amchen soll und wie es das zurückgeben soll.
In der Zeit muss ich dich auch erst mal enttäschen, da ich vor Weihnachten quasi "streike", weil erst mal Ferienstart ist. ansonsten hätt ich lust zu das zu machen.
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Am besten ist es, wenn Du Dir die sub-module im /contentAnalysers Verzeichnis von contentinfo anschaust. Es bietet sich contentinfo_image__gif.py an. Dieses ist sehr einfach.

Stell mir bei Unklarheiten die Fragen am besten über das Forum, so können alle sich darüber informieren.

Den Java-Code gibt's bei
http://taxiway.swapspace.net/~matt/vorbis/

Ich habe mit dem Autor die Lizenz bereits geklärt.
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

ui... so gut kann ich java nicht, dass ich alles übersetzen kann. Ich könnte circa 1/3, aber der Rest ist mir unklar. Ich lern Java auch gerade erst, kanns aber weniger als Python :roll: . Ich weiß nicht, ob ich da wirklich zurechtkomme. :o :(
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Dein Vorteil beim Portieren ist, dass Du den Java-Code nur halbwegs nachvollziehen können mußt. Das ist wesentlich leichter als selber etwas in Java zu programmieren. Wenn Du etwas nicht verstehst, frag mit einfach.

Ich habe jetzt auch noch .wav und .au implementiert.
Z.T. mit Hilfe einer Doku zu FileFormats die Guido van Rossum geschrieben hat -- vor einiger Zeit :)
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

öhm... bis jetzt komm ich ja ganz gut klar, aber was heißt sowas?

Code: Alles auswählen

 public VorbisInfo(InputStream s) throws IOException {

    /* initialize the crc_lookup table */
    for (int i=0;i<256;i++)
      crc_lookup[i]=_ogg_crc_entry(i);

    fetch_header_and_packet(s);
    interpret_header_packet();

    fetch_header_and_packet(s);
    interpret_header_packet();
  }
- pubilc : ist klar, aber gibt es in Python nicht
- VorbisInfo(InputStream s) : :?:
- trows IOExeception: :?:

einfacher ist das hier:

Code: Alles auswählen

public int getChannels() {return channels;}
der returnwert ist ein integer, der name ist getChannels, es gibt keine Parameter und gemacht wird "return channels". Ich kann das Beispiel aber nicht auch das obere übertargen und Java kann ich wie gesagt nicht gut genug. Der Rest ist nicht besonders schwer, jedenfalls auch den ersten Blick.
piddon
Gründer
Beiträge: 410
Registriert: Dienstag 30. Juli 2002, 18:03
Wohnort: Oestrich-Winkel
Kontaktdaten:

Code: Alles auswählen

public VorbisInfo(InputStream s) throws IOException { 

    /* initialize the crc_lookup table */ 
    for (int i=0;i<256;i++) 
      crc_lookup[i]=_ogg_crc_entry(i); 

    fetch_header_and_packet(s); 
    interpret_header_packet(); 

    fetch_header_and_packet(s); 
    interpret_header_packet(); 
  }
Das sind einfach nur Methodenaufrufe.

Diese Methoden fetch_header.... haben keinen Returnwert, daher nur der Aufruf, wie ein "Befehl". Der Aufruf bei deinem 2. Code wäre ja:

Code: Alles auswählen

a = getChannels()
und in a hast du dann deinen Returnwert.

Wird eine MEthode jedoch so deklariert:

Code: Alles auswählen

public void get_header(s)
Man kann es so interpretieren, dass deine Code angehalten wird, der code von get_header wird ausgeführt, und danach bekommt dein Code wieder die Kontrolle und macht weiter..

so gibt es keinen Wert der zurückgegeben werden muss, und man ruft es so auf:

Code: Alles auswählen

get_header(s)
fetch_header_and_packets(s) muss es irgentwo als Method implementiert geben. Was anderes kann ich mir nicht vorstellen.

Aber warum das ganze zweimal hintereinander? Das macht KEIN sinn

Viel Bla von mir, hoffentlich hilfts...
irc: #python.de @ irc.freenode.net | [url=http://pythonwiki.pocoo.org]python-wiki[/url] | [url=http://www.pythonwiki.de/PythonDeForum/Faq]python-forum FAQ[/url]
Antworten