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') ")
Code: Alles auswählen
cursor.execute("select * from TVShowData where julianday(StartTime) + (Runtime / 24.0 / 60.0) > julianday('now', 'localtime') ")
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)
Code: Alles auswählen
WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), item)
TypeError: argument "value" for method "setProperty" must be unicode or str
Code: Alles auswählen
WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), unicode(item))
Code: Alles auswählen
writeLog('Setting Properties SerienPlaner.%d.%s' % ((idx, field), item), level=xbmc.LOGDEBUG)
Code: Alles auswählen
TypeError: %d format: a number is required, not tuple
Code: Alles auswählen
cur.execute("""DELETE FROM TVShowData WHERE julianday(_Starttime) + (_RunningTime / 24.0 / 60.0) < julianday('now', 'localtime')""")
conn.commit()
conn.close()
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)
Code: Alles auswählen
TypeError: not enough arguments for format string
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)
Code: Alles auswählen
WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), unicode(item))
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")
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
WINDOW.setProperty... setzt ja die jeweiligen Items die dann im jeweiligen Skin in KODI aufgerufen werden...Sirius3 hat geschrieben:was ist denn WINDOW und wie wird das gefüllt?
Code: Alles auswählen
WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), item)
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>
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
Code: Alles auswählen
for (idx, field) in ...
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'}]
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'}]
Code: Alles auswählen
listitems.append(dict(zip(properties, data)))
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()
ich hab das ganze mal in einen ``try``-Block gepackt aber irgendwie wird das löschen trotzdem nicht ausgefügrt...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.
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()
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?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.