Texte untereinander anzeigen und nicht nebeneinander. Wie?

Code-Stücke können hier veröffentlicht werden.
Antworten
kunim
User
Beiträge: 6
Registriert: Dienstag 12. April 2016, 12:57

Hallo,
mein Anliegen:
ich code gerade ein Plugin (geschrieben in .py).
Problem:
Es sollen gewisse Sachen untereinander angezeigt werden und nicht nebeneinander.
Habe es mit print und andere befehle versucht. Aber alles klappt irgend wie nicht.

Hier mal der Code:

Code: Alles auswählen

def createUserBouquetFile(self, catName, fileType):
		ret = 0
		newChannelList = []
		newChannelList.append('#Text1 ')
		for x in self.xmlList:
			if x[self.LIST_CAT] == catName and x[self.LIST_TYPE] == fileType:
				newChannelList.append('#Text2' % (quote(x[self.LIST_URL]), quote(x[self.LIST_NAME])))
				ret += 1
#Text1 und #Text2 sollen untereinander erscheinen. In diesem Fall (code oben) wird es nebeneinander angezeigt.

Wie löst Ihr sowas?
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@kunim: das was Du da zeigst ist eine Funktion, die gar nichts anzeigt und nichts zurückgibt. Das hätte man auch kürzer als:

Code: Alles auswählen

def createUserBouquetFile(self, catName, fileType):
    pass
schreiben können.
BlackJack

@kunim: Entweder ein ``print`` pro Element, oder Du musst die Zeichenketten in der Liste mit dem Zeilenumbruchzeichen ('\n') zu einer Zeichenkette zusammenfügen, mittels der `join()`-Methode auf Zeichenketten.

Die Namensschreibweise entspricht übrigens nicht dem Style Guide for Python Code. Und konkrete Grunddatentypen wie `list` haben nichts in Namen verloren. Ebenfalls überflüssig ist der `new`-Präfix. `newChannelList` würde also eher `channels` heissen. Falls `catName` nicht der Name einer Katze sein soll, wäre es sinnvoll `cat` auszuschreiben und `category_name` daraus zu machen. `x` und `ret` sind ganz grundsätzlich keine guten Namen. `ret` wird zudem überhaupt nicht verwendet.
BlackJack

@kunim: Ergänzend zu Sirius3: Eine Methode die *so* heisst sollte auch weder etwas anzeigen noch etwas zurückgeben, sondern eine Datei erzeugen. Oder halt anders heissen. :-)
kunim
User
Beiträge: 6
Registriert: Dienstag 12. April 2016, 12:57

Hi jungs,
@Sirius3
was macht das "pass"?
Kann ich es bei mir anwenden?

es stimmt. Es ist eine Funktion. Es holt aus einer xml Datei die notwendigen Daten und erzeugt eine andere neue Datei z.B. mit der endung ".tv". Nach der erzeugung wird es Automatisch in den Ordner verschoben wo es hin soll.
Inhalt vom Neu erzeugten Datei wird Automatisch angepasst, so das die Datei mit der endung .tv, sagen wir bei KODI früher XBMC gelesen werden kann.
hier der Code, wo die Infos für das Neu erzeugte Datei geholt werden:

Code: Alles auswählen

def readMainXml(self):
		xmlnode = []

		url = self.URL_BASE + 'testkodi.xml'
		lines = self.wgetUrl(url)
		if lines == '':
			return
		xmlnode = xml.parseString(lines)

		self.xmlFiles = []
		tmp = xmlnode.getElementsByTagName("xmlfile")
		for i in range(len(tmp)):
			name = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName("name")[0].childNodes))
			cat = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName("descr")[0].childNodes))
			self.xmlFiles.append((name, cat))

	def readChannelXml(self, tmpList, fileName):
		xmlnode = []

		url = self.URL_BASE + fileName + '.xml'
		lines = self.wgetUrl(url)
		if lines == '':
			return
		xmlnode = xml.parseString(lines)
Das Problem:
Da alles nebeneinander ist, Funktioniert die Wiedergabe nicht.
Ändere ich die Neu erzeugte Datei (nur eine einzige Zeile, sprich einmal auf Enter klicken) und es speichere, funktioniert alles.

@BlackJack:
Ich vesuche es mal.
wobei ich erst herausfinden muss, was join() ist und wie genau was gemacht werden muss, damit es fuktioniert.
Also, wenn du oder Ihr mir einen beispiel zeigen könnt :)
BlackJack

@kunim: Wenn Du wissen willst was ein Schlüsselwort macht, dann schlag das doch einfach in der Python-Dokumentation nach. Auf fast jeder Seite ist oben rechts ein Link zum Index, da dann `p` anklicken, nach ``pass`` suchen, und dem Link folgen: The pass statement. Das Funktioniert nicht nur für Schlüsselworte sondern auch für Module, Klassen, und Funktionen aus der Python-Standardbibliothek.

Das ist keine Funktion sondern eine Methode. Wenn ich mir die Methoden so anschaue, frage ich mich allerdings, ob es nicht besser Funktionen wären. Das sieht alles eher gruselig aus, weil das kein Python-Programmierer geschrieben hat. Das sieht mehr nach Java aus das jemand in Python-Syntax gepresst hat. Die Namensschreibweise, „anti pattern“ wie ``for i in range(len(sequence)):``, die DOM-API für XML statt die `ElementTree`-API, das alles in einer Klasse steckt.

Beispiele für Zeichenkettenoperationen sollten sich im Tutorial in der Python-Dokumentation finden lassen. Eine Beschreibung was die `join()`-Methode auf Zeichenketten macht kann wie beschrieben in der Dokumentation finden.
kunim
User
Beiträge: 6
Registriert: Dienstag 12. April 2016, 12:57

Uiii, da kann ich echt nicht weiterhelfen, in welcher kombination es geschrieben ist.
Aber ich wollte nur Linux bzw Python lernen.
So ein dreck. War mein Ansatz die ganzen monate doch nicht ganz richtig.

Werde gleich mal anfangen weiter zu Coden. Schauen ob die neuen Infos mir helfen werden.

Was anderes:
Meinst du mit DOM-API für XML = xml.dom.minidom as xml ?

weil als import ist, xml.dom.minidom as xml angegeben im plugin.py
also
import xml.dom.minidom as xml

Ich denke Du hast recht. Es ist in einer Kombisprache geschrieben.
Verdamt

Ich werde mir einen neuen plugin.py anlegen.
Und schritt für schritt versuchen alles in Python zu schreiben.

Neuer test.py als Testzweck. Soll nicht mit xml arbeiten.
Als Testzweck soll es nur eine x beliebige + mit einer x beliebige endung, eine Datei downloaden und in einem bestimmten Ordner einfügen.
Wie würde der Code nur für Python lauten?
Oder mit welchen Schlüsselwörtern sollte ich die Python-Dokumentation absuchen?
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@kunim: da ich KODI nicht kenne, weiß ich nicht, ob diese Plugins viele Funktionen direkt von KODI benutzen müssen, oder ob der Plugin-Entwickler den Du da als Schablone benutzt, eigentlich Java-Entwickler ist. An Deinem Code-Beispiel sehe ich auch nicht, wo etwas in eine Datei geschrieben wird, vielleicht solltest Du den Teil zeigen, damit wir Dir helfen können. Hilfreich wäre dann auch ein Beispiel, wie diese Datei zum Schluß aussehen soll.

Mit der ElementTree-API von lxml könnte Deine Methode ungefähr so aussehen:

Code: Alles auswählen

def readMainXml(self):
      doc = ET.parse(self.URL_BASE + 'testkodi.xml')
      self.xmlFiles = [(x.findtext("name").strip(), x.findtext("descr").strip())
          for x in doc.findall(".//xmlfile")]
BlackJack

@kunim: Es ist schon Python, aber halt kein idiomatisches Python wie das ein Python-Programmierer schreiben würde, sondern es sieht aus wie Python das von einem Java-Programmierer geschrieben wurde.

Das Document Object Model (DOM)- ist vom W3C Ende der Neunziger als abstrakte, eigentlich programmiersprachenunabhängige Spezifikation für den programmatischen Zugriff auf XML (und HTML) entworfen wurden. Die beiden konkreten Sprachanbindungen in der Spezifikation, neben der formalen Schnittstellenbeschreibung, waren Java und JavaScript. Und es sieht halt sehr nach einer typischen Java-API aus. Da es sprachunabhängig sein soll, kann man natürlich auch keine Besonderheiten von irgendwelchen konkreten Programmiersprachen in der Spezifikation verwenden, also zum Beispiel iterierbare Objekte, spezielle Syntax und Operatorüberladung, weil das nicht alle Programmiersprachen haben. Als das alles neu war, hat auch die Python-Standardbibliothek so eine Anbindung bekommen, welche diese DOM-API umsetzt. Mittlerweile gibt es aber auch die `ElementTree`-API in der Standardbibliothek, die wesentlich ”pythonischer” ist.

Sogar in Java würde ich heute nicht mehr die DOM-API verwenden sondern etwas das besser auf Java zugeschnitten ist, wie JDOM, oder was es einfacher macht XML auf Objekte (und umgekehrt) abzubilden, wie XStream.

Und bei JavaScript hat sich die jQuery-API durchgesetzt. Die DOM-API ist irgendwie so letztes Jahrtausend. ;-)

Was bedeutet „Datei downloaden“? Über HTTP? Das würde ich mit der `requests`-Bibliothek machen.
kunim
User
Beiträge: 6
Registriert: Dienstag 12. April 2016, 12:57

@Sirus3 und BlackJack,
also im plugin wird selbst pass verwendet. Setze ich dieses pass ein, passiert entweder garnichts oder manchmal auch funktioniert das Plugin garnicht, wenn ich pass an einer richtig falschen stelle setze. Wie neben einem klammer.
Entferne ich pass, fuktioniert es wieder.
Ich habe dieses pass, wirklich an jede stelle reingepackt. Seit gestern bis heute. Und sehe. Es fuktioniert einfach nicht.
pass einfügen, speichern, hochladen, Hardware neu starten, alles testen, dann wieder pass wo anders einfügen und das ganze Spiel von neuem.
Und habe wirklich dieses pass, an jeder stelle ausprobiert. Nicht nur hinter if def usw oder unter dif if class usw. Ich meine an jeder beliebigen stelle. Bestimmt 100 mal Vorgang wiederholt :oops:
Das war alles so eine viese Zeitverschwendung :K

Ehrlich. Hardware ist seit gestern von heut um 30 Jahre geältert.
Wie dem auch sei.

Aus reiner neugier und aus reiner ärgeniss :oops:
Könntet Ihr das lösen.
Von mir aus braucht Ihr mir auch kein Code zeigen. Würde mich nur Interessieren ob es mit pass gehen würde oder nicht :shock:
Zudem habe ich zeilen kopiert und eingefügt, aber nichts tut sich. Verändert und so. Passiert auch nichts. Entweder passierte garnichts. Sprich plugin funktionierte. Aber was ich neu eingefügt habe, hatte kein effekt.
Oder das Plugin funktionierte nicht. Zeile entfernt. Alles wieder ok gewehsen. usw.

