/
tvshowhelper.py
157 lines (132 loc) · 6.16 KB
/
tvshowhelper.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#!/usr/bin/python
"""TV Show Helper
Usage:
tvshowhelper.py <showname>... --watch-next [-v]
tvshowhelper.py <showname>... --update [-v]
tvshowhelper.py <showname>... --watch <episode> [-v]
tvshowhelper.py <showname>... --next-episode [-v]
tvshowhelper.py <showname>... --list [-v]
tvshowhelper.py <showname>... --mark-watched <episode> [--mark-previous] [-v]
tvshowhelper.py <showname>... --mark-unwatched <episode> [--mark-previous] [-v]
tvshowhelper.py <showname>... --download <episode> [-v]
tvshowhelper.py <showname>... --download-next <number> [-v]
tvshowhelper.py [<filename>...] --rename [-v]
tvshowhelper.py --new-episodes [-v]
Options:
--help -h Show this screen.
--watch-next -w Watch next episode.
--watch <episode> Watch specific episode (e.g. s01e05).
--next-episode -n Display next episode's information, e.g. 's01e05 - title (release date)'.
--mark-watched <episode> -m Episode info (e.g. s01e05). See mark-previous option.
--mark-unwatched <episode> -u Episode info (e.g. s01e05). See mark-previous option.
--mark-previous -p Mark all previous episodes watched as well as the one specified [default: False].
--download <episode> -d Download episode (e.g. s01e05).
--download-next Download episode (e.g. s01e05) [default: 1].
--update -u Force an update of the series cache.
--new-episodes List recently aired, unwatched episodes.
--rename -r Rename file [default: 'all'].
--verbose -v Verbose logging
"""
from os import listdir
from docopt import docopt
from tvshowhelper.serieswatcher import watchepisode
from tvshowhelper.seriesnamehandler import getepisodeinfo, getshowname
from tvshowhelper.seriescache import SeriesCache
from tvshowhelper.seriesdownloader import downloadepisode
from tvshowhelper.seriesrenamer import renameepisode
from tvshowhelper.askuser import yesno
from tvshowhelper.logger import logger, setlevel as setlogginglevel
def main(args):
cache = SeriesCache()
if args.get('--verbose', False):
setlogginglevel('debug')
logger.debug("Arguments: {args}".format(args=args))
if args.get('<showname>', False):
showname = getshowname(" ".join(args['<showname>']))
if showname is None:
print("Couldn't find a show by the name '{n}' "
"in your regexes!".format(n=" ".join(args['<showname>'])))
return
logger.info("Showname: '{name}'".format(name=showname))
if args.get('--watch-next', False):
watchnext(showname, cache)
elif args.get('--watch', False):
watch(showname, cache, args['--watch'])
elif args.get('--next-episode', False):
nextepisode(showname, cache)
elif args.get('--mark-watched', False):
markwatched(showname, cache, args['--mark-watched'], watched=True,
markprevious=args.get('--mark-previous', False))
elif args.get('--mark-unwatched', False):
markwatched(showname, cache, args['--mark-unwatched'], watched=False,
markprevious=args.get('--mark-previous', False))
elif args.get('--download', False):
download(showname, cache)
elif args.get('--update', False):
update(showname, cache)
elif args.get('--rename', False):
rename(cache, args.get('<filename>', []))
else:
print('Unimplemented/unknown arguments "{}".'.format(args))
def watchnext(showname, cache):
logger.info("watchnext")
episode = cache.getnextepisode(showname)
if episode is None:
print("Couldn't find any new episodes!")
if yesno("Would you like to update the cache?"):
update(showname, cache)
watchnext(showname, cache) # this could be an endless loop.
return
if watchepisode(episode):
cache.markwatched(episode)
askwatchnext(showname, cache)
def watch(showname, cache, episodestring):
logger.info("watch({name}, {epstring})".format(name=showname, epstring=episodestring))
seasonnum, episodenum = getepisodeinfo(episodestring)
assert(seasonnum is not None and episodenum is not None)
episode = cache.getepisode(showname, seasonnum, episodenum)
if watchepisode(episode):
cache.markwatched(episode)
askwatchnext(showname, cache)
def nextepisode(showname, cache):
logger.info("nextepisode")
episode = cache.getnextepisode(showname)
if episode is None:
print "No episode found!"
return
print("Next episode is: {episode}: {date}".format(episode=episode.getprettyname(),
date=episode.getairdatestr()).encode('utf8'))
def markwatched(showname, cache, episodestring, markprevious, watched):
logger.info("markwatched")
# shortcut so that you don't need to know the name of the next episode.
if episodestring == "next":
episode = cache.getnextepisode(showname)
else:
seasonnum, episodenum = getepisodeinfo(episodestring)
episode = cache.getepisode(showname, seasonnum, episodenum)
cache.markwatched(episode, markprevious=markprevious, watched=watched)
def download(showname, cache):
logger.info("download")
seasonnum, episodenum = getepisodeinfo(args['--download'])
episode = cache.getepisode(showname, seasonnum, episodenum)
downloadepisode(episode)
def rename(cache, filenames):
logger.info("rename")
# user didn't give an argument. he wants to run it on all files in folder.
if filenames == []:
filenames = listdir('.')
for filename in filenames:
renameepisode(filename, cache=cache)
def update(showname, cache):
logger.info("update")
print("Updating {name}..".format(name=showname))
cache.getshow(showname, update=True)
def askwatchnext(showname, cache):
if yesno("Would you like to watch the next episode?"):
watchnext(showname, cache)
if __name__ == '__main__':
args = docopt(__doc__, version='Series everything v 0.1')
try:
main(args)
except (KeyboardInterrupt, SystemExit):
print("\nProgram stopped...")