Vorhandener Code - Anpassungen

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
skulldred
User
Beiträge: 1
Registriert: Sonntag 26. Dezember 2010, 15:15

Hallo zusammen

ehrlich gesagt trau ich mich fast nicht fragen. Da es schon fast etwas frech ist von wegen erster Post usw.
Dennoch erlaube ich mir hier nun folgende Frage zu stellen:

Es geht um ein Script das bereits besteht und funktioniert. Leider durch schlechte Programmierung nicht sehr brauchbar ist.
Das Script saugt die Bouqets von der Dreambox und zeigt diese samt EPG in einer Liste in XBMC an. Soweit so gut, nur wird der ausgewählte
Eintrag z.B. nicht markiert. Man hat also einfach nen schwarzen Hintergrund, die auflistung in weiss und das wars...

Wenn nun jemand das so einrichten könnte das es wie folgt aussieht:
Hintergrund Weiss
Text von Sendername Schwarz
Text von EPG Grau
EPG unter dem Sender Namen und am besten nach EPG eine Leerzeile. Anschliessend nächster Sender
Sender markiert anzeigen durch einen Balken im Hintergrund

Ich weiss das es etwas viel verlangt ist. Leider schreien alle nach anpassungen in der Community aber keiner der Python kann will es machen.
Ihr würdet uns einen riesen gefallen machen.

Man kann auch über entlöhnung verhandeln.

Es hat für das Script mehrere Dateien, aber ich denke das wird das wichtige Stück Code sein:

Code: Alles auswählen

# Enigma2

import urllib2, re
import xbmc, xbmcgui

try:
    Emulating = xbmcgui.Emulating
except:
    Emulating = False

ACTION_PARENT_DIR      =  9
ACTION_PREVIOUS_MENU   = 10

BOUQUETNAMESPATTERN = re.compile('<e2servicename>(.*?)</e2servicename>')
BOUQUETIDSPATTERN = re.compile('<e2servicereference>(.*?)</e2servicereference>')
CHANNELNAMESPATTERN = re.compile('<e2eventservicename>(.*?)</e2eventservicename>')
CHANNELIDSPATTERN = re.compile('<e2eventservicereference>(.*?)</e2eventservicereference>')
EVENTNAMESPATTERN = re.compile('<e2eventtitle>(.*?)</e2eventtitle>')
STREAMURLSPATTERN = re.compile('(http://.*?)\n')

SPACECLEANER = re.compile(' ')
QUOTECLEANER = re.compile('"')

DREAMBOXURL = "http://192.168.0.55"
BOUQUETLISTURL = DREAMBOXURL+"/web/getservices"
CHANNELLISTURL = DREAMBOXURL+"/web/epgnow?bRef="
M3USTREAMURL = DREAMBOXURL+"/web/stream.m3u?ref="
CHANNELSWITCH = DREAMBOXURL+"/web/zap?sRef="

BOUQUETNAMES = []
BOUQUETNAME = ''
BOUQUETIDS = []
BOUQUETID = ''
CHANNELNAMES = []
CHANNELNAME = ''
CHANNELIDS = []
CHANNELID = ''
EVENTNAMES = []
EVENTNAME = ''
BOUQUETSLOADED = 0
CHANNELSLOADED = 0
MENULEVEL = 0