@Black Jack:
Mit Download ist gemeint.
Also stelle dir vor. Mein plugin im Fernseher.
Ich denke du bist ein kleiner Profi und evt. Sirius3 auch (klein, ironie ende), erkennst bestimmt was das Code macht.
Mit Download ist gemeint.
Im Fernseher (unter Einstellungen) hat man ein Button (sagen wir namens "Stream Update". Klickt man auf dieses Button, wird eine Datei mit der Endung .m3u oder was anderes, z.B in den Ordner DIR_ENIGMA2 = '/etc/KodiDirect/m3u/' von einer URL automatisch gedownloadet bzw aktualliseriert.
Das wars :)
Und skin, buttons etc. Ist alles schon vorhanden. Plugin fuktioniert ja.
Nur die ausgabe ist falsch. Nebeneinander. Sollte aber untereinander.
Oder. Mir ist lieber. Das ganze xml halt weg. Keine umwandlung. Die Datei was sagen wir unter http://www.xyz.de/test.m3u befindet, wird einfach in den Ordner DIR_ENIGMA2 = '/etc/KodiDirect/m3u/' mit einem klick auf das Button, automatisch rüber kopiert. Ohne umwandlung.
Reicht es in meinem Fall, wenn ich mich in `requests`-Bibliothek einarbeite oder gehört in meinem Fall noch mehr dazu?
Oder.
Einer von euch macht was für mich fertig. Und es kann alles so dargestellt werden, das Ihr der Coder (mit name usw) und ich der Pfleger bin.
Nur wenn Ihr das wollt.
Ansonsten, muss ich wohl oder übel einiges lernen, damit es funktioniert wie alles beschrieben. Eigentlich will ich ja kein Coder werden :). Nur bisschen wissen was zusammen gehört. Inzwischen kann ich schon eine Struktur erkennen. Aufbau und so. Also war nicht alles eine Zeitverschwendung. Durch euch habe ich noch mehr verstanden. Passt schon alles. Soll es kommen wie es soll :K
Und hier der ganze Code vom plugin:

Code: Alles auswählen

from Plugins.Plugin import PluginDescriptor
from Screens.Screen import Screen
from Screens.MessageBox import MessageBox
from Components.SelectionList import SelectionList
from Components.Sources.StaticText import StaticText
from Components.Label import Label
from Components.ActionMap import ActionMap
import xml.dom.minidom as xml
from urllib import quote
from urllib2 import Request, URLError, urlopen
from httplib import HTTPException
from enigma import eDVBDB

