66religiously keep every single episode that is downloaded.
77
88Usage:
9- Intended usage is to add one of the tags keep5' , keep10, keep15, to any show
10- you want to have this behaviour. Then simply add this script to run on a schedule
11- and you should be all set.
9+ Intended usage is to add one of the tags keep5, keep10, keep15, keepSeason, to
10+ any show you want to have this behaviour. Then simply add this script to run on
11+ a schedule and you should be all set.
1212
1313Example Crontab:
14- */5 * * * * /home/atodd/plex-autodelete.py >> /home/atodd/plex-autodelete.log 2>&1
14+ @daily /home/atodd/plex-autodelete.py >> /home/atodd/plex-autodelete.log 2>&1
1515"""
1616import os
1717from datetime import datetime
1818from plexapi .server import PlexServer
1919
20- TAGS = {'keep5' :5 , 'keep10' :10 , 'keep15' :15 }
20+ TAGS = {'keep5' :5 , 'keep10' :10 , 'keep15' :15 , 'keepSeason' : 'season' }
2121datestr = lambda : datetime .now ().strftime ('%Y-%m-%d %H:%M:%S' )
2222
2323
@@ -28,7 +28,6 @@ def delete_episode(episode):
2828 filepath = mediapart .file
2929 print ('%s Deleting %s.' % (datestr (), filepath ))
3030 os .unlink (filepath )
31- # Check the parent directory is empty
3231 dirname = os .path .dirname (filepath )
3332 if not os .listdir (dirname ):
3433 print ('%s Removing empty directory %s.' % (datestr (), dirname ))
@@ -37,18 +36,42 @@ def delete_episode(episode):
3736 print ('%s Error deleting %s; %s' % (datestr (), filepath , err ))
3837
3938
40- if __name__ == '__main__' :
41- print ('%s Starting plex-markwatched script..' % datestr ())
39+ def keep_episodes (show , keep ):
40+ """ Delete all but last count episodes in show. """
41+ deleted = 0
42+ print ('%s Cleaning %s to %s episodes.' % (datestr (), show .title , keep ))
43+ sort = lambda x :x .originallyAvailableAt or x .addedAt
44+ items = sorted (show .episodes (), key = sort , reverse = True )
45+ for episode in items [keep :]:
46+ delete_episode (episode )
47+ deleted += 1
48+ return deleted
49+
50+
51+ def keep_season (show , keep ):
52+ """ Keep only the latest season. """
53+ deleted = 0
54+ print ('%s Cleaning %s to latest season.' % (datestr (), show .title ))
55+ for season in show .seasons ()[:- 1 ]:
56+ for episode in season .episodes ():
57+ delete_episode (episode )
58+ deleted += 1
59+ return deleted
60+
61+
62+ def auto_delete ():
63+ print ('\n %s Starting plex-autodelete script..' % datestr ())
4264 plex = PlexServer ()
4365 for section in plex .library .sections ():
4466 if section .type in ('show' ,):
45- episodes_deleted = 0
67+ deleted = 0
4668 for tag , keep in TAGS .items ():
69+ func = keep_season if keep == 'season' else keep_episodes
4770 for show in section .search (collection = tag ):
48- print ('%s Cleaning %s to %s items.' % (datestr (), show .title , keep ))
49- items = sorted (show .episodes (), key = lambda x :x .originallyAvailableAt or x .addedAt , reverse = True )
50- for episode in items [keep :]:
51- delete_episode (episode )
52- episodes_deleted += 1
53- if episodes_deleted :
71+ deleted += func (show , keep )
72+ if deleted :
5473 section .update ()
74+
75+
76+ if __name__ == '__main__' :
77+ auto_delete ()
0 commit comments