Seite 2 von 4
Re: Abfrage SQlite Datenbank
Verfasst: Freitag 8. April 2016, 19:09
von Sirius3
@sveni_lee: Sqlite3 wandelt ein Datetime-Objekt automatisch in ein passendes Format, das man dann in eine Zahl zum Rechnen verwenden kann:
Falls Runtime also in Minuten ist, selektiert man hier alle noch laufenden Sendungen:
Code: Alles auswählen
cursor.execute("select * from TVShowData where julianday(StartTime) + (Runtime / 24.0 / 60.0) > julianday('now', 'localtime') ")
Re: Abfrage SQlite Datenbank
Verfasst: Freitag 8. April 2016, 19:35
von sveni_lee
hmmm... das ganze sieht jetzt so aus..
Code: Alles auswählen
def refreshWidget(category, offset=0):
conn = sqlite3.connect(SerienPlaner)
cur = conn.cursor()
cur.execute(""" SELECT %s FROM TVShowData WHERE julianday(StartTime) + (RunningTime / 24.0 / 60.0) > julianday('now', 'localtime') ORDER BY StartTime LIMIT 15""" % ','.join(properties))
for idx, data in enumerate(cur, offset):
for field, item in zip(properties, data):
WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), item)
das bringt jetzt keine Fehlermeldung mehr aber auch kein Ergebnis...
Re: Abfrage SQlite Datenbank
Verfasst: Freitag 8. April 2016, 20:02
von sveni_lee
ich habe jetzt mal die zeitberechnung weggelassen, jetzt kommt folgende Fehlermeldung:
Code: Alles auswählen
WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), item)
TypeError: argument "value" for method "setProperty" must be unicode or str
also zeile abgeändert
Code: Alles auswählen
WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), unicode(item))
bringt leider auch kein Ergebnis
Re: Abfrage SQlite Datenbank
Verfasst: Freitag 8. April 2016, 21:45
von sveni_lee
jetzt verste ich gar nichts mehr...
ich hab alles wieder zurückgesetzt wie es vorher war und jetzt kommt gar nichts mehr an...
ich bekomme jetzt keine Daten mehr angezeigt obwohl das schon einmal ging...
Ich weiß nicht mehr wo der Fehler ist... hab ersteinmal wieder alles auf unicode gesetzt und
die datetime Berechnung rausgenommen...
Aber es kommt nichts mehr in Kodi an...
darauf habe ich versucht einen debug einzubauen
Code: Alles auswählen
writeLog('Setting Properties SerienPlaner.%d.%s' % ((idx, field), item), level=xbmc.LOGDEBUG)
kommt aber folgende Fehlermeldung
EDIT:
okay hab einen Fehler gefunden, ich weiß nicht warum aber in meiner properties-Liste hat TVShow gefehlt, dadurch wurden alle Items nicht angezeigt.
Die Berechnung scheint allerdings nicht zu funktionieren...
ich bekomme grad Serien Angezeigt, die um 21:15 begonnen hat und 55min dauern sollte...somit um 22:10 zu ende wäre...
Re: Abfrage SQlite Datenbank
Verfasst: Freitag 8. April 2016, 22:45
von sveni_lee
so, outdated funktioniert jetzt auch...
ich habe noch ein zusätzliches Feld in die Datenbank aufgenommen "starttimestamp" dieser wert besteht aus Datum und Uhrzeit incl. Sekunden, damit funktioniert es dann...
Als nächstes werde ich nun versuchen eine zweite WHERE Variable einzubauen... und Zwar Watchtype, das kann internationale Serie, Klassiker, Deutsche Serie und Soap sein. Vor dem Scrapen wird festgelegt welche categorien gescraped werden sollen, das klappt auch schon.
default werden alle die items aus allen im scraper gewählen Kategorien angezeigt...
Über einen Guiaufruf kann aber auch nur eine Kategorie gezielt ausgewählt werden...
Ich hatte mir das so vorgestellt das beim def aufruf eine der wert für die Kategorie mit übergeben wird...
das sollte doch so machbar sein oder?
Re: Abfrage SQlite Datenbank
Verfasst: Samstag 9. April 2016, 22:59
von sveni_lee
ich habe jetzt noch einen Code zum löschen der outdated TvShows angehangen, damit werden dann auch alle abgelaufenen Sendungen aus der
Datenbank gelöscht.
Code: Alles auswählen
cur.execute("""DELETE FROM TVShowData WHERE julianday(_Starttime) + (_RunningTime / 24.0 / 60.0) < julianday('now', 'localtime')""")
conn.commit()
conn.close()
das funktioniert auch...
nun würde ich gern noch eine zweite Variable bei der Abfrage einbringen, so das man auch die watchtypes wählbar machen kann...
ich hatte es folgender Maßen probiert...
Zum Testen habe habe ich eine category fest forgegeben..
Code: Alles auswählen
cur.execute(""" SELECT %s FROM TVShowData WHERE julianday(_Starttime) + (_RunningTime / 24.0 / 60.0) > julianday('now', 'localtime') AND WatchType = %s ORDER BY StartTime LIMIT 15""" % ','.join(properties), category)
aber ich bekomme eine Fehlermeldung...
Re: Abfrage SQlite Datenbank
Verfasst: Sonntag 10. April 2016, 14:30
von Sirius3
Woher kommen jetzt die Unterstriche bei den ganzen Spaltennamen?
Re: Abfrage SQlite Datenbank
Verfasst: Sonntag 10. April 2016, 20:07
von sveni_lee
das sind die Daten in datetime-Format... habe ich befelfsweise gemacht, da ich WINDOW.setProperty nur unicode oder str. akzeptiert
und für die Berechung der timestamp mit Datum und Uhrzeit besser funktioniert hat...
meine Abfrage habe ich mittlerweileauch abgeändert...
Code: Alles auswählen
conn = sqlite3.connect(SerienPlaner)
cur = conn.cursor()
query = """SELECT %s
FROM TVShowData
WHERE julianday(_Starttime) + (_RunningTime / 24.0 / 60.0) > julianday('now', 'localtime')
%s
ORDER BY StartTime
LIMIT 15"""
if category == __LS__(30116):
filter = ""
parameters = ()
else:
filter = " AND WatchType = ?"
parameters = (category,)
query = query % (','.join(properties), filter)
cur.execute(query, parameters)
for idx, data in enumerate(cur, offset):
for field, item in zip(properties, data):
WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), item)
funktioniert soweit auch schon sehr gut... und ich kann die Abfrage noch um zwei, drei weitere Variablen erweitern...
Nun habe ich meinem Kodi-plugin einige Settings die ich noch umsetzen muss...mal schaun, wie ich damit zurecht komme...
Re: Abfrage SQlite Datenbank
Verfasst: Sonntag 10. April 2016, 20:22
von BlackJack
@sveni_lee: Das wird ja immer schräger. Lass irgendwelche komischen Kennzeichnungen bei Spaltennamen für Datentypen weg und was `WINDOW.setProperty` an Datentypen akzeptiert hat nichts, aber auch gar nichts damit zu tun als welchen Datentyp man Werte im Programm verarbeitet oder in einer Datenbank speichert. Dafür nimmt man die Datentypen die zu den Daten passen und nicht grundsätzlich Zeichenketten weil man das irgendwann mal in dem Format für die Darstellung benötigen könnte. Daten sollten beim betreten des Programms in ein Format gewandelt werden in dem man sie *verarbeiten* kann, also beispielsweise Zahlen wenn es Zahlen sind und Typen aus dem `datetime`-Modul wenn es sich um Zeit- oder Datumsangaben handelt. Und nur für die Ausgabe und auch nur dort kann man dann entsprechende Zeichenketten erstellen, die dem Benutzer angezeigt werden.
Re: Abfrage SQlite Datenbank
Verfasst: Sonntag 10. April 2016, 21:43
von sveni_lee
ja, das ist mir schon klar... diese dinge könne sicher auch noch geändert werden...
Allerdings ist es mein ersres Plugin und ich bin meinem eigendlichen Ziel noch nicht viel näher gekommen.
Bis jetzt habe ich erst einmal versucht das sammeln und verarbeiten der Daten in den Griff zu bekommen...
eventuell würde das auch so gehen:
Code: Alles auswählen
WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), unicode(item))
dann muß ich generell nichts mehr vorher umwandeln.
davon ab ist mein primäres Ziel auf das Einfügen von unzälligen Items in Kodi zu verzichten und den Kontent in eine Programmaufrufzeile
zu packen... dazu nusste ich aber ersteinmal die Daten haben was ja jetzt schon mal funktioniert.
Im endeffekt stell ich mir das so vor:
Code: Alles auswählen
plugincontent.doMainListing(params.get("content_type",[""])[0])
Code: Alles auswählen
def doMainListing(mode=""):
xbmcplugin.setContent(int(sys.argv[1]), 'files')
if mode=="video" or not mode:
if xbmc.getCondVisibility("System.HasAddon(plugin.program.serinplaner)"):
addDirectoryItem(ADDON.getLocalizedString(32055), "plugin://script.skin.helper.service/?action=serienplaner&limit=100")
Und dann kommt der Teilden ich nicht komplett verstehe...
die JSON-Abfrage holt einige Daten aus der Kodi.db, was ich nicht brauche...
ich muß halt irgendwie einen Loop erzeugen, der die entsprechen Properties aus meinem Plugin abholt...
Code: Alles auswählen
def NEXTAIREDTVSHOWS(limit):
count = 0
allItems = []
#get data from next aired script
nextairedTotal = WINDOW.getProperty("NextAired.Total")
if nextairedTotal:
nextairedTotal = int(nextairedTotal)
for count in range(nextairedTotal):
tvshow = WINDOW.getProperty("NextAired.%s.Label"%str(count)).decode("utf-8")
if tvshow:
json_result = getJSON('VideoLibrary.GetTvShows','{ "filter": {"operator":"is", "field":"title", "value":"%s"}, "properties": [ %s ] }' %(tvshow,fields_tvshows))
if len(json_result) > 0:
item = json_result[0]
extraprops = {}
extraprops["airtime"] = WINDOW.getProperty("NextAired.%s.AirTime"%str(count)).decode("utf-8")
extraprops["Path"] = WINDOW.getProperty("NextAired.%s.Path"%str(count)).decode("utf-8")
extraprops["Library"] = WINDOW.getProperty("NextAired.%s.Library"%str(count)).decode("utf-8")
extraprops["Status"] = WINDOW.getProperty("NextAired.%s.Status"%str(count)).decode("utf-8")
extraprops["StatusID"] = WINDOW.getProperty("NextAired.%s.StatusID"%str(count)).decode("utf-8")
extraprops["Network"] = WINDOW.getProperty("NextAired.%s.Network"%str(count)).decode("utf-8")
extraprops["Started"] = WINDOW.getProperty("NextAired.%s.Started"%str(count)).decode("utf-8")
extraprops["Genre"] = WINDOW.getProperty("NextAired.%s.Genre"%str(count)).decode("utf-8")
extraprops["Premiered"] = WINDOW.getProperty("NextAired.%s.Premiered"%str(count)).decode("utf-8")
extraprops["Country"] = WINDOW.getProperty("NextAired.%s.Country"%str(count)).decode("utf-8")
extraprops["Runtime"] = WINDOW.getProperty("NextAired.%s.Runtime"%str(count)).decode("utf-8")
extraprops["Fanart"] = WINDOW.getProperty("NextAired.%s.Fanart"%str(count)).decode("utf-8")
extraprops["Today"] = WINDOW.getProperty("NextAired.%s.Today"%str(count)).decode("utf-8")
extraprops["NextDate"] = WINDOW.getProperty("NextAired.%s.NextDate"%str(count)).decode("utf-8")
extraprops["NextDay"] = WINDOW.getProperty("NextAired.%s.NextDay"%str(count)).decode("utf-8")
extraprops["NextTitle"] = WINDOW.getProperty("NextAired.%s.NextTitle"%str(count)).decode("utf-8")
extraprops["NextNumber"] = WINDOW.getProperty("NextAired.%s.NextNumber"%str(count)).decode("utf-8")
extraprops["NextEpisodeNumber"] = WINDOW.getProperty("NextAired.%s.NextEpisodeNumber"%str(count)).decode("utf-8")
extraprops["NextSeasonNumber"] = WINDOW.getProperty("NextAired.%s.NextSeasonNumber"%str(count)).decode("utf-8")
extraprops["LatestDate"] = WINDOW.getProperty("NextAired.%s.LatestDate"%str(count)).decode("utf-8")
extraprops["LatestDay"] = WINDOW.getProperty("NextAired.%s.LatestDay"%str(count)).decode("utf-8")
extraprops["LatestTitle"] = WINDOW.getProperty("NextAired.%s.LatestTitle"%str(count)).decode("utf-8")
extraprops["LatestNumber"] = WINDOW.getProperty("NextAired.%s.LatestNumber"%str(count)).decode("utf-8")
extraprops["LatestEpisodeNumber"] = WINDOW.getProperty("NextAired.%s.LatestEpisodeNumber"%str(count)).decode("utf-8")
extraprops["LatestSeasonNumber"] = WINDOW.getProperty("NextAired.%s.LatestSeasonNumber"%str(count)).decode("utf-8")
extraprops["AirDay"] = WINDOW.getProperty("NextAired.%s.AirDay"%str(count)).decode("utf-8")
extraprops["ShortTime"] = WINDOW.getProperty("NextAired.%s.ShortTime"%str(count)).decode("utf-8")
extraprops["SecondWeek"] = WINDOW.getProperty("NextAired.%s.SecondWeek"%str(count)).decode("utf-8")
extraprops["Art(poster)"] = WINDOW.getProperty("NextAired.%s.Art(poster)"%str(count)).decode("utf-8")
extraprops["Art(fanart)"] = WINDOW.getProperty("NextAired.%s.Art(fanart)"%str(count)).decode("utf-8")
extraprops["Art(landscape)"] = WINDOW.getProperty("NextAired.%s.Art(landscape)"%str(count)).decode("utf-8")
extraprops["Art(clearlogo)"] = WINDOW.getProperty("NextAired.%s.Art(clearlogo)"%str(count)).decode("utf-8")
extraprops["Art(clearart)"] = WINDOW.getProperty("NextAired.%s.Art(clearart)"%str(count)).decode("utf-8")
extraprops["Art(characterart)"] = WINDOW.getProperty("NextAired.%s.Art(characterart)"%str(count)).decode("utf-8")
item["extraproperties"] = extraprops
tvshowpath = "ActivateWindow(Videos,videodb://tvshows/titles/%s/,return)" %str(item["tvshowid"])
item["file"]="plugin://script.skin.helper.service?action=LAUNCH&path=" + tvshowpath
item["tvshowtitle"] = WINDOW.getProperty("NextAired.%s.Label"%str(count)).decode("utf-8")
item["title"] = WINDOW.getProperty("NextAired.%s.NextTitle"%str(count)).decode("utf-8")
item["season"] = WINDOW.getProperty("NextAired.%s.NextSeasonNumber"%str(count)).decode("utf-8")
item["episode"] = WINDOW.getProperty("NextAired.%s.NextEpisodeNumber"%str(count)).decode("utf-8")
allItems.append(item)
count += 1
if count == limit:
break
return allItems
und das ist mein eigendliches Problem, darum bin bei der Datenaufbereitung etwas schlampig... was aber im Nachgang geändert werden soll...
Re: Abfrage SQlite Datenbank
Verfasst: Sonntag 10. April 2016, 22:07
von Sirius3
@sveni_lee: dass man statt copy-paste besser eine Schleife benutzt, hab ich Dir ja schon gesagt. JSON sollte man auch nit per String-Formatierung erzeugen. Du solltest Deine Variablennamenschreibweise an die Konvention anpassen, was ist denn WINDOW und wie wird das gefüllt?
Re: Abfrage SQlite Datenbank
Verfasst: Montag 11. April 2016, 07:26
von sveni_lee
bis jezuz habe ich davon noch gar nichts benutz...
das was dort als Code steht, kommt aus einem anderen Plugin, nicht von mir... Das macht halt genau das
was ich möchte...
Die Ganze JSON Geschichte benörige ich in dem Fall gar nicht, da mein Abglaich mit der Datenbankt anders erfolgen soll...
Sirius3 hat geschrieben:was ist denn WINDOW und wie wird das gefüllt?
WINDOW.setProperty... setzt ja die jeweiligen Items die dann im jeweiligen Skin in KODI aufgerufen werden...
WINDOW.getProperty holt die gesetzten Propertys aus einem Plugin... in meinem werden die Propertya ja hier
befüllt:
Code: Alles auswählen
WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), item)
normaler Weise werden die Properties innerhalb eines Skins dann als Kontent abgerufen...
Code: Alles auswählen
<include name="SerienPlanerContent">
<item>
<property name="channel">$INFO[Window.Property(SerienPlaner.0.Channel)]</property>
<property name="poster">$INFO[Window.Property(SerienPlaner.0.Poster)]</property>
<property name="plot">$INFO[Window.Property(Serienplaner.0.Description)]</property>
<property name="staffel">$INFO[Window.Property(SerienPlaner.0.Staffel)]</property>
<property name="episode">$INFO[Window.Property(SerienPlaner.0.Episode)]</property>
<property name="starttime">$INFO[Window.Property(SerienPlaner.0.Starttime)]</property>
<property name="rating">$INFO[Window.Property(SerienPlaner.0.Rating)]</property>
<property name="senderlogo">$INFO[Window.Property(SerienPlaner.0.Logo)]</property>
<property name="genre">$INFO[Window.Property(SerienPlaner.0.Genre)]</property>
<property name="date">$INFO[Window.Property(SerienPlaner.0.Datum)]</property>
<property name="runtime">$INFO[Window.Property(SerienPlaner.0.RunningTime)]</property>
<property name="studio">$INFO[Window.Property(SerienPlaner.0.Studio)]</property>
<property name="year">$INFO[Window.Property(SerienPlaner.0.Jahr)]</property>
<property name="altersfreigabe">$INFO[Window.Property(SerienPlaner.0.Altersfreigabe)]</property>
<property name="status">$INFO[Window.Property(SerienPlaner.0.Status)]</property>
<label>$INFO[Window.Property(SerienPlaner.0.Title)]</label>
<label2>$INFO[Window.Property(SerienPlaner.0.TVShow)]</label2>
<thumb>$INFO[Window.Property(SerienPlaner.0.Thumb)]</thumb>
<icon>$INFO[Window.Property(SerienPlaner.0.Poster)]</icon>
<visible>!IsEmpty(Window.Property(SerienPlaner.0.TVShow))</visible>
</item>
<item>
<property name="channel">$INFO[Window.Property(SerienPlaner.1.Channel)]</property>
<property name="poster">$INFO[Window.Property(SerienPlaner.1.Poster)]</property>
<property name="plot">$INFO[Window.Property(Serienplaner.1.Description)]</property>
<property name="staffel">$INFO[Window.Property(SerienPlaner.1.Staffel)]</property>
<property name="episode">$INFO[Window.Property(SerienPlaner.1.Episode)]</property>
<property name="starttime">$INFO[Window.Property(SerienPlaner.1.Starttime)]</property>
<property name="rating">$INFO[Window.Property(SerienPlaner.1.Rating)]</property>
<property name="senderlogo">$INFO[Window.Property(SerienPlaner.1.Logo)]</property>
<property name="genre">$INFO[Window.Property(SerienPlaner.1.Genre)]</property>
<property name="date">$INFO[Window.Property(SerienPlaner.1.Datum)]</property>
<property name="runtime">$INFO[Window.Property(SerienPlaner.1.RunningTime)]</property>
<property name="studio">$INFO[Window.Property(SerienPlaner.1.Studio)]</property>
<property name="year">$INFO[Window.Property(SerienPlaner.1.Jahr)]</property>
<property name="altersfreigabe">$INFO[Window.Property(SerienPlaner.1.Altersfreigabe)]</property>
<property name="status">$INFO[Window.Property(SerienPlaner.1.Status)]</property>
<label>$INFO[Window.Property(SerienPlaner.1.Title)]</label>
<label2>$INFO[Window.Property(SerienPlaner.1.TVShow)]</label2>
<thumb>$INFO[Window.Property(SerienPlaner.1.Thumb)]</thumb>
<icon>$INFO[Window.Property(SerienPlaner.1.Poster)]</icon>
<visible>!IsEmpty(Window.Property(SerienPlaner.1.TVShow))</visible>
</item>
</include>
ich nöchte das ganze nun etwas vereinfachen und ohne diese Items innerhalb des Inculdes auskommen in dem ich den Inhat über einen Programmaufruf abfrage...
Ich hoffe das war jetzt etwas verständlicher...
Re: Abfrage SQlite Datenbank
Verfasst: Dienstag 12. April 2016, 12:38
von sveni_lee
Ich möchte noch einmal eure Hilfe beanspruchen,
die Propertys werden Dank eurer Hilfe perfekt gesetzt.
zusätzlich möchte ich nun auch noch folgenden return haben
Code: Alles auswählen
query = query % (','.join(properties), filter)
cur.execute(query, parameters)
for idx, data in enumerate(cur, offset):
for field, item in zip(properties, data):
WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), item)
for ... in ...
listitems_str = {field : item}
listitems.append(listitems_str)
return listitems
allerdings soll dieser einzeln für jedes Ergebis ausgegeben werden... ich dachte das ganze müsste so aussehen
allerdings weiß ich nicht in was....
Re: Abfrage SQlite Datenbank
Verfasst: Dienstag 12. April 2016, 13:34
von Sirius3
@sveni_lee: es gibt nur ein return pro Funktion. Was meinst Du mit "einzeln"? Was soll das for ... in ... bezwecken? listitems_str ist kein String, außerdem sollte sowieso kein Typ in einem Variablennamen stehen.
Re: Abfrage SQlite Datenbank
Verfasst: Dienstag 12. April 2016, 14:03
von sveni_lee
also...
so wie es jetzt ist bekomme ich ein Ergebnis aus der SQL-Abfrage und zwar 15 Datensätze die dann in das Property geschrieben werden...
nun möchte ich zusätzlich jeden Datensatz einzeln haben... und zwar für idx0, idx1, idx2 usw...
das in dem Ergebnis aus der SQL-Abfrage ja die Datensätze den idx zugeordnet sind, dachte ich man kann das Ergebnis noch in einem loop weiterverarbeiten....
wenn ich den "listitems.append(listitems_str)" debugge sieht das Ergebnis so aus:
Code: Alles auswählen
listitem_str [{'TVShow': u'Private Practice'},
{'Staffel': u'3'},
{'Episode': u'11'},
{'Title': u'Noch eine zweite Chance'},
{'Starttime': u'11:25'},
{'Datum': u'12.04.2016'},
{'neueEpisode': u''},
{'Channel': u'SIXX HD'},
{'Logo': u'image://G%3a%5cKodi%5cSenderlogos%5csixx%20hd.png/'},
{'PVRID': u'38'},
{'Description': u'Addison und ihr Exkollege Doktor Mark Sloan, dessen schwangere Tochter sie in Los Angeles operieren soll, finden angesichts beidseitig schwieriger Lebenssituationen Trost beieinander. Damit sorgen sie f\xfcr Aufregung in der Praxis und handeln sie sich neue Probleme ein. Cooper zeigt sich von seiner unerbittlichen Seite, sowohl gegen\xfcber seiner Freundin Charlotte wie auch einer kranken Mutter gegen\xfcber, der er das Sorgerecht f\xfcr ihren Sohn entziehen will.'},
{'Rating': u'7.2'},
{'Altersfreigabe': u'TV-14'},
{'Genre': u'Drama'},
{'Studio': u'ABC (US)'},
{'Status': u'Ended'},
{'Jahr': u'2007'},
{'Thumb': u'http://www.thetvdb.com/banners/episodes/80542/1499371.jpg'},
{'FirstAired': u'2010-01-14'},
{'RunningTime': u'55'},
{'Poster': u'http://thetvdb.com/banners/posters/80542-6.jpg'},
{'WatchType': u'Internationale Serien'},
{'TVShow': u'Navy CIS'},
{'Staffel': u'6'},
{'Episode': u'11'},
{'Title': u'Stille Nacht'},
{'Starttime': u'11:35'},
{'Datum': u'12.04.2016'},
{'neueEpisode': u''},
{'Channel': u'Fox HD'},
{'Logo': u'image://G%3a%5cKodi%5cSenderlogos%5cfox%20hd.png/'},
{'PVRID': u'36'}, {'Description': u'Kurz vor dem Heiligabend wird ein \xe4lteres Ehepaar in seinem Haus \xfcberfallen und ermordet. Die Beschreibung eines Zeugen sowie Fingerabdr\xfccke am Tatort f\xfchren die Polizei auf die Spur des Navy-Sanit\xe4ters Ned Quinn, ein Vietnam-Veteran, der bei einem Brand im Jahre 1991 ums Leben gekommen sein soll ...'},
{'Rating': u'7.5'},
{'Altersfreigabe': u'TV-14'},
{'Genre': u'Action | Adventure | Crime | Drama'},
{'Studio': u'CBS'}, {'Status': u'Continuing'},
{'Jahr': u'2003'},
{'Thumb': u'http://www.thetvdb.com/banners/episodes/72108/404893.jpg'},
{'FirstAired': u'2008-12-16'},
{'RunningTime': u'45'},
{'Poster': u'http://thetvdb.com/banners/posters/72108-14.jpg'},
{'WatchType': u'Internationale Serien'}]
mein Ergebnis soll aber so aussehen
Code: Alles auswählen
listitem_str [{'TVShow': u'Private Practice',
'Staffel': u'3',
'Episode': u'11',
'Title': u'Noch eine zweite Chance',
'Starttime': u'11:25',
'Datum': u'12.04.2016',
'neueEpisode': u'',
'Channel': u'SIXX HD',
'Logo': u'image://G%3a%5cKodi%5cSenderlogos%5csixx%20hd.png/',
'PVRID': u'38',
'Description': u'Addison und ihr Exkollege Doktor Mark Sloan, dessen schwangere Tochter sie in Los Angeles operieren soll, finden angesichts beidseitig schwieriger Lebenssituationen Trost beieinander. Damit sorgen sie f\xfcr Aufregung in der Praxis und handeln sie sich neue Probleme ein. Cooper zeigt sich von seiner unerbittlichen Seite, sowohl gegen\xfcber seiner Freundin Charlotte wie auch einer kranken Mutter gegen\xfcber, der er das Sorgerecht f\xfcr ihren Sohn entziehen will.',
'Rating': u'7.2',
'Altersfreigabe': u'TV-14',
'Genre': u'Drama',
'Studio': u'ABC (US)',
'Status': u'Ended',
'Jahr': u'2007',
'Thumb': u'http://www.thetvdb.com/banners/episodes/80542/1499371.jpg',
'FirstAired': u'2010-01-14',
'RunningTime': u'55',
'Poster': u'http://thetvdb.com/banners/posters/80542-6.jpg',
'WatchType': u'Internationale Serien'},
{'TVShow': u'Navy CIS',
'Staffel': u'6',
'Episode': u'11',
'Title': u'Stille Nacht',
'Starttime': u'11:35',
'Datum': u'12.04.2016',
'neueEpisode': u'',
'Channel': u'Fox HD',
'Logo': u'image://G%3a%5cKodi%5cSenderlogos%5cfox%20hd.png/',
'PVRID': u'36'}, {'Description': u'Kurz vor dem Heiligabend wird ein \xe4lteres Ehepaar in seinem Haus \xfcberfallen und ermordet. Die Beschreibung eines Zeugen sowie Fingerabdr\xfccke am Tatort f\xfchren die Polizei auf die Spur des Navy-Sanit\xe4ters Ned Quinn, ein Vietnam-Veteran, der bei einem Brand im Jahre 1991 ums Leben gekommen sein soll ...',
'Rating': u'7.5',
'Altersfreigabe': u'TV-14'},
'Genre': u'Action | Adventure | Crime | Drama',
'Studio': u'CBS'}, {'Status': u'Continuing',
'Jahr': u'2003',
'Thumb': u'http://www.thetvdb.com/banners/episodes/72108/404893.jpg',
'FirstAired': u'2008-12-16',
'RunningTime': u'45',
'Poster': u'http://thetvdb.com/banners/posters/72108-14.jpg',
'WatchType': u'Internationale Serien'}]
Re: Abfrage SQlite Datenbank
Verfasst: Dienstag 12. April 2016, 14:26
von Sirius3
@sveni_lee: wenn Du das nicht so haben willst, solltest Du eben nicht für jedes Feld ein eigenes Wörterbuch erzeugen.
Re: Abfrage SQlite Datenbank
Verfasst: Dienstag 12. April 2016, 14:59
von sveni_lee
@Sirius3: genau das wollte ich haben... Also alles was mit Listen und Dictionarys zu tun hat ist im Moment noch sehr verwirrend für mich...
Danke für die Erklärung!
Kurze Frage noch, nach dem return listitems ist dann schluß, weitere folgende Befehle werden nicht mehr abgearbeitet, oder?
sieht jetzt bei mir so aus:
Code: Alles auswählen
def refreshWidget(category, offset=0):
listitems = []
conn = sqlite3.connect(SerienPlaner)
cur = conn.cursor()
query = """SELECT %s
FROM TVShowData
WHERE julianday(_Starttime) + (_RunningTime / 24.0 / 60.0) > julianday('now', 'localtime')
%s
ORDER BY StartTime
LIMIT 15"""
if category == __LS__(30116):
filter = ""
parameters = ()
else:
filter = " AND WatchType = ?"
parameters = (category,)
query = query % (','.join(properties), filter)
cur.execute(query, parameters)
for idx, data in enumerate(cur, offset):
for field, item in zip(properties, data):
WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), item)
listitems.append(dict(zip(properties, data)))
return listitems
cur.execute("""DELETE FROM TVShowData WHERE julianday(_Starttime) + (_RunningTime / 24.0 / 60.0) < julianday('now', 'localtime')""")
conn.commit()
conn.close()
aber das löschen wird nicht mehr ausgeführt...
Re: Abfrage SQlite Datenbank
Verfasst: Dienstag 12. April 2016, 16:42
von BlackJack
@sveni_lee: Richtig, nach der Ausführung einer ``return``-Anweisung wird in einer Funktion nichts anderes mehr ausgeführt, ausser das ``return`` steht in einem ``try``-Block und es gibt einen ``finally``-Zweig, oder das ``return`` steht in einem ``with``-Block, dann wird noch der ”Aufräumcode” vom Kontextmanager ausgeführt, der zu dem ``with`` gehört.
Die Datenbankabfragen haben in dem Code übrigens eine ”Dynamik” erreicht wo ich aufhören würde SQL-Anweisungen als Zeichenketten zusammen zu basteln und auf eine Abstraktion wie `SQLAlchemy` zurückgreifen würde. Und wenn man das schon einsetzt, kann man sich auch gleich noch überlegen das ORM davon zu verwenden.
Re: Abfrage SQlite Datenbank
Verfasst: Dienstag 12. April 2016, 19:25
von sveni_lee
BlackJack hat geschrieben:Richtig, nach der Ausführung einer ``return``-Anweisung wird in einer Funktion nichts anderes mehr ausgeführt, ausser das ``return`` steht in einem ``try``-Block und es gibt einen ``finally``-Zweig, oder das ``return`` steht in einem ``with``-Block, dann wird noch der ”Aufräumcode” vom Kontextmanager ausgeführt, der zu dem ``with`` gehört.
ich hab das ganze mal in einen ``try``-Block gepackt aber irgendwie wird das löschen trotzdem nicht ausgefügrt...
Die Daten werden aber mit ``return`` übergeben
Code: Alles auswählen
def refreshWidget(category, offset=0):
listitems = []
conn = sqlite3.connect(SerienPlaner)
cur = conn.cursor()
query = """SELECT %s
FROM TVShowData
WHERE julianday(_Starttime) + (_RunningTime / 24.0 / 60.0) > julianday('now', 'localtime')
%s
ORDER BY StartTime
LIMIT 15"""
if category == __LS__(30116):
filter = ""
parameters = ()
else:
filter = " AND WatchType = ?"
parameters = (category,)
query = query % (','.join(properties), filter)
cur.execute(query, parameters)
try:
for idx, data in enumerate(cur, offset):
for field, item in zip(properties, data):
WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), item)
listitems.append(dict(zip(properties, data)))
return listitems
except:
pass
cur.execute("""DELETE FROM TVShowData WHERE julianday(_Starttime) + (_RunningTime / 24.0 / 60.0) < julianday('now', 'localtime')""")
conn.commit()
conn.close()
BlackJack hat geschrieben:Die Datenbankabfragen haben in dem Code übrigens eine ”Dynamik” erreicht wo ich aufhören würde SQL-Anweisungen als Zeichenketten zusammen zu basteln und auf eine Abstraktion wie `SQLAlchemy` zurückgreifen würde. Und wenn man das schon einsetzt, kann man sich auch gleich noch überlegen das ORM davon zu verwenden.
wie ihr unweigerlich bemerkt haben werdet, bin ich mit den "einfachen" SQL-Abfragen ja schon überfordert... wie sol ich dann mit SQL_Alchemy klar kommen?

Re: Abfrage SQlite Datenbank
Verfasst: Dienstag 12. April 2016, 20:07
von Sirius3
@sveni_lee: wie BlackJack schon geschrieben hat, hilft einfach ein try-Block mit einem except-Block der das Programm unwartbar macht nichts, weil nur der Teil in einem finally-Block nach einem return noch ausgeführt wird. Du schreibst auch noch zu viele Wörterbücher in Deine Liste.