Welcher Serienjunkie kennt das nicht:
20 verschiedene Serien auf dem NAS mit jeweils 3 Staffeln und 24 Epsioden.
Gut, die nehmen Platz weg. Und eigentlich schaut man sich die Episoden doch eh nur 1x an.
Wie kriege ich jetzt jene gelöscht, die ich bereits angeschaut habe?
Manuell im XBMC über die Contexttaste? ... machbar, aber ätzend langwierig.
Einfach die Daten vom NAS löschen und dann ein Datenbank-Cleaning? ... wäre eine Idee, aber da muss man so fürchterlich aufpassen. Man sieht ja nicht, welche noch "neu" sind.
Die Lösung:
Der User midna hat ein kleines Script geschrieben, welches den Datenbankbestand der Serien nach "watched Episodes" durchsucht und diese dann löscht.
Des weiteren kann man Ordner/Pfade ausschließen (wenn man denn unbedingt eine Serie behalten will).
Man kann auch einstellen, wie alt eine Episode mindestens sein muss.
Und, um es abzurunden, wird die jeweils letzte Episode verschont.
Download: Database
Die Konfiguration muss jedoch im Script manuell gemacht werden. Es gibt kein GUI.
Interessant sind aber nur 2 Einträge. (sollte selbsterklärend sein)
[infobox]# set any paths to ignore here
ignore_paths = []
#change the -20 to match whatever range you want
d = datetime.datetime.now() + datetime.timedelta(days=-20)
minusdays = d.strftime('%Y-%m-%d')[/infobox]
import xbmc
import pprint
from urllib import quote_plus
import re
import datetime
# set any paths to ignore here
ignore_paths = []
#change the -20 to match whatever range you want
d = datetime.datetime.now() + datetime.timedelta(days=-20)
minusdays = d.strftime('%Y-%m-%d')
# this gets filled with stuff, leave alone
eps_to_remove = []
print "finding shows with more than one episode"
# find all shows with more than 1 episode
shows_sql = "select count(idEpisode), idShow from tvshowlinkepisode group by idShow;"
shows = xbmc.executehttpapi( "QueryVideoDatabase(%s)" % ( quote_plus( shows_sql ), ) )
showsp=re.compile('<field>(.+?)</field><field>(.+?)</field>')
showmatch=showsp.findall(shows)
for epcount,showid in showmatch:
if epcount > 1:
print "searching show: %s" % showid
# now get the episodes for each show
eps_sql = "select tvshowlinkepisode.idEpisode from tvshowlinkepisode join episode on episode.idEpisode=tvshowlinkepisode.idEpisode where tvshowlinkepisode.idShow = %s" % showid
eps = xbmc.executehttpapi( "QueryVideoDatabase(%s)" % ( quote_plus( eps_sql ), ) )
epsp=re.compile('<field>(.+?)</field>')
epsmatch=epsp.findall(eps)
# get all the episodes, storing all but the most recent
hi_ep = 0
hi_s = 0
hi_details = []
for epid in epsmatch:
print "searching episode: %s" % epid
# now get the episode details if the episode is older than specified limit
details_sql = "select episode.c12,episode.c13, episode.c05, files.playCount, files.strFilename, (select path.strpath from path where files.idpath = path.idpath) from files join episode on episode.idfile=files.idfile where episode.c05 <='"+minusdays+"' and episode.idEpisode = %s" % epid
# gives season,ep, playtime, playcount, file, path
records = xbmc.executehttpapi( "QueryVideoDatabase(%s)" % ( quote_plus( details_sql ), ) )
p=re.compile('<field>(.+?)</field><field>(.+?)</field><field>(.+?)</field><field>(.+?)</field><field>(.+?)</field><field>(.+?)</field>')
match=p.findall(records)
for s,ep,playdate,playcount,file,path in match:
if hi_s == 0 and hi_ep == 0:
# first, make it hi and move on
print "ignoring first found episode"
hi_s = s
hi_ep = ep
hi_details = [s,ep,playdate,playcount,file,path]
elif s < hi_s:
# season is lower, just remove it
eps_to_remove.append([path,file])
elif s > hi_s:
# season is greater, just remove current hi
eps_to_remove.append([hi_details[5],hi_details[4]])
hi_s = s
hi_ep = ep
hi_details = [s,ep,playdate,playcount,file,path]
elif s == hi_s:
# seasons equal, test episodes
if ep < hi_ep:
# episode lower, just remove it
eps_to_remove.append([path,file])
else:
#episode is newer or equal, remove current hi
eps_to_remove.append([hi_details[5],hi_details[4]])
hi_s = s
hi_ep = ep
hi_details = [s,ep,playdate,playcount,file,path]
for path,file in eps_to_remove:
if path not in ignore_paths:
full = path + file
print "removing %s" % full
xbmc.executehttpapi("FileDelete(%s)" % full)
xbmc.executebuiltin('XBMC.updatelibrary(video)')
Alles anzeigen
Beim Start des Scripts sieht man bestenfalls das "ende", wenn es das XBMC dazu aufruft, ein Datenbankupdate zu machen.
Nach der Ausführung sind dann alle "alten", "gesehenen" Episoden gelöscht. Abgesehen von der "Last Watched".
Ich mag das Script. Bin bei Serien nicht so der Sammler.