class LiveStreamingLinks(Screen):
	LIST_NAME = 0
	LIST_CAT = 1
	LIST_TYPE = 2
	LIST_URL = 3

	LEVEL_FILES = 0
	LEVEL_XML = 1

	DIR_ENIGMA2 = '/etc/KodiDirect/m3u/'
	URL_BASE = 'http://xx.de/zz/'

	skin = """
	<screen position="c-300,c-210" size="600,420" title="">
		<widget name="list" position="10,10" size="e-20,205" scrollbarMode="showOnDemand" />
		<widget source="info" render="Label" position="10,215" size="e-20,200" halign="center" valign="top" font="Regular;17" />
		<ePixmap pixmap="skin_default/buttons/red.png" position="c-150,e-45" size="140,40" alphatest="on" />
		<ePixmap pixmap="skin_default/buttons/green.png" position="c-0,e-45" size="140,40" alphatest="on" />
		<widget source="key_red" render="Label" position="c-150,e-45" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
		<widget source="key_green" render="Label" position="c-0,e-45" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
	</screen>"""

	def __init__(self, session):
		self.skin = LiveStreamingLinks.skin
		Screen.__init__(self, session)
		self["key_red"] = StaticText(_("Cancel"))
		self["key_green"] = StaticText(_("Download"))
		self["actions"] = ActionMap(["SetupActions", "ColorActions"],
		{
			"ok": self.keyOk,
			"save": self.keyGo,
			"cancel": self.keyCancel,
			"green": self.keyGo,
			"red": self.keyCancel,
		}, -2)
		self.list = SelectionList()
		self["list"] = self.list
		self["info"] = StaticText("")

		self.doExit = False
		self.level = self.LEVEL_FILES
		self.subMenuName = ''
		self.subMenuDescrName = ''
		self.xmlFiles = []
		self.xmlCategories = []
		self.lastchanged = ''
		self.lastchanges = ''
		self.onLayoutFinish.append(self.createTopMenu)

	def initSelectionList(self):
		list = []
		self.list.setList(list)

	def createTopMenu(self):
		self.setTitle(_("Hier kommt eine kurze beschreibung rein"))
		self.initSelectionList()
		self.subMenuName = ''
		self.subMenuDescrName = ''
		self.level = self.LEVEL_FILES
		self.readMainXml()
		count = 0
		for x in self.xmlFiles:
			self.list.addSelection(x[self.LIST_CAT], x[self.LIST_NAME], count, False)
			count += 1
		self["Hier kommt eine kurze beschreibung rein"].setText("")

	def readXmlSubFile(self, fileName, descrName):
		self.initSelectionList()
		self.xmlList = []
		self.subMenuName = fileName
		self.subMenuDescrName = descrName
		self.level = self.LEVEL_XML
		self.readChannelXml(self.xmlList, fileName)
		tmp = _('Hier kommt eine kurze beschreibung rein') + ': %s\n\n%s' % (self.lastchanged, self.lastchanges)
		self["Hier kommt eine kurze beschreibung rein"].setText(tmp)
		count = 0
		for x in self.xmlCategories:
			self.list.addSelection(x, x, count, False)
			count += 1

	def keyOk(self):
		if self.level == self.LEVEL_FILES:
			self.keyGo()
		elif self.level == self.LEVEL_XML:
			if len(self.xmlCategories) > 0:
				self.list.toggleSelection()

	def keyGo(self):
		if self.level == self.LEVEL_FILES:
			self.readXmlSubFile(self.xmlFiles[self.list.getSelectedIndex()][self.LIST_NAME], self.xmlFiles[self.list.getSelectedIndex()][self.LIST_CAT])
			return

		self.doExit = False
		tmpList = []
		tmpList = self.list.getSelectionsList()
		if len(tmpList) == 0:
			self.session.openWithCallback(self.infoCallback, MessageBox, _("Hier kommt eine kurze beschreibung rein"), MessageBox.TYPE_INFO)
			return

		self.xmlList.sort()

		tvFileList = []
		radioFileList = []
		for item in tmpList:
			if self.createUserBouquetFile(item[1], 'm3u') > 0:
				tvFileList.append((item[1]))
			if self.createUserBouquetFile(item[1], 'radio') > 0:
				radioFileList.append((item[1]))

		if len(tvFileList) > 0:
			self.createBouquetFile(tvFileList, 'm3u')
		if len(radioFileList) > 0:
			self.createBouquetFile(radioFileList, 'radio')

		db = eDVBDB.getInstance()
		db.reloadServicelist()
		db.reloadBouquets()
		self.doExit = True
		self.session.openWithCallback(self.infoCallback, MessageBox, _("AHier kommt eine kurze beschreibung rein"), MessageBox.TYPE_INFO)

	def infoCallback(self, confirmed):
		if self.doExit:
			self.createTopMenu()

	def createBouquetFile(self, catNames, fileType):
		newFileContent = ''
		fileContent = self.readFile(self.DIR_ENIGMA2 + 'bouquets.' + fileType)

		if fileContent == '':
			return

		for x in fileContent:
			x = self.stripLineEndings(x)
			isFound = False
			for cat in catNames:
				if '\"test.stream' + self.convertToFileName(self.subMenuName + cat) in x:
					isFound = True
					break
			if not isFound:
				newFileContent += x + '\n'

		for cat in catNames:
			newFileContent += '#EXTM3U,$MODE=IPTV FROM BOUQUET \"test.stream' + self.convertToFileName(self.subMenuName + cat) + '.' + fileType +'\" ORDER BY bouquet\n'

		fp = open(self.DIR_ENIGMA2 + 'bouquets.' + fileType, 'w')
		fp.write(newFileContent)
		fp.close()

	def createUserBouquetFile(self, catName, fileType):
		ret = 0
		newChannelList = []
		newChannelList.append('#EXTM3U,$MODE=IPTV')
		for x in self.xmlList:
			if x[self.LIST_CAT] == catName and x[self.LIST_TYPE] == fileType:
				newChannelList.append(' #EXTINF:-1 group-title="%s"%s' % (quote(x[self.LIST_NAME]), quote(x[self.LIST_URL])))
				ret += 1
				
		if ret > 0:
			fp = open(self.DIR_ENIGMA2 + 'test.stream' + self.convertToFileName(self.subMenuName + catName) + '.' + fileType, 'w')
			for x in newChannelList:
				fp.write(x + '\n')
			fp.close()
		return ret

	def keyCancel(self):
		if self.level == self.LEVEL_FILES:
			self.close()
		elif self.level == self.LEVEL_XML:
			self.createTopMenu()

	def wgetUrl(self, target):
		std_headers = {
			'User-Agent': 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100627 Firefox/3.6.6',
			'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
			'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
			'Accept-Language': 'en-us,en;q=0.5',
		}
		outtxt = Request(target, None, std_headers)
		try:
			outtxt = urlopen(target).read()
		except (URLError, HTTPException), err:
			return ''
		return outtxt

	def readFile(self, name):
		try:
			lines = open(name).readlines()
			return lines
		except:
			return ''
			pass

	def convertToFileName(self, name):
		return name.replace(' ', '_')

	def stripLineEndings(self, buf):
		return buf.strip('\r\n').strip('\n').strip('\t')

	def getText(self, nodelist):
		rc = []
		for node in nodelist:
			if node.nodeType == node.TEXT_NODE:
				rc.append(node.data)
			return str(''.join(rc))

	def readMainXml(self):
		xmlnode = []

		url = self.URL_BASE + 'testkodi.xml'
		lines = self.wgetUrl(url)
		if lines == '':
			return
		xmlnode = xml.parseString(lines)

		self.xmlFiles = []
		tmp = xmlnode.getElementsByTagName("xmlfile")
		for i in range(len(tmp)):
			name = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName("name")[0].childNodes))
			cat = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName("descr")[0].childNodes))
			self.xmlFiles.append((name, cat))

	def readChannelXml(self, tmpList, fileName):
		xmlnode = []

		url = self.URL_BASE + fileName + '.xml'
		lines = self.wgetUrl(url)
		if lines == '':
			return
		xmlnode = xml.parseString(lines)

		self.xmlCategories = []
		tmp = xmlnode.getElementsByTagName("stream")
		for i in range(len(tmp)):
			name = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName("name")[0].childNodes))
			url = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName("url")[0].childNodes))
			cat = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName("cat")[0].childNodes))
			type = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName("type")[0].childNodes))
			tmpList.append((name, cat, type, url))

			foundCat = False
			for x in self.xmlCategories:
				if x == cat:
					foundCat = True
					break
			if not foundCat:
				self.xmlCategories.append((cat))

		tmp = xmlnode.getElementsByTagName("Hier kommt eine kurze beschreibung rein")
		if len(tmp) == 1:
			self.lastchanged = self.stripLineEndings(self.getText(tmp[0].getElementsByTagName("lastchange")[0].childNodes))
			self.lastchanges = self.stripLineEndings(self.getText(tmp[0].getElementsByTagName("description")[0].childNodes))