class Main(xbmcgui.Window):

    def __init__(self):
        if Emulating:
            xbmcgui.Window.__init__(self)
        self.setCoordinateResolution(4)
        self.lstMain = xbmcgui.ControlList(100,100,350,350)
        self.lblStatus = xbmcgui.ControlLabel(100,20,500,50,'')
        self.addControl(self.lblStatus)
        self.addControl(self.lstMain)
        self.ShowBouquetList()
        
    def onAction(self, action):
        if action == ACTION_PREVIOUS_MENU:            
            self.close()
        if action == ACTION_PARENT_DIR:
            if MENULEVEL == 0:
                self.close()
                return
            if MENULEVEL == 1:
                self.ShowBouquetList()
                return

    def onControl(self, control):
        global BOUQUETID, BOUQUETNAME, CHANNELID, CHANNELNAME
        if control == self.lstMain:
            if MENULEVEL == 0:    
                BOUQUETID = QUOTECLEANER.sub('%22',SPACECLEANER.sub('%20',BOUQUETIDS[self.lstMain.getSelectedPosition()]))
                BOUQUETNAME = BOUQUETNAMES[self.lstMain.getSelectedPosition()]
                self.ShowChannelList()
                return
            if MENULEVEL == 1:
                CHANNELID = CHANNELIDS[self.lstMain.getSelectedPosition()]
                CHANNELNAME = CHANNELNAMES[self.lstMain.getSelectedPosition()]
                EVENTNAME = EVENTNAMES[self.lstMain.getSelectedPosition()]
                self.PlayChannel()
                return

    def ShowBouquetList(self):
        global BOUQUETIDS, BOUQUETNAMES, MENULEVEL, BOUQUETSLOADED, CHANNELSLOADED
        MENULEVEL = 0
        if BOUQUETSLOADED == 0:
            progress = xbmcgui.DialogProgress()
            progress.create('Enigma2','Retrieving Bouquet List')
            progress.update(10)
            try:
                request = urllib2.Request(BOUQUETLISTURL)
                socket = urllib2.urlopen(request)
                progress.update(30)
                xml = socket.read()
                progress.update(60)
                socket.close()
                BOUQUETNAMES = re.findall(BOUQUETNAMESPATTERN,xml)
                progress.update(70)
                BOUQUETIDS = re.findall(BOUQUETIDSPATTERN,xml)
                progress.update(90)
            except:
                dialog = xbmcgui.Dialog()
                dialog.ok('Enigma2','Could not retrieve bouquet list.')
            progress.close()
        self.lblStatus.setLabel('Enigma2 - Bouquet List')
        self.lstMain.reset()
        for BOUQUETNAME in BOUQUETNAMES:
            self.lstMain.addItem(BOUQUETNAME)
        self.setFocus(self.lstMain)
        BOUQUETSLOADED = 1
        CHANNELSLOADED = 0

    def ShowChannelList(self):
        global MENULEVEL, CHANNELIDS, CHANNELNAMES, EVENTNAMES, CHANNELSLOADED
        MENULEVEL = 1
        self.lblStatus.setLabel(BOUQUETNAME)
        if CHANNELSLOADED == 0:
            progress = xbmcgui.DialogProgress()
            progress.create('Enigma2','Retrieving Channel List')
            progress.update(10)
            try:
                request = urllib2.Request(CHANNELLISTURL+BOUQUETID)
                socket = urllib2.urlopen(request)
                progress.update(30)
                xml = socket.read()
                progress.update(60)
                socket.close()
                CHANNELIDS = re.findall(CHANNELIDSPATTERN, xml)
                progress.update(70)
                CHANNELNAMES = re.findall(CHANNELNAMESPATTERN, xml)
                progress.update(80)
                EVENTNAMES = re.findall(EVENTNAMESPATTERN, xml)
                progress.update(90)
            except:
                dialog = xbmcgui.Dialog()
                dialog.ok('Enigma2','Could not retrieve Channel list.')
            progress.close()
        self.lstMain.reset()
        i = 0
        for CHANNELNAME in CHANNELNAMES:
            self.lstMain.addItem(CHANNELNAME+' - '+EVENTNAMES[i])
            i = i + 1
        self.setFocus(self.lstMain)
        CHANNELSLOADED = 1

    def PlayChannel(self):
        try:
            request = urllib2.Request(CHANNELSWITCH+CHANNELID)
            socket = urllib2.urlopen(request)
            socket.close();
            request = urllib2.Request(M3USTREAMURL+CHANNELID)
            socket = urllib2.urlopen(request)
            m3u = socket.read()
            socket.close()
            STREAMURLS = re.findall(STREAMURLSPATTERN,m3u)
        except:
            dialog = xbmcgui.Dialog()
            dialog.ok('Enigma2','Could not retrieve video URL.')
            return
        xbmc.Player().play(STREAMURLS[0])

Display_Main = Main()
Display_Main.doModal()
del Display_Main
Besten Dank SD
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Ohne, dass ich Xbmc kenne:
- werd die globalen Variablen los (alles, wo du 'global' brauchst) - einige kann man problemlos durch Instanz-Variablen ersetzen
- Werd die leeren 'except'-s los
- Versuch dich an PEP8 zu halten (wird nicht überall gehen, aber schreib Variablen nicht GROSS)
- ersetz sowas wie 'lstMain' durch was sinnvolles
- die letzte Zeile ist sinnlos
- die xml-daten lassen sich bestimmt eleganter mit z.B. Elementtree parsen
- für die Bouquets und Channels lässt sich bestimmt 'ne besser lesbare Struktur finden (Bouquet-klasse?)
- es gibt enumerate(), wenn du bei Schleifen 'nen extra Zähler brauchst
- ich glaube, du brauchst nicht überall extra urllib.Request()-objekte - einfach die URL-Strings nehmen geht auch.
- deine *CLEANER-regex kann man durch urllib.quote() (diesmal nicht urllib2)

... dann kann man überlegen, was zu verändern :twisted:

hth, Jörg
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

b.esser-wisser, wie will er denn das machen wenn er kein Python kann?! Das ist doch grade der Sinn des Postings.

@OP: Das wird wahrscheinlich niemand machen wollen, weil der Code ein Spaghettihaufen ist. Ich denke, du hättest mehr Glück, wenn du das Ganze selbst versuchst (und bei Problemen eben hier nachfragst) oder im Offtopic-Forum einen Job ausschreibst, das Skript von neu auf zu schreiben.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Ich hab mir xbmc mal genauer angesehen, die aktuelle Version (10.0, 'Dharma') runtergeladen und dann wollte ich sehen was man mit diesen Skripten machen kann:
  • Xmbc kommt mit Python 2.4 (so nach und nach fällt mir dann doch auf, dass ich erst mit 2.5 in Python eingestiegen bin)
  • Bei Xbmc 10 sind scripts jetzt addons ( ich habe 2-3 Stunden gebraucht diese Wiki-seite zu finden - liegt bestimmt an mir).
    Hier braucht man diese 'addon.xml'-datei, die man aber einfach abkucken kann
  • Die Dokumentation der xbmc-module war leichter zu finden,
  • der Coding-stil ist im xbmc-wiki recht verbreitet
Fazit: ich schreibe noch an einem Nachbau von deinem Script, wird noch ein paar Tage dauern (hab keine Dreambox, aber google findet einige der xml-dateien).

hth, Jörg
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Woa das ist ja teilweise echt abartig. Das sind halt wirklich Scripts im Sinne von Scripts -- hauptsache, es funktioniert.
Antworten