Internetradio für VDR

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
pancho
User
Beiträge: 3
Registriert: Freitag 1. Februar 2008, 16:04

Hallo,

ich habe angefangen, die Internetradios, die bei Shoutcast gelistet sind, für einen VDR aufzubereiten. Ich habe keine Ahnung ob das Resultat für den VDR funktioniert. Darum geht es aber auch nicht.

Weil ich nur sehr gelegentlich scripte, bitte ich Euch einen Blick auf mein Script zu werfen. Es funktioniert so wie es soll. Aber ich denke das einiges optimiert werden könnte. Ich habe zu fast jedem Teil erst recherchieren müssen und weiß es teilweise nicht besser. Würde mich freuen wenn mir jemand Anstösse in die richtige Richtung geben kann.
Bitte seid hart und fair :wink:

Code: Alles auswählen

#/usr/bin/python
# -*- coding: ISO-8859-1 -*-

# Importiere benoetigte Module
import urllib, os, sys, string, re, shutil as sh

# Genreverzeichnisse loeschen und neu anlegen
gdirs = ['Rock', 'Pop', 'Electronic', '80s', 'Oldies', 'Jazz', 'Country', 'Alle']
for i in gdirs:
    try:
        sh.rmtree(i)
    except:
        pass
    try:
        os.makedirs(i)
    except:
        pass

# Top500 von shoutcast abholen
website = urllib.urlopen('http://www.shoutcast.com/sbin/newxml.phtml?genre=Top500')
liste = website.readlines()
website.close()

# Senderinformationen in Variablen schreiben
for zeile in liste:
    positionen = []
    if zeile[1:13] == 'station name':
        zaehler = 0
        for zeichen in zeile:
            if zeichen == '"':
                r = positionen.append(zaehler)
            zaehler = zaehler + 1
        pos1 = positionen[0] + 1
        pos2 = positionen[1]
        pos3 = positionen[2] + 1
        pos4 = positionen[3]
        pos5 = positionen[4] + 1
        pos6 = positionen[5]
        pos7 = positionen[6] + 1
        pos8 = positionen[7]
        pos9 = positionen[8] + 1
        pos10 = positionen[9]
        pos11 = positionen[10] + 1
        pos12 = positionen[11]
        pos13 = positionen[12] + 1
        pos14 = positionen[13]

        # Variablen mit den Feldern aus jeder Zeile
        sendername = zeile[pos1:pos2]
        media = zeile[pos3:pos4]
        shoutcastid = zeile[pos5:pos6]
        bitrate = zeile[pos7:pos8]
        genre = zeile[pos9:pos10]
        ctitle = zeile[pos11:pos12]
        listeners = zeile[pos13:pos14]

        # Sendernamen glaetten
        sendername = sendername.replace('.', '')
        sendername = sendername.replace('#', '')
        sendername = sendername.replace('&', '')
        sendername = sendername.replace('!', '')
        sendername = sendername.replace(';', '')
        sendername = sendername.replace('(', '')
        sendername = sendername.replace(')', '')
        sendername = sendername.replace(':', '')
        sendername = sendername.replace('[', '')
        sendername = sendername.replace(']', '')
        sendername = sendername.replace('{', '')
        sendername = sendername.replace('}', '')
        sendername = sendername.replace('/', '')
        sendername = sendername.replace('+', '')
        sendername = sendername.replace('\'', '')
        sendername = sendername.replace('?', '')

	# Dateinamen erzeugen
        dateiname = sendername + '.pls'
        
        # Genre bestimmen um in ein Verzeichnis einsortieren zu können
        genre = string.lower(genre)
        kw_rock = ['rock', 'metal', 'punk', 'alternative']
        kw_pop = ['pop', 'top40']
        kw_electronic = ['techno', 'trance', 'house', 'dance', 'ambient', 'space']
        kw_80s = ['80', 'eighty', 'eighties']
        kw_oldies = ['oldies']
        kw_jazz = ['jazz']
        kw_country = ['country', 'schlager']
        kw_alle = ['']

        for test in kw_rock:
            if genre.find(test)!=-1:
                eintrag = open('Rock\\' + dateiname, 'w')
                eintrag.write('http://www.shoutcast.com/sbin/tunein-station.pls?id=' + shoutcastid)
                eintrag.close()
        for test in kw_pop:
            if genre.find(test)!=-1:
                eintrag = open('Pop\\' + dateiname, 'w')
                eintrag.write('http://www.shoutcast.com/sbin/tunein-station.pls?id=' + shoutcastid)
                eintrag.close()
        for test in kw_electronic:
            if genre.find(test)!=-1:
                eintrag = open('Electronic\\' + dateiname, 'w')
                eintrag.write('http://www.shoutcast.com/sbin/tunein-station.pls?id=' + shoutcastid)
                eintrag.close()
        for test in kw_80s:
            if genre.find(test)!=-1:
                eintrag = open('80s\/' + dateiname, 'w')
                eintrag.write('http://www.shoutcast.com/sbin/tunein-station.pls?id=' + shoutcastid)
                eintrag.close()
        for test in kw_oldies:
            if genre.find(test)!=-1:
                eintrag = open('Oldies\\' + dateiname, 'w')
                eintrag.write('http://www.shoutcast.com/sbin/tunein-station.pls?id=' + shoutcastid)
                eintrag.close()
        for test in kw_jazz:
            if genre.find(test)!=-1:
                eintrag = open('Jazz\\' + dateiname, 'w')
                eintrag.write('http://www.shoutcast.com/sbin/tunein-station.pls?id=' + shoutcastid)
                eintrag.close()
        for test in kw_country:
            if genre.find(test)!=-1:
                eintrag = open('Country\\' + dateiname, 'w')
                eintrag.write('http://www.shoutcast.com/sbin/tunein-station.pls?id=' + shoutcastid)
                eintrag.close()
            else:
                eintrag = open('Alle\\' + dateiname, 'w')
                eintrag.write('http://www.shoutcast.com/sbin/tunein-station.pls?id=' + shoutcastid)
                eintrag.close()
BlackJack

XML sollte man besser mit einem XML-Parser verarbeiten. Du gehst davon aus, dass die ``station``-Tags immer an der gleichen Stelle in einer Zeile stehen und die Attribute immer in der gleichen Reihenfolge vorkommen. Das ist nicht besonders robust.

Man könnte das ganze auf mehrere Funktionen aufteilen. Und Wiederholungen durch Schleifen ersetzen. Zum Beispiel das Bereinigen des Sendernamens.

Statt `str.find()` kann man den ``in``-Operator benutzen.

Und das durchgehen der Genres liesse sich mit einer Datenstruktur die Genres auf Schlüsselwörter abbildet und einer Schleife auch in einer handvoll Zeilen, ohne die vielen Wiederholungen lösen.

Ein logischer Fehler ist im letzten ``else``-Zweig. Falls kein Schlüsselwort zutrifft, landet der Song ``len(kw_country)``-mal in der Kategorie `Alle`.
pancho
User
Beiträge: 3
Registriert: Freitag 1. Februar 2008, 16:04

BlackJack hat geschrieben:Das ganze kompakter und robuster: http://paste.pocoo.org/show/25116/
wow, danke für die Infos. Ich sehe mir gerade die Version von Dir an und versuche zu verstehen was da passiert. Mit Python 2.5.1 unter WinXP läuft der Code bei mir nicht:
Traceback (most recent call last):
File "C:/Dokumente und Einstellungen/pancho/Desktop/pl2/pl2.py", line 69, in <module>
main()
File "C:/Dokumente und Einstellungen/pancho/Desktop/pl2/pl2.py", line 63, in main
pls_file = open(os.path.join(base_dir, genre, filename), 'w')
IOError: [Errno 2] No such file or directory: 'tmp\\Alle\\-= HOT 108 JAMZ =- 1 FOR HIP HOP - 128K HD * CONNECT FROM OUR WEBSITE wwwhot108com.pls'
Was macht class Bunch(object) und warum brauche ich eine Klasse?

Aber Du hast recht, wenn die mal was ändern dann fliegt mir mein Konstrukt schnell um die Ohren.
BlackJack

Entweder gibt's `tmp/Alle/` an der Stelle nicht ─ schon nachgeschaut? ─ oder Windows mag das '*' in dem Dateinamen nicht.
pancho
User
Beiträge: 3
Registriert: Freitag 1. Februar 2008, 16:04

Doch den Ordner "Alle" gibt es. Ich habe den * mal mit rausgeglättet, da regt der sich als nächstes über | auf :cry:

Kann man nicht grundsätzlich alles außer a-z und 0-9 sowie blank rausfiltern?
BlackJack

Kann man machen. Entweder mit `re.sub()` oder der `translate()`-Methode auf Zeichenketten.
Antworten