def main(session, **kwargs):
	session.open(LiveStreamingLinks)

def Plugins(**kwargs):
	return [PluginDescriptor(name = _("Hier kommt eine kurze beschreibung rein"), description = _("Hier kommt eine kurze beschreibung rein"), where = PluginDescriptor.WHERE_EXTENSIONSMENU, fnc = main)]
BlackJack

@kunim: Ähm, ich habe doch die Dokumentation von der ``pass``-Anweisung verlinkt. Diese Anweisung macht ganz einfach gar nichts. Manchmal ist das aus syntaktischen Gründen notwendig eine Anweisung zu schreiben obwohl an der Stelle im Programmfluss nichts passieren soll. Sirius3 hat den gesamten Inhalt der Methode durch ``pass`` ersetzt weil der Inhalt den Du da hattest, auch nichts gemacht hat. Also der hat schon etwas gemacht, aber da das letztendlich keinen bemerkbaren Effekt hatte ausser Rechenzeit und Speicher zu verbrauchen, hat er es einfach durch ”nichts” ersetzt. Du müsstest dieses ``pass`` dann durch den Code ersetzen der tatsächlich etwas sinnvolles macht, was am besten auch zum Namen der Methode passt.

Und ich glaube ich sollte langsam mal mit den wechselnden Signaturen unter meinen Beiträgen aufhören und da ein für allemal ”PROGRAMMIEREN DURCH RATEN FUNKTIONIERT NICHT!!!1!elf!!1!” reinschreiben. :roll:

Mit dem Plugin-Quelltext würde ich meinen Namen lieber nicht in Verbindung gebracht sehen. Den müsste man dafür wahrscheinlich komplett neu schreiben. :twisted: Es bliebe schon deswegen fast keine Zeile unangetastet weil drei statt vier Leerzeichen für die Einrückung verwendet wurden. Dann die ganzen Namen die in der Schreibweise nicht dem Style Guide for Python Code entsprechen, Bibliotheken die man nicht verwenden möchte, die KODI-Bibliothek die offenbar ein Modul pro Klasse verwendet, die Monsterklasse wo einiges in Methoden steckt was semantisch gar keine Methode ist, und noch ein paar andere Sachen.
kunim
User
Beiträge: 6
Registriert: Dienstag 12. April 2016, 12:57

So, hab einiges gelesen.
Neue ansätze für das Plugin im Kopf sind entstanden.
Ich werde versuchen etwas neues auf die Beine zu stellen. Und jetzt verstehe ich was Ihr meint. Es stimmt. Es wandelt nichts um. Es holt nur Informationen aus der Datei x und fügt es in eine Neu erstellte Datei. Das ist alles.
Ich glaube dir BlackJack, das man es viel besser machen kann. Daher gehe ich einen neuen Weg. Werde schritt für schritt versuchen was auf die Beine zu stellen. Sorry das ich dir so ein Deal vorgeschlagen habe. Aber jetzt erst erkenne ich, das dieser Code nicht das richtige ist, für einen Coder der sein Namen nicht belasten will :wink:
Wie gesagt. Wenn Du oder Sirus3 oder Ihr beide zusammen (yeah), was Zaubern würdet, wäre das ein Traum :D

Signatur:
”PROGRAMMIEREN DURCH RATEN FUNKTIONIERT NICHT!!!1!elf!!1!”
Würde glaube ich auch nicht Helfen :K
Es gibt immer welche die es versuchen werden. Wie beim Perpetuum Mobile. Heute gibt es immer noch welche die sagen. Es geht. Was denkt ihr? Geht ein Pepetuum Mobile :mrgreen:
Nein. Nur ein scherz. Nicht vom Thema abweichen.
Zu mir lieber zurück.

Kann ich so anfangen? request habe ich nicht eingefügt weil es schon da war/ist (from urllib2 import Request, URLError, urlopen).

Code: Alles auswählen

from Plugins.Plugin import PluginDescriptor
from Screens.Screen import Screen
from Screens.MessageBox import MessageBox
from Components.Sources.StaticText import StaticText
from Components.Label import Label
from Components.ActionMap import ActionMap
from urllib2 import Request, URLError, urlopen
from httplib import HTTPException
from enigma import eDVBDB

class LiveStreamingLinks(Screen):
   LIST_NAME = 0
   LIST_CAT = 1
   LIST_TYPE = 2
   LIST_URL = 3

   DIR_ENIGMA2 = '/etc/KodiDirect/m3u/'
   URL_BASE = 'http://xx.de/zz/'

   skin = """
   <screen position="c-300,c-210" size="600,420" title="">
      <widget name="list" position="10,10" size="e-20,205" scrollbarMode="showOnDemand" />
      <widget source="info" render="Label" position="10,215" size="e-20,200" halign="center" valign="top" font="Regular;17" />
      <ePixmap pixmap="skin_default/buttons/red.png" position="c-150,e-45" size="140,40" alphatest="on" />
      <ePixmap pixmap="skin_default/buttons/green.png" position="c-0,e-45" size="140,40" alphatest="on" />
      <widget source="key_red" render="Label" position="c-150,e-45" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
      <widget source="key_green" render="Label" position="c-0,e-45" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
   </screen>"""

   def __init__(self, session):
      self.skin = LiveStreamingLinks.skin
      Screen.__init__(self, session)
      self["key_red"] = StaticText(_("Cancel"))
      self["key_green"] = StaticText(_("Download"))
      self["actions"] = ActionMap(["SetupActions", "ColorActions"],
      {
         "ok": self.keyOk,
         "save": self.keyGo,
         "cancel": self.keyCancel,
         "green": self.keyGo,
         "red": self.keyCancel,
      }, -2)
kunim
User
Beiträge: 6
Registriert: Dienstag 12. April 2016, 12:57

Ich konnte irgendwie mein Beitrag nicht editieren.
Auf jeden Fall, Code Teil 2:
Kann ich so weiter fortfahren oder passt schon jetzt irgendwas nicht?

Code: Alles auswählen

from Plugins.Plugin import PluginDescriptor
from Screens.Screen import Screen
from Components.Sources.StaticText import StaticText
from Components.Label import Label
from Components.ActionMap import ActionMap
from urllib2 import Request, urlopen, URLError, HTTPError
from httplib import HTTPException

   skin = """
   <screen position="c-300,c-210" size="600,420" title="">
      <widget name="list" position="10,10" size="e-20,205" scrollbarMode="showOnDemand" />
      <widget source="info" render="Label" position="10,215" size="e-20,200" halign="center" valign="top" font="Regular;17" />
      <ePixmap pixmap="skin_default/buttons/red.png" position="c-150,e-45" size="140,40" alphatest="on" />
      <ePixmap pixmap="skin_default/buttons/green.png" position="c-0,e-45" size="140,40" alphatest="on" />
      <widget source="key_red" render="Label" position="c-150,e-45" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
      <widget source="key_green" render="Label" position="c-0,e-45" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
   </screen>"""

   def __init__(self, session):
      self.skin = LiveStreamingLinks.skin
      Screen.__init__(self, session)
      self["key_red"] = StaticText(_("Cancel"))
      self["key_green"] = StaticText(_("Download"))
      self["actions"] = ActionMap(["SetupActions", "ColorActions"],
      {
         "ok": self.keyOk,
         "save": self.keyGo,
         "cancel": self.keyCancel,
         "green": self.keyGo,
         "red": self.keyCancel,
      }, -2)
      
      def stealStuff(file_name,file_mode,base_url):
	
	url = base_url + file_name
	req = Request(url)
	
		f = urlopen(req)
		print "downloading " + url
		
		local_file = open(file_name, "w" + file_mode)
		local_file.write(f.read())
		local_file.close()
		
	except HTTPError, e:
		print "HTTP Error:",e.code , url
	except URLError, e:
		print "URL Error:",e.reason , url


        base_url = 'http://www.test.de/'
	file_name =  str(index) + ".m3u"
Antworten