# -*- coding: utf-8 -*- """ imdb.py --- Jen Plugin for accessing iMDB data Copyright (C) 2018, Mister-X This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Version: July 18, 2019 - Added customizable settings for 2 colors (COLOR1 for Movie/Show titles; COLOR2 for Season/Episode numbers as well as for "Next Page >>") - Updated the display for seasons (added ":" between season and season number) as well as for episodes (added season & episode number to title) - Updated so that season and episode numbers less than 10 are displayed as double digits with a leading "0" (example: Season 1, Episode 9 ==> S01E09) - Added thumbnail for "Next Page >>" (same as tmdb.py) - Categorized and added several Usage Examples August 14, 2018 - Added calendar support for upcoming releases by country June 16, 2018 - Added try and except to next page code to fix results not being displayed if there was only one page-- ------------------------------------------------------------- *** COLORS *** Set your desired colors for the COLOR1 & COLOR2 variables within "" on lines 238 & 239 below. COLOR1 is for Movie/Show titles; COLOR2 is for Season/Episode numbers as well as for "Next Page >>". The color values can be alphanumeric (example: red, limegreen) or Hex (example: ffff0000, FF00FF00). If colors are left blank, they will display as the default color set within the skin you're using. -- Note: In order for the Color settings to work as intended, Metadata must be DISABLED in the addon settings!!! ------------------------------------------------------------- Usage Examples: ### Search ### ** Returns a list of Movies searched for from IMDB Search IMDB Movies searchmovies ** Returns a list of TV Shows searched for from IMDB Search IMDB TV Shows searchseries ### Movies ### ** Returns a list of the IMDB Trending Movies IMDB Trending Movies movies/trending ** Returns a list of the IMDB Box Office Movies IMDB Box Office Movies movies/boxoffice ** Returns a list of the IMDB Most Popular Movies IMDB Most Popular Movies movies/popular ** Returns a list of the IMDB Most Voted Movies IMDB Most Voted Movies movies/voted ** Returns a list of IMDB Movies by a specific Year. Change Year at the end of the Second Tag as desired. IMDB 2018 Movies years/2018 * other Years found in movies_years-imdb.xml ### TV Shows ### ** Returns a list of the IMDB Newest TV Shows IMDB Newest TV Shows tvshows/new ** Returns a list of the IMDB Most Viewed TV Shows IMDB Most Viewed TV Shows tvshows/mostviews ** Returns a list of the IMDB Best User Rated TV Shows IMDB Best User Rated TV Shows tvshows/rating ** Returns a list of the IMDB Most Popular TV Shows IMDB Most Popular TV Shows tvshows/popular ** Returns a list of the IMDB Box Office TV Shows IMDB Box Office TV Shows tvshows/boxoffice ** Returns a list of IMDB TV Shows in Alphabetical order IMDB A to Z TV Shows tvshows/alphabetical ### Charts ### ** Returns a list of the IMDB Top Rated TV Shows IMDB Top Rated TV Shows charttv/toptv ### Genres ### ** Returns a list of IMDB Movies by a specific Genre. Switch out "action" Genre as desired at the end Of the Second Tag. IMDB Action Movies genres/action * other Genres found in movies_genres-imdb.xml ** Returns a list of IMDB TV Shows by a specific Genre. Switch out "history" Genre as desired at the end Of the Second Tag. IMDB History TV Shows genrestv/history * other Genres found in tvshows_genres-imdb.xml ### User Lists ### ** Returns ALL public IMDB Lists from a specific user Someone's IMDB Lists user/ur19947955/lists # If you have a IMDB account with lists, add YOUR user ID like this and it will return all public lists on YOUR account ** Returns a SINGLE public IMDB List from a specific user Someone's IMDB List /list/ls068927829/ ** Returns a specific user's IMDB Top 100 Gangster Movies public list IMDB TOP 100 Gangster Movies list/ls001818278 ### Calendar ### ** Returns a List of Upcoming Releases by Country. IMDB Upcoming Releases in the United States moviecalendar/US ** Returns a List of Upcoming Releases by Country IMDB Upcoming Releases in the United Kingdom moviecalendar/GB ** Returns a List of Upcoming Releases by Country IMDB Upcoming Releases in Mexico moviecalendar/MX ------------------------------------------------------------- """ import urllib, urllib2, os, base64, xbmcplugin, xbmcgui, xbmcvfs, traceback, cookielib, xbmc, sys import pickle import time import re import koding import xbmcaddon from koding import route from resources.lib.plugin import Plugin from resources.lib.util import dom_parser from resources.lib.util.context import get_context_items from resources.lib.util.xml import JenItem, JenList, display_list from unidecode import unidecode CACHE_TIME = 3600 # change to wanted cache time in seconds addon_fanart = xbmcaddon.Addon().getAddonInfo('fanart') addon_icon = xbmcaddon.Addon().getAddonInfo('icon') COLOR1 = "" COLOR2 = "" class IMDB(Plugin): name = "imdb" def process_item(self, item_xml): if "" in item_xml: item = JenItem(item_xml) if "movies/" in item.get("imdburl", ""): result_item = { 'label': item["title"], 'icon': item.get("thumbnail", addon_icon), 'fanart': item.get("fanart", addon_fanart), 'mode': "imdbmovies", 'url': item.get("imdburl", ""), 'folder': True, 'imdb': "0", 'content': "files", 'season': "0", 'episode': "0", 'info': {}, 'year': "0", 'context': get_context_items(item), "summary": item.get("summary", None) } result_item["properties"] = { 'fanart_image': result_item["fanart"] } result_item['fanart_small'] = result_item["fanart"] return result_item elif "tvshows/" in item.get("imdburl", ""): result_item = { 'label': item["title"], 'icon': item.get("thumbnail", addon_icon), 'fanart': item.get("fanart", addon_fanart), 'mode': "imdbseries", 'url': item.get("imdburl", ""), 'folder': True, 'imdb': "0", 'content': "files", 'season': "0", 'episode': "0", 'info': {}, 'year': "0", 'context': get_context_items(item), "summary": item.get("summary", None) } result_item["properties"] = { 'fanart_image': result_item["fanart"] } result_item['fanart_small'] = result_item["fanart"] return result_item elif "season/" in item.get("imdburl", ""): result_item = { 'label': item["title"], 'icon': item.get("thumbnail", addon_icon), 'fanart': item.get("fanart", addon_fanart), 'mode': "imdbseason", 'url': item.get("imdburl", ""), 'folder': True, 'imdb': "0", 'content': "files", 'season': "0", 'episode': "0", 'info': {}, 'year': "0", 'context': get_context_items(item), "summary": item.get("summary", None) } result_item["properties"] = { 'fanart_image': result_item["fanart"] } result_item['fanart_small'] = result_item["fanart"] return result_item elif "episode/" in item.get("imdburl", ""): result_item = { 'label': item["title"], 'icon': item.get("thumbnail", addon_icon), 'fanart': item.get("fanart", addon_fanart), 'mode': "imdbepisode", 'url': item.get("imdburl", ""), 'folder': True, 'imdb': "0", 'content': "files", 'season': "0", 'episode': "0", 'info': {}, 'year': "0", 'context': get_context_items(item), "summary": item.get("summary", None) } result_item["properties"] = { 'fanart_image': result_item["fanart"] } result_item['fanart_small'] = result_item["fanart"] return result_item elif "theepisodeTwo/" in item.get("imdburl", ""): result_item = { 'label': item["title"], 'icon': item.get("thumbnail", addon_icon), 'fanart': item.get("fanart", addon_fanart), 'mode': "imdbepisodeTwo", 'url': item.get("imdburl", ""), 'folder': True, 'imdb': "0", 'content': "files", 'season': "0", 'episode': "0", 'info': {}, 'year': "0", 'context': get_context_items(item), "summary": item.get("summary", None) } result_item["properties"] = { 'fanart_image': result_item["fanart"] } result_item['fanart_small'] = result_item["fanart"] return result_item elif "years/" in item.get("imdburl", ""): result_item = { 'label': item["title"], 'icon': item.get("thumbnail", addon_icon), 'fanart': item.get("fanart", addon_fanart), 'mode': "imdbyears", 'url': item.get("imdburl", ""), 'folder': True, 'imdb': "0", 'content': "files", 'season': "0", 'episode': "0", 'info': {}, 'year': "0", 'context': get_context_items(item), "summary": item.get("summary", None) } result_item["properties"] = { 'fanart_image': result_item["fanart"] } result_item['fanart_small'] = result_item["fanart"] return result_item elif "yearstv/" in item.get("imdburl", ""): result_item = { 'label': item["title"], 'icon': item.get("thumbnail", addon_icon), 'fanart': item.get("fanart", addon_fanart), 'mode': "imdbyearstv", 'url': item.get("imdburl", ""), 'folder': True, 'imdb': "0", 'content': "files", 'season': "0", 'episode': "0", 'info': {}, 'year': "0", 'context': get_context_items(item), "summary": item.get("summary", None) } result_item["properties"] = { 'fanart_image': result_item["fanart"] } result_item['fanart_small'] = result_item["fanart"] return result_item elif "moviecalendar/" in item.get("imdburl", ""): result_item = { 'label': item["title"], 'icon': item.get("thumbnail", addon_icon), 'fanart': item.get("fanart", addon_fanart), 'mode': "moviecalendar", 'url': item.get("imdburl", ""), 'folder': True, 'imdb': "0", 'content': "files", 'season': "0", 'episode': "0", 'info': {}, 'year': "0", 'context': get_context_items(item), "summary": item.get("summary", None) } result_item["properties"] = { 'fanart_image': result_item["fanart"] } result_item['fanart_small'] = result_item["fanart"] return result_item elif "list/" in item.get("imdburl", ""): result_item = { 'label': item["title"], 'icon': item.get("thumbnail", addon_icon), 'fanart': item.get("fanart", addon_fanart), 'mode': "imdblists", 'url': item.get("imdburl", ""), 'folder': True, 'imdb': "0", 'content': "files", 'season': "0", 'episode': "0", 'info': {}, 'year': "0", 'context': get_context_items(item), "summary": item.get("summary", None) } result_item["properties"] = { 'fanart_image': result_item["fanart"] } result_item['fanart_small'] = result_item["fanart"] return result_item elif "actors/" in item.get("imdburl", ""): result_item = { 'label': item["title"], 'icon': item.get("thumbnail", addon_icon), 'fanart': item.get("fanart", addon_fanart), 'mode': "imdbactors", 'url': item.get("imdburl", ""), 'folder': True, 'imdb': "0", 'content': "files", 'season': "0", 'episode': "0", 'info': {}, 'year': "0", 'context': get_context_items(item), "summary": item.get("summary", None) } result_item["properties"] = { 'fanart_image': result_item["fanart"] } result_item['fanart_small'] = result_item["fanart"] return result_item elif "name/" in item.get("imdburl", ""): result_item = { 'label': item["title"], 'icon': item.get("thumbnail", addon_icon), 'fanart': item.get("fanart", addon_fanart), 'mode': "imdbactorspage", 'url': item.get("imdburl", ""), 'folder': True, 'imdb': "0", 'content': "files", 'season': "0", 'episode': "0", 'info': {}, 'year': "0", 'context': get_context_items(item), "summary": item.get("summary", None) } result_item["properties"] = { 'fanart_image': result_item["fanart"] } result_item['fanart_small'] = result_item["fanart"] return result_item elif "www.imdb.com" in item.get("imdburl", ""): result_item = { 'label': item["title"], 'icon': item.get("thumbnail", addon_icon), 'fanart': item.get("fanart", addon_fanart), 'mode': "imdbNextPage", 'url': item.get("imdburl", ""), 'folder': True, 'imdb': "0", 'content': "files", 'season': "0", 'episode': "0", 'info': {}, 'year': "0", 'context': get_context_items(item), "summary": item.get("summary", None) } result_item["properties"] = { 'fanart_image': result_item["fanart"] } result_item['fanart_small'] = result_item["fanart"] return result_item elif "genres/" in item.get("imdburl", ""): result_item = { 'label': item["title"], 'icon': item.get("thumbnail", addon_icon), 'fanart': item.get("fanart", addon_fanart), 'mode': "imdbgenres", 'url': item.get("imdburl", ""), 'folder': True, 'imdb': "0", 'content': "files", 'season': "0", 'episode': "0", 'info': {}, 'year': "0", 'context': get_context_items(item), "summary": item.get("summary", None) } result_item["properties"] = { 'fanart_image': result_item["fanart"] } result_item['fanart_small'] = result_item["fanart"] return result_item elif "genrestv/" in item.get("imdburl", ""): result_item = { 'label': item["title"], 'icon': item.get("thumbnail", addon_icon), 'fanart': item.get("fanart", addon_fanart), 'mode': "imdbgenrestv", 'url': item.get("imdburl", ""), 'folder': True, 'imdb': "0", 'content': "files", 'season': "0", 'episode': "0", 'info': {}, 'year': "0", 'context': get_context_items(item), "summary": item.get("summary", None) } result_item["properties"] = { 'fanart_image': result_item["fanart"] } result_item['fanart_small'] = result_item["fanart"] return result_item elif "chart/" in item.get("imdburl", ""): result_item = { 'label': item["title"], 'icon': item.get("thumbnail", addon_icon), 'fanart': item.get("fanart", addon_fanart), 'mode': "imdbchart", 'url': item.get("imdburl", ""), 'folder': True, 'imdb': "0", 'content': "files", 'season': "0", 'episode': "0", 'info': {}, 'year': "0", 'context': get_context_items(item), "summary": item.get("summary", None) } result_item["properties"] = { 'fanart_image': result_item["fanart"] } result_item['fanart_small'] = result_item["fanart"] return result_item elif "charttv/" in item.get("imdburl", ""): result_item = { 'label': item["title"], 'icon': item.get("thumbnail", addon_icon), 'fanart': item.get("fanart", addon_fanart), 'mode': "imdbcharttv", 'url': item.get("imdburl", ""), 'folder': True, 'imdb': "0", 'content': "files", 'season': "0", 'episode': "0", 'info': {}, 'year': "0", 'context': get_context_items(item), "summary": item.get("summary", None) } result_item["properties"] = { 'fanart_image': result_item["fanart"] } result_item['fanart_small'] = result_item["fanart"] return result_item elif "searchmovies" in item.get("imdburl", ""): result_item = { 'label': item["title"], 'icon': item.get("thumbnail", addon_icon), 'fanart': item.get("fanart", addon_fanart), 'mode': "searchmovies", 'url': item.get("imdburl", ""), 'folder': True, 'imdb': "0", 'content': "files", 'season': "0", 'episode': "0", 'info': {}, 'year': "0", 'context': get_context_items(item), "summary": item.get("summary", None) } result_item["properties"] = { 'fanart_image': result_item["fanart"] } result_item['fanart_small'] = result_item["fanart"] return result_item elif "searchseries" in item.get("imdburl", ""): result_item = { 'label': item["title"], 'icon': item.get("thumbnail", addon_icon), 'fanart': item.get("fanart", addon_fanart), 'mode': "searchseries", 'url': item.get("imdburl", ""), 'folder': True, 'imdb': "0", 'content': "files", 'season': "0", 'episode': "0", 'info': {}, 'year': "0", 'context': get_context_items(item), "summary": item.get("summary", None) } result_item["properties"] = { 'fanart_image': result_item["fanart"] } result_item['fanart_small'] = result_item["fanart"] return result_item @route(mode='searchmovies', args=["url"]) def searchmovies(url): search_entered = '' keyboard = xbmc.Keyboard(search_entered, 'Search iMDB Movies') keyboard.doModal() if keyboard.isConfirmed(): search_entered = keyboard.getText().replace(' ','+') if len(search_entered)>1: url = 'http://www.imdb.com/search/title?title=' + search_entered progress = xbmcgui.DialogProgress() imdbmovies(url) @route(mode='searchseries', args=["url"]) def searchseries(url): search_entered = '' keyboard = xbmc.Keyboard(search_entered, 'Search iMDB Series') keyboard.doModal() if keyboard.isConfirmed(): search_entered = keyboard.getText().replace(' ','+') if len(search_entered)>1: url = 'http://www.imdb.com/search/title?title=' + search_entered + '&title_type=tv_series' progress = xbmcgui.DialogProgress() imdbseries(url) @route(mode='imdbmovies', args=["url"]) def imdbmovies(url): pins = "" xml = "" url = url.replace("movies/popular","http://www.imdb.com/search/title?title_type=feature,tv_movie&num_votes=1000,&production_status=released&groups=top_1000&sort=moviemeter,asc&count=40&start=1").replace("movies/voted","http://www.imdb.com/search/title?title_type=feature,tv_movie&num_votes=1000,&production_status=released&sort=num_votes,desc&count=40&start=1").replace("movies/trending","http://www.imdb.com/search/title?title_type=feature,tv_movie&num_votes=1000,&production_status=released&release_date=date[365],date[60]&sort=moviemeter,asc&count=40&start=1").replace("movies/boxoffice","http://www.imdb.com/search/title?title_type=feature,tv_movie&production_status=released&sort=boxoffice_gross_us,desc&count=40&start=1") listhtml = getHtml(url) match = re.compile( '.+?\n.+?\n.+?
\n

\n.+?.+?\n.+?\n.+?(.+?)\n.+?(.+?)', re.IGNORECASE | re.DOTALL).findall(listhtml) for thumbnail, imdb, title, year in match: name = title + " " + year year = year.replace("(","").replace(")","") thumbnail = thumbnail.replace("@._V1_UX67_CR0,0,67,98_AL_.jpg","@._V1_UX520_CR0,0,520,700_AL_.jpg") if not COLOR1 == "": name = "[COLOR %s]%s[/COLOR]" % (COLOR1, name) xml += ""\ "%s"\ ""\ "movie"\ "%s"\ "%s"\ "%s"\ ""\ ""\ "search"\ "searchsd"\ ""\ "%s"\ ""\ "" % (name, imdb, title, year, thumbnail) try: next_page = re.compile( 'Next »\n.+?

\n.+?
', re.DOTALL | re.IGNORECASE).findall(listhtml)[0] if not COLOR2 == "": myPage = "[COLOR %s]Next Page >>[/COLOR]" % COLOR2 else: myPage = "Next Page >>" xml += ""\ "%s"\ "http://www.imdb.com/search/title%s"\ "https://image.ibb.co/gtsNjw/next.png"\ "" % (myPage, next_page) except: pass jenlist = JenList(xml) display_list(jenlist.get_list(), jenlist.get_content_type(), pins) @route(mode='imdbseries', args=["url"]) def imdbseries(url): pins = "" xml = "" url = url.replace("tvshows/popular","http://www.imdb.com/search/title?title_type=tv_series,mini_series&num_votes=100,&release_date=,date[0]&sort=moviemeter,asc&count=40&start=1") url = url.replace("tvshows/new","http://www.imdb.com/search/title?title_type=tv_series,mini_series&languages=en&num_votes=10,&release_date=date[60],date[0]&sort=release_date,desc&count=40&start=1") url = url.replace("tvshows/rating","http://www.imdb.com/search/title?title_type=tv_series,mini_series&num_votes=5000,&release_date=,date[0]&sort=user_rating,desc&count=40&start=1") url = url.replace("tvshows/mostviews","http://www.imdb.com/search/title?title_type=tv_series,mini_series&num_votes=100,&release_date=,date[0]&sort=num_votes,desc&count=40&start=1") url = url.replace("tvshows/boxoffice","http://www.imdb.com/search/title?title_type=tv_series,mini_series&num_votes=100,&release_date=,date%5B0%5D&count=40&start=1&sort=boxoffice_gross_us,desc") url = url.replace("tvshows/alphabetical","http://www.imdb.com/search/title?title_type=tv_series,mini_series&num_votes=100,&release_date=,date%5B0%5D&count=40&start=1&sort=alpha,asc") listhtml = getHtml(url) match = re.compile( '.+?\n.+?\n.+?
\n

\n.+?.+?\n.+?\n.+?(.+?)\n.+?(.+?)', re.IGNORECASE | re.DOTALL).findall(listhtml) for thumbnail, imdb, title, year in match: name = title + " " + year year = year.replace("(","").replace(")","") thumbnail = thumbnail.replace("@._V1_UX67_CR0,0,67,98_AL_.jpg","@._V1_UX520_CR0,0,520,700_AL_.jpg") if not COLOR1 == "": name = "[COLOR %s]%s[/COLOR]" % (COLOR1, name) xml += ""\ "%s"\ ""\ "tvshow"\ "%s"\ "season/%s"\ ""\ "%s"\ "%s"\ ""\ ""\ "%s"\ ""\ "" % (name, imdb, imdb, title, year, thumbnail) try: next_page = re.compile( 'Next »\n.+?

\n.+?
', re.DOTALL | re.IGNORECASE).findall(listhtml)[0] if not COLOR2 == "": myPage = "[COLOR %s]Next Page >>[/COLOR]" % COLOR2 else: myPage = "Next Page >>" xml += ""\ "%s"\ "http://www.imdb.com/search/title%s"\ "https://image.ibb.co/gtsNjw/next.png"\ "" % (myPage, next_page) except: pass jenlist = JenList(xml) display_list(jenlist.get_list(), jenlist.get_content_type(), pins) @route(mode='imdbseason', args=["url"]) def imdbseason(url): pins = "" xml = "" url = url.replace("season/","title/") url = 'http://www.imdb.com/' + url listhtml = getHtml(url) match = re.compile( 'href="/title/(.+?)/episodes.+?season=.+?&ref_=tt_eps_sn_.+?"\n>(.+?)', re.IGNORECASE | re.DOTALL).findall(listhtml) match2 = re.compile( '

Years


\n.+?\n.+?
\n.+?
\n.+?(.+?)  ', re.IGNORECASE | re.DOTALL).findall(listhtml) #match3 = re.compile('
\n.+?
.+?