Advertisement
Guest User

Untitled

a guest
Feb 8th, 2013
327
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import sys, os
  2. import re
  3. import json
  4. from xbmcswift2 import Plugin, xbmc, xbmcaddon
  5. from lib import scraper
  6.  
  7. plugin = Plugin()
  8.  
  9. # Calls XBMC's JSON RPC
  10. def send_request(method, params = None):
  11.     HEADERS = {'content-type' : 'application/json'}
  12.     data = {"method"  : method,
  13.             "jsonrpc" : "2.0",
  14.             "id"      : plugin.id}
  15.     if params is not None:
  16.         data["params"] = params
  17.     return eval(xbmc.executeJSONRPC( json.dumps(data) ))
  18.  
  19. # Makes a movie title into an HD-Trailer's title
  20. def clean(title):
  21.     return title.replace(" ", "-").lower()
  22.  
  23. # HACK! Modify the HD Trailers.net scraper to follow redirects
  24. get_tree_original = scraper.__get_tree
  25. @plugin.cached()
  26. def get_tree_new(url, tries = 0):
  27.     if tries > 2:
  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.     else:
  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.          'is_playable' : True},
  81.          {'label' : "Choose trailer",
  82.          'path'  : plugin.url_for('trailer_menu',
  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.     trailer = details["trailer"]
  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.     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.         else:
  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()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement