Advertisement
Guest User

TrailerSnob alpha

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