mp3dir

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
stuhlbein
User
Beiträge: 89
Registriert: Freitag 9. Januar 2009, 16:08

Hi,

MP3Dir, eine neu-implemention eines ziemlich alten Perl-skriptes (http://www.jwz.org/hacks/marginal.html), ist mein erster Versuch mich in die Web-programmierung von Python einzuarbeiten.

Grob zusammengefasst listet MP3Dir alle MP3 Dateien eines ordners auf, welche man dann auch abspielen kann, oder als Playlisten exportieren kann.
Hinter der kulisse steckt natürlich noch ein bisschen mehr. :)

Für die Templates habe ich Cheetah verwendet, da ich es sehr einfach zu benutzen finde.

Herunterladen kann man das ganze bei Github: <Klick>

Zum lesen der ID3-tags verwend ich eyeD3.

Mangels wissen um WSGI ist das ganze mittels CGI aufgebaut. Aber die bibliotheken an sich sind, soweit wie möglich, so geschrieben, dass sie ohne grössere Umstände auch mit WSGI, oder ähnlichem, genutzt werden können.

kritik ist erwünscht, ich will ja schliesslich was dabei lernen! :D
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Bitfish!
Bitfish hat geschrieben:MP3Dir, [...] ist mein erster Versuch mich in die Web-programmierung von Python einzuarbeiten.
Ich vertrete die Meinung, dass jeder, der sich mit Webprogrammierung auseinandersetzen möchte, zuerst einmal CGI verstehen und mindestens ein kleines CGI-Programm schreiben soll. Und das ist dir mit MP3Dir auch hervorragend gelungen. :-)

Bitfish hat geschrieben:Für die Templates habe ich Cheetah verwendet, da ich es sehr einfach zu benutzen finde.
Auch hier bin ich deiner Meinung. :-) Siehe: http://halvar.at/python/cherrypy_cheetah/

Du kannst Cheetah auch anders benutzen. Du kannst dir eine Hauptvorlage erstellen, die das Layout der Seite darstellt. In die Hauptvorlage kannst du den Platz für einen "Block" markieren. Z.B. für den änderbaren Content. Die anderen Vorlagen können nun von der Hauptvorlage erben und müssen nur noch den "Block" durch den änderbaren Content ersetzen. So wird es zum Designen etwas einfacher.

Bitfish hat geschrieben:Mangels wissen um WSGI ist das ganze mittels CGI aufgebaut.
Wie man sieht, hat es auch mit CGI gut funktioniert. Vielleicht versuchst du dich auch mal an CherryPy. ;-) Damit kannst du ganz leicht eine WSGI-Anwendung erstellen, die du (WSGI-typisch) per CGI, FASTCGI, mod_python, mod_wsgi, usw. mit einem Webserver wie dem Apachen ausliefern lassen kannst. CherryPy läuft aber auch "standalone", was zum Entwickeln ein großer Vorteil ist.


mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Die keydict Standardargumente in libs/templates.py sind potenziell gefährlich. Sollte das Template Exemplar keysdict ändern wird genau dieses Dict Exemplar verändert - wird die Funktion zukünftig aufgerufen wird dann diese veränderte Dict benutzt. Da ich mich mit Cheetah aber nicht auskenne und auch nicht weiß, wie oft die Funktionen aufgerufen werden, mag es sein, daß das kein Problem darstellt.
stuhlbein
User
Beiträge: 89
Registriert: Freitag 9. Januar 2009, 16:08

gerold hat geschrieben:Hallo Bitfish!
Bitfish hat geschrieben:MP3Dir, [...] ist mein erster Versuch mich in die Web-programmierung von Python einzuarbeiten.
Ich vertrete die Meinung, dass jeder, der sich mit Webprogrammierung auseinandersetzen möchte, zuerst einmal CGI verstehen und mindestens ein kleines CGI-Programm schreiben soll. Und das ist dir mit MP3Dir auch hervorragend gelungen. :-)
Danke :D
Bitfish hat geschrieben:Für die Templates habe ich Cheetah verwendet, da ich es sehr einfach zu benutzen finde.
Auch hier bin ich deiner Meinung. :-) Siehe: http://halvar.at/python/cherrypy_cheetah/
Ja, anfangs bestand das Templates modul nur aus `string.Template`, später wollte ich eigentlich Bottle verwenden, was aber leider ein kleines problem mit dem keysdict zu haben scheint :( Erst später entschied ich mich, nach kurzem ausflug richtung Jinja, Cheetah zu verwenden, was in sachen Benutzbarkeit wirklich ungeschlagen ist (imho).
Du kannst Cheetah auch anders benutzen. Du kannst dir eine Hauptvorlage erstellen, die das Layout der Seite darstellt. In die Hauptvorlage kannst du den Platz für einen "Block" markieren. Z.B. für den änderbaren Content. Die anderen Vorlagen können nun von der Hauptvorlage erben und müssen nur noch den "Block" durch den änderbaren Content ersetzen. So wird es zum Designen etwas einfacher.
stimmt, ist für neuere versionen auch bereits geplant :D

Bitfish hat geschrieben:Mangels wissen um WSGI ist das ganze mittels CGI aufgebaut.
Wie man sieht, hat es auch mit CGI gut funktioniert. Vielleicht versuchst du dich auch mal an CherryPy. ;-) Damit kannst du ganz leicht eine WSGI-Anwendung erstellen, die du (WSGI-typisch) per CGI, FASTCGI, mod_python, mod_wsgi, usw. mit einem Webserver wie dem Apachen ausliefern lassen kannst. CherryPy läuft aber auch "standalone", was zum Entwickeln ein großer Vorteil ist.
auf jedenfall, das thema WSGI ist für mich aber leider (noch) ein ziemliches fremdwort :D

str1442 hat geschrieben: Die keydict Standardargumente in libs/templates.py sind potenziell gefährlich. Sollte das Template Exemplar keysdict ändern wird genau dieses Dict Exemplar verändert - wird die Funktion zukünftig aufgerufen wird dann diese veränderte Dict benutzt. Da ich mich mit Cheetah aber nicht auskenne und auch nicht weiß, wie oft die Funktionen aufgerufen werden, mag es sein, daß das kein Problem darstellt.
Ich hab diese funktion bereits erfolgreich mit Jinja2, string.Template, und Cheetah getestet - aber ich denk, ich verstehe was du meinst. Nur ist mir so ein fall zum glück bisher noch nicht bekannt ;)
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Wie stehts um Unicodeunterstützung? Sonderzeichen kommen in Tags und Dateinamen relativ häufig vor.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Beispiel:

Code: Alles auswählen

In [1]: class PseudoTemplate(object):
   ...:     def __init__(self, mydict):
   ...:         self.mydict = mydict
   ...:         self.mydict[self] = 42
   ...:         
   ...:         

In [2]: def dummy(keydicts={}):
   ...:     mytemplate = PseudoTemplate(keydicts)
   ...:     return mytemplate
   ...: 

In [3]: a = dummy()

In [4]: b = dummy({"x": 10})

In [5]: c = dummy()

In [6]: print a.mydict
{<__main__.PseudoTemplate object at 0xb77d10ec>: 42, <__main__.PseudoTemplate object at 0xb77d15ec>: 42}

In [7]: print b.mydict
{'x': 10, <__main__.PseudoTemplate object at 0xb77d108c>: 42}

In [8]: print c.mydict
{<__main__.PseudoTemplate object at 0xb77d10ec>: 42, <__main__.PseudoTemplate object at 0xb77d15ec>: 42}

In [9]: print c.mydict is a.mydict
True

In [10]: dummy.func_defaults
Out[10]: 
({<__main__.PseudoTemplate object at 0xb77d10ec>: 42,
  <__main__.PseudoTemplate object at 0xb77d15ec>: 42},)

In [11]: dummy.func_defaults[0] is a.mydict
Out[11]: True
"Is" prüft ob ein Exemplar genau das selbe ist wie ein anderes. Es existiert nur ein Standardargument, und das verteilst du dann an alle Templates, die erstellt werden. Das ist bestimmt nicht was du willst? Der gängige Weg, soetwas zu verhindern, ist, den default einfach auf None zu setzen, in der Funktion darauf zu prüfen und dann ein neues Dict zu erstellen. (Oder, je nach Verwendung und Nutzen der Funktion, gleich ein Callable zu übergeben, welches dann ein entsprechendes Objekt zurückliefern soll - aber für diesen Anwendungsfall ist das eher unangebracht).

Code: Alles auswählen

def dummy(keydicts=None):
    if keydicts is None:
        keydicts = {}
    # ...
lunar

gerold hat geschrieben:Ich vertrete die Meinung, dass jeder, der sich mit Webprogrammierung auseinandersetzen möchte, zuerst einmal CGI verstehen und mindestens ein kleines CGI-Programm schreiben soll.
Darüber kann man streiten ...
Und das ist dir mit MP3Dir auch hervorragend gelungen. :-)
Findest du? Mich persönlich schreckt schon die "main()"-Funktion ab ... zu lang, zu große if-Blöcke, Code-Duplizierung. Für den Rest, den ich mir nicht angesehen habe, lässt das zumindest auf fehlende Strukturierung schließen.
stuhlbein
User
Beiträge: 89
Registriert: Freitag 9. Januar 2009, 16:08

jerch hat geschrieben:Wie stehts um Unicodeunterstützung? Sonderzeichen kommen in Tags und Dateinamen relativ häufig vor.
Unicode-unterstützung ist vorhanden, die etlichen Songs mit umlauten im Titel werden bei mir problemlos angezeigt.
lunar hat geschrieben:Findest du? Mich persönlich schreckt schon die "main()"-Funktion ab ... zu lang, zu große if-Blöcke, Code-Duplizierung. Für den Rest, den ich mir nicht angesehen habe, lässt das zumindest auf fehlende Strukturierung schließen.
Von "perfekt" ist das ganze auch noch seeeehr weit entfernt. :)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also das URL-Dispatching in der main() sieht wirklich nicht so toll aus. Aber imho ist es doch eigentlich ganz gut als Einstieg, da sich der OP nun einfach mal ein Framework angucken könnte und dann festellen wird, wie leicht das damit realisiert werden könnte :-) Denn was motiviert besser zum Lernen, als wenn man sich selber verbessern kann?
Antworten