SHOW:
|
|
- or go back to the newest paste.
1 | import sys, os | |
2 | - | import xbmc, xbmcgui, xbmcaddon, xbmcplugin |
2 | + | |
3 | - | import unicodedata |
3 | + | |
4 | - | import urllib |
4 | + | from xbmcswift2 import Plugin, xbmc, xbmcaddon |
5 | - | from urlparse import parse_qs |
5 | + | |
6 | ||
7 | plugin = Plugin() | |
8 | - | from xbmcswift2 import Plugin |
8 | + | |
9 | - | import datetime |
9 | + | # Calls XBMC's JSON RPC |
10 | def send_request(method, params = None): | |
11 | - | #from lib import scraper |
11 | + | |
12 | data = {"method" : method, | |
13 | "jsonrpc" : "2.0", | |
14 | "id" : plugin.id} | |
15 | - | __addonid__ = 'plugin.video.trailersnob' |
15 | + | |
16 | - | __addon__ = xbmcaddon.Addon(id=__addonid__) |
16 | + | |
17 | - | __addonname__ = __addon__.getAddonInfo('name') |
17 | + | |
18 | - | __scriptdebug__ = True |
18 | + | |
19 | - | __handle__ = int(sys.argv[1]) |
19 | + | # Makes a movie title into an HD-Trailer's title |
20 | def clean(title): | |
21 | - | def enum(*sequential, **named): |
21 | + | |
22 | - | enums = dict(zip(sequential, range(len(sequential))), **named) |
22 | + | |
23 | - | return type('Enum', (), enums) |
23 | + | |
24 | get_tree_original = scraper.__get_tree | |
25 | - | TASKS = enum('ALL', 'MISSING', 'BAD', 'LAME', 'SHOW_MOVIE') |
25 | + | |
26 | - | TASK = "task" |
26 | + | |
27 | - | MOVIE_ID = "movieid" |
27 | + | |
28 | return None | |
29 | tree = get_tree_original(url) | |
30 | result = tree.find("meta", attrs = {"http-equiv":"refresh"}) | |
31 | if result: | |
32 | wait,text=result["content"].split(";") | |
33 | if text.lower().startswith("url="): | |
34 | url=text[4:] | |
35 | return get_tree_new(url, tries + 1) | |
36 | - | "id" : __addonid__} |
36 | + | |
37 | return tree | |
38 | scraper.__get_tree = get_tree_new | |
39 | # END HACK | |
40 | ||
41 | ## | |
42 | ## -- Beginning of URL handling functions -- | |
43 | ## | |
44 | ||
45 | @plugin.route('/') | |
46 | def root_menu(): | |
47 | items = [ | |
48 | {'label':"All Movies", | |
49 | 'path': plugin.url_for('all_menu', filter_by = "None")} | |
50 | ] | |
51 | return items | |
52 | ||
53 | def list_movies(movies, filter_by): | |
54 | items = [] | |
55 | for movie in movies: | |
56 | items.append( {'label': movie["label"], | |
57 | 'path' : plugin.url_for('movie_menu', | |
58 | movie_id = "%d" % movie["movieid"], | |
59 | filter_by = filter_by)} ) | |
60 | return items | |
61 | ||
62 | ||
63 | @plugin.route('/movies/<filter_by>') | |
64 | def all_menu(filter_by): | |
65 | return list_movies(send_request("VideoLibrary.GetMovies")["result"]["movies"], filter_by) | |
66 | ||
67 | def get_details(movie_id): | |
68 | result = send_request("VideoLibrary.GetMovieDetails", | |
69 | {"properties" : ["trailer", "year"], "movieid" : int(movie_id)}) | |
70 | return result["result"]["moviedetails"] | |
71 | ||
72 | @plugin.route('/movies/<filter_by>/<movie_id>') | |
73 | def movie_menu(filter_by, movie_id): | |
74 | details = get_details(movie_id) | |
75 | items = [ | |
76 | {'label' : "Play current trailer", | |
77 | 'path' : plugin.url_for('play_trailer', | |
78 | movie_id = movie_id, | |
79 | filter_by = filter_by), | |
80 | - | movie_id = "%d" % movie[MOVIE_ID], |
80 | + | |
81 | {'label' : "Choose trailer", | |
82 | - | print movie[MOVIE_ID] |
82 | + | |
83 | movie_id = movie_id, | |
84 | filter_by = filter_by) } | |
85 | ] | |
86 | return items | |
87 | ||
88 | @plugin.route('/movies/<filter_by>/<movie_id>/play') | |
89 | def play_trailer(filter_by, movie_id): | |
90 | details = get_details(movie_id) | |
91 | - | result = send_request("VideoLibrary.GetMovieDetails", {"properties" : ["trailer", "year"], "movieid" : int(movie_id)}) |
91 | + | |
92 | plugin.log.info("Playing: %s" % trailer) | |
93 | plugin.set_resolved_url(trailer) | |
94 | ||
95 | def trailer_menu_items(filter_by, movie_id): | |
96 | details = get_details(int(movie_id)) | |
97 | try: | |
98 | movie, trailers, clips = scraper.get_videos(clean(details["label"])) | |
99 | except scraper.NetworkError: | |
100 | plugin.notify("No trailers found.") | |
101 | return None | |
102 | ||
103 | resolution = plugin.getSetting("resolution", str) | |
104 | items = [] | |
105 | for trailer in trailers: | |
106 | if resolution in trailer["resolutions"]: | |
107 | items.append( | |
108 | {'label' : trailer["title"], | |
109 | 'path' : plugin.url_for('set_trailer', | |
110 | filter_by = filter_by, movie_id = movie_id, | |
111 | url = trailer['resolutions'][resolution], | |
112 | source = trailer['source'])}) | |
113 | return items | |
114 | ||
115 | @plugin.route('/movies/<filter_by>/<movie_id>/list') | |
116 | def trailer_menu(filter_by, movie_id): | |
117 | return trailer_menu_items(filter_by, movie_id) | |
118 | ||
119 | ||
120 | @plugin.route('/movies/<filter_by>/<movie_id>/set_trailer/<url>/<source>') | |
121 | def set_trailer(filter_by, movie_id, url, source): | |
122 | if source == "apple.com": | |
123 | url = '%s|User-Agent=QuickTime' % url | |
124 | ||
125 | - | resolution = __addon__.getSetting("resolution") |
125 | + | result = send_request('VideoLibrary.SetMovieDetails', |
126 | {'movieid' : int(movie_id), 'trailer' : url}) | |
127 | if "result" in result: | |
128 | if result["result"] == "OK": | |
129 | plugin.notify(msg='Successfully set trailer') | |
130 | plugin.log.info("Set trailer for \"%s\" to: %s" % (movie_id, url)) | |
131 | - | 'path' : plugin.url_for('set_trailer', filter_by = filter_by, url = trailer['resolutions'][resolution], movie_id = movie_id, source = trailer['source'])}) |
131 | + | |
132 | plugin.log.error("Failed to set trailer for \"%s\" to: %s" % (movie_id, url)) | |
133 | plugin.log.error(result) | |
134 | else: | |
135 | plugin.log.error(result["error"]) | |
136 | ||
137 | # Go back to trailer menu | |
138 | return plugin.finish(trailer_menu_items(filter_by, movie_id), update_listing = True) | |
139 | ||
140 | if __name__ == "__main__": | |
141 | plugin.run() |