The branch, dharma has been updated
via c0d44f9ce0a714408c381645181b4d642a57fe10 (commit)
from cbca85bbff457febb8448a928f8ac877fbc91eb7 (commit)
- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=c0d44f9ce0a714408c381645181b4d642a57fe10
commit c0d44f9ce0a714408c381645181b4d642a57fe10
Author: spiff <sp...@xbmc.org>
Date: Thu Dec 30 13:05:39 2010 +0100
[plugin.video.xbmcflicks] updated to version 1.0.10
diff --git a/plugin.video.xbmcflicks/addon.xml
b/plugin.video.xbmcflicks/addon.xml
index 1d609c1..0ef7908 100644
--- a/plugin.video.xbmcflicks/addon.xml
+++ b/plugin.video.xbmcflicks/addon.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="plugin.video.xbmcflicks"
name="XBMC Flicks - Netflix for XBMC"
- version="1.0.8"
+ version="1.0.10"
provider-name="TeamUMX">
<requires>
<import addon="xbmc.python" version="1.0"/>
@@ -14,6 +14,6 @@
<extension point="xbmc.addon.metadata">
<platform>windx wingl osx</platform>
<summary lang="en">XBMC Flicks</summary>
- <description lang="en">Netflix for XBMC.. NOTE: This plugin will
create the playercorefactory.xml and advanced settings.xml, if you already have
an external player configured, you will need to modify it to add in IE as a
player. Examples of those files are in the resources folder.
+ <description lang="en">Netflix for XBMC.. NOTE: This plugin will
create the playercorefactory.xml and advanced settings.xml, if you already have
an external player configured, you will need to modify it to add in IE as a
player. Examples of those files are in the resources folder.</description>
</extension>
</addon>
diff --git a/plugin.video.xbmcflicks/changelog.txt
b/plugin.video.xbmcflicks/changelog.txt
index 90bf9e0..9e7c8d1 100644
--- a/plugin.video.xbmcflicks/changelog.txt
+++ b/plugin.video.xbmcflicks/changelog.txt
@@ -2,3 +2,5 @@
1.0.6 - Added images for folders in the main menu
1.0.7 - fixed path issue within the plugin and git repo, fixed issue with
missing userinfo.txt and missing links folder
1.0.8 - changed icon for app, add'd diff for redundant text, added automatic
create of playercorefactory and advancedsettings based on os path info
+1.0.9 - Added Disc Menu and Rental History
+1.0.10 - fixed missing xml tag that was stopping the addon from loading
\ No newline at end of file
diff --git a/plugin.video.xbmcflicks/resources/lib/Netflix.py
b/plugin.video.xbmcflicks/resources/lib/Netflix.py
index 840a38b..783ef96 100644
--- a/plugin.video.xbmcflicks/resources/lib/Netflix.py
+++ b/plugin.video.xbmcflicks/resources/lib/Netflix.py
@@ -25,8 +25,7 @@ class NetflixUser:
self.requestTokenUrl = REQUEST_TOKEN_URL
self.accessTokenUrl = ACCESS_TOKEN_URL
self.authorizationUrl = AUTHORIZATION_URL
- self.accessToken = oauth.OAuthToken( user['access']['key'],
- user['access']['secret'] )
+ self.accessToken = oauth.OAuthToken(user['access']['key'],
user['access']['secret'] )
self.client = client
self.data = None
@@ -61,9 +60,7 @@ class NetflixUser:
client = self.client
if not isinstance(requestToken, oauth.OAuthToken):
- requestToken = oauth.OAuthToken(
- requestToken['key'],
- requestToken['secret'] )
+ requestToken = oauth.OAuthToken(requestToken['key'],
requestToken['secret'] )
oauthRequest = oauth.OAuthRequest.from_consumer_and_token(
client.consumer,
token=requestToken,
@@ -82,15 +79,11 @@ class NetflixUser:
accessToken=self.accessToken
if not isinstance(accessToken, oauth.OAuthToken):
- accessToken = oauth.OAuthToken(
- accessToken['key'],
- accessToken['secret'] )
+ accessToken = oauth.OAuthToken(accessToken['key'],
accessToken['secret'] )
requestUrl = '/users/%s' % (accessToken.key)
- info = simplejson.loads( self.client._getResource(
- requestUrl,
- token=accessToken ) )
+ info = simplejson.loads( self.client._getResource(requestUrl,
token=accessToken ) )
self.data = info['user']
return self.data
@@ -114,8 +107,7 @@ class NetflixUser:
print errorString
sys.exit(1)
try:
- info = simplejson.loads(self.client._getResource(
- url,token=accessToken ))
+ info =
simplejson.loads(self.client._getResource(url,token=accessToken ))
except:
return []
else:
@@ -138,10 +130,7 @@ class NetflixUser:
urls.append(discInfo['id'])
parameters = { 'title_refs': ','.join(urls) }
- info = simplejson.loads( self.client._getResource(
- requestUrl,
- parameters=parameters,
- token=accessToken ) )
+ info = simplejson.loads( self.client._getResource(requestUrl,
parameters=parameters, token=accessToken ) )
ret = {}
for title in info['ratings']['ratings_item']:
@@ -158,7 +147,7 @@ class NetflixUser:
return ret
- def getRentalHistory(self,historyType=None,startIndex=None,
+ def getRentalHistoryv1(self,historyType=None,startIndex=None,
maxResults=None,updatedMin=None):
accessToken=self.accessToken
parameters = {}
@@ -170,9 +159,7 @@ class NetflixUser:
parameters['updated_min'] = updatedMin
if not isinstance(accessToken, oauth.OAuthToken):
- accessToken = oauth.OAuthToken(
- accessToken['key'],
- accessToken['secret'] )
+ accessToken = oauth.OAuthToken(accessToken['key'],
accessToken['secret'] )
if not historyType:
requestUrl = '/users/%s/rental_history' % (accessToken.key)
@@ -180,10 +167,36 @@ class NetflixUser:
requestUrl = '/users/%s/rental_history/%s' %
(accessToken.key,historyType)
try:
- info = simplejson.loads( self.client._getResource(
- requestUrl,
- parameters=parameters,
- token=accessToken ) )
+ info = simplejson.loads( self.client._getResource(requestUrl,
parameters=parameters, token=accessToken ) )
+ except:
+ return {}
+
+ return info
+
+ def getRentalHistory(self,historyType=None,startIndex=None,
maxResults=None,updatedMin=None):
+ accessToken=self.accessToken
+ parameters = {}
+ if startIndex:
+ parameters['start_index'] = startIndex
+ if maxResults:
+ parameters['max_results'] = maxResults
+ if updatedMin:
+ parameters['updated_min'] = updatedMin
+
+ parameters['v'] = str('2.0')
+ parameters['expand'] =
'@title,@synopsis,@directors,@formats,@episodes,@short_synopsis'
+ parameters['output'] = 'json'
+
+ if not isinstance(accessToken, oauth.OAuthToken):
+ accessToken = oauth.OAuthToken(accessToken['key'],
accessToken['secret'] )
+ #history type must be: NULL, shipped, returned, or watched
+ if not historyType:
+ requestUrl = '/users/%s/rental_history' % (accessToken.key)
+ else:
+ requestUrl = '/users/%s/rental_history/%s' %
(accessToken.key,historyType)
+
+ try:
+ info = simplejson.loads( self.client._getResource(requestUrl,
parameters=parameters, token=accessToken ) )
except:
return {}
@@ -206,9 +219,7 @@ class NetflixUser:
parameters['output'] = 'json'
if not isinstance(accessToken, oauth.OAuthToken):
- accessToken = oauth.OAuthToken(
- accessToken['key'],
- accessToken['secret'] )
+ accessToken = oauth.OAuthToken(accessToken['key'],
accessToken['secret'] )
if not historyType:
requestUrl = '/users/%s/queues/instant/available' %
(accessToken.key)
@@ -216,16 +227,13 @@ class NetflixUser:
requestUrl = '/users/%s/queues/instant/available/%s' %
(accessToken.key,historyType)
try:
- info = simplejson.loads( self.client._getResource(
- requestUrl,
- parameters=parameters,
- token=accessToken ) )
+ info = simplejson.loads( self.client._getResource(requestUrl,
parameters=parameters, token=accessToken ) )
except:
return {}
return info
- def
getRecommendedQueue(self,startIndex=None,maxResults=None,updatedMin=None):
+ def
getDiscQueue(self,historyType=None,startIndex=None,maxResults=None,updatedMin=None):
accessToken=self.accessToken
parameters = {}
if startIndex:
@@ -234,26 +242,83 @@ class NetflixUser:
parameters['max_results'] = maxResults
if updatedMin:
parameters['updated_min'] = updatedMin
+
parameters['v'] = str('2.0')
- parameters['filters'] =
'http://api.netflix.com/categories/title_formats/instant'
- parameters['expand'] =
'@title,@cast,@synopsis,@directors,@formats,@episodes,@short_synopsis'
+ #parameters['filters'] =
'http://api.netflix.com/categories/title_formats/disc'
+ parameters['expand'] =
'@title,@synopsis,@directors,@formats,@episodes,@short_synopsis'
parameters['output'] = 'json'
+
+ if not isinstance(accessToken, oauth.OAuthToken):
+ accessToken = oauth.OAuthToken(accessToken['key'],
accessToken['secret'] )
+
+ if not historyType:
+ requestUrl = '/users/%s/queues/disc' % (accessToken.key)
+ else:
+ requestUrl = '/users/%s/queues/disc/available/%s' %
(accessToken.key,historyType)
+
+ try:
+ info = simplejson.loads( self.client._getResource(requestUrl,
parameters=parameters, token=accessToken ) )
+ except:
+ return {}
+
+ return info
+
+ def getAtHomeList(self,historyType=None,startIndex=None,
+ maxResults=None,updatedMin=None):
+ accessToken=self.accessToken
+ parameters = {}
+ if startIndex:
+ parameters['start_index'] = startIndex
+ if maxResults:
+ parameters['max_results'] = maxResults
+ if updatedMin:
+ parameters['updated_min'] = updatedMin
+ parameters['v'] = str('2.0')
+ parameters['filters'] =
'http://api.netflix.com/categories/title_formats/instant'
+ parameters['expand'] =
'@title,@synopsis,@directors,@formats,@episodes,@short_synopsis'
+ parameters['output'] = 'json'
+
if not isinstance(accessToken, oauth.OAuthToken):
accessToken = oauth.OAuthToken(
accessToken['key'],
accessToken['secret'] )
+ #if not historyType:
+ requestUrl = '/users/%s/at_home' % (accessToken.key)
+ #else:
+ # requestUrl = '/users/%s/queues/instant/available/%s' %
(accessToken.key,historyType)
+
+ try:
+ info = simplejson.loads( self.client._getResource(requestUrl,
parameters=parameters, token=accessToken ) )
+ except:
+ return {}
+
+ return info
+
+ def
getRecommendedQueue(self,startIndex=None,maxResults=None,updatedMin=None):
+ accessToken=self.accessToken
+ parameters = {}
+ if startIndex:
+ parameters['start_index'] = startIndex
+ if maxResults:
+ parameters['max_results'] = maxResults
+ if updatedMin:
+ parameters['updated_min'] = updatedMin
+ parameters['v'] = str('2.0')
+ parameters['filters'] =
'http://api.netflix.com/categories/title_formats/instant'
+ parameters['expand'] =
'@title,@cast,@synopsis,@directors,@formats,@episodes,@short_synopsis'
+ parameters['output'] = 'json'
+
+ if not isinstance(accessToken, oauth.OAuthToken):
+ accessToken = oauth.OAuthToken(accessToken['key'],
accessToken['secret'] )
+
requestUrl = '/users/%s/recommendations' % (accessToken.key)
try:
- info = simplejson.loads( self.client._getResource(
- requestUrl,
- parameters=parameters,
- token=accessToken ) )
+ info = simplejson.loads( self.client._getResource(requestUrl,
parameters=parameters, token=accessToken ) )
except:
return {}
- #print str(simplejson.dumps(info,indent=4))
return info
#http://api.netflix.com/catalog/titles/series/60030529/seasons/60030679/episodes
@@ -269,10 +334,7 @@ class NetflixUser:
requestUrl = '/catalog/titles/series/' + str(seriesId) + '/seasons/' +
str(seasonId) + "/episodes"
try:
- info = simplejson.loads( self.client._getResource(
- requestUrl,
- parameters=parameters,
- token=accessToken ) )
+ info = simplejson.loads( self.client._getResource(requestUrl,
parameters=parameters, token=accessToken ) )
except:
return {}
@@ -288,23 +350,18 @@ class NetflixUser:
parameters['filters'] =
'http://api.netflix.com/categories/title_formats/instant'
if not isinstance(accessToken, oauth.OAuthToken):
- accessToken = oauth.OAuthToken(
- accessToken['key'],
- accessToken['secret'] )
+ accessToken = oauth.OAuthToken(accessToken['key'],
accessToken['secret'] )
requestUrl = '/catalog/titles/movies/' + str(ID) + '/similars'
print requestUrl
try:
- info = simplejson.loads( self.client._getResource(
- requestUrl,
- parameters=parameters,
- token=accessToken ) )
+ info = simplejson.loads( self.client._getResource(requestUrl,
parameters=parameters, token=accessToken ) )
except:
return {}
return info
- def searchTitles(self, term,startIndex=None,maxResults=None):
+ def searchTitles(self, term, queue, startIndex=None,maxResults=None):
requestUrl = '/catalog/titles'
parameters = {'term': term}
if startIndex:
@@ -313,12 +370,10 @@ class NetflixUser:
parameters['max_results'] = maxResults
parameters['v'] = str('2.0')
- parameters['filters'] =
'http://api.netflix.com/categories/title_formats/instant'
- parameters['expand'] =
'@title,@cast,@synopsis,@directors,@formats,@episodes,@short_synopsis'
+ parameters['filters'] =
'http://api.netflix.com/categories/title_formats/' + queue
+ parameters['expand'] =
'@title,@synopsis,@directors,@formats,@episodes,@short_synopsis'
parameters['output'] = 'json'
- info = simplejson.loads( self.client._getResource(
- requestUrl,
- parameters=parameters))
+ info = simplejson.loads( self.client._getResource(requestUrl,
parameters=parameters))
return info
def modifyQueue(self, ID, method):
@@ -329,20 +384,38 @@ class NetflixUser:
if (method == "post"):
parameters['title_ref'] =
'http://api.netflix.com/catalog/titles/movies/' + str(ID)
if not isinstance(accessToken, oauth.OAuthToken):
- accessToken = oauth.OAuthToken(
- accessToken['key'],
- accessToken['secret'] )
+ accessToken = oauth.OAuthToken(accessToken['key'],
accessToken['secret'] )
if (method == "post"):
requestUrl = '/users/'+ accessToken.key +
'/queues/instant/available'
else:
requestUrl = '/users/'+ accessToken.key +
'/queues/instant/available/' + str(ID)
+ try:
+ info = simplejson.loads( self.client._getResource(requestUrl,
parameters=parameters, token=accessToken ) )
+ except:
+ return {}
+
+ return info
+
+ def modifyQueueDisc(self, ID, method, position=None):
+ accessToken=self.accessToken
+ parameters = {}
+ #to add, use Post, to remove use Delete
+ parameters['method'] = method
+ if(position):
+ parameters['position'] = str(position)
+ if (method == "post"):
+ parameters['title_ref'] =
'http://api.netflix.com/catalog/titles/movies/' + str(ID)
+ if not isinstance(accessToken, oauth.OAuthToken):
+ accessToken = oauth.OAuthToken(accessToken['key'],
accessToken['secret'] )
+
+ if (method == "post"):
+ requestUrl = '/users/'+ accessToken.key + '/queues/disc/available'
+ else:
+ requestUrl = '/users/'+ accessToken.key +
'/queues/disc/available/' + str(ID)
print "------- REQUESTED URL IS: " + requestUrl
try:
- info = simplejson.loads( self.client._getResource(
- requestUrl,
- parameters=parameters,
- token=accessToken ) )
+ info = simplejson.loads( self.client._getResource(requestUrl,
parameters=parameters, token=accessToken ) )
except:
return {}
diff --git a/plugin.video.xbmcflicks/resources/lib/iqueue.py
b/plugin.video.xbmcflicks/resources/lib/iqueue.py
index 05206c2..19f1210 100644
--- a/plugin.video.xbmcflicks/resources/lib/iqueue.py
+++ b/plugin.video.xbmcflicks/resources/lib/iqueue.py
@@ -144,19 +144,56 @@ def addLink(name,url,curX,rootID=None):
runnerSearch =
"XBMC.RunScript(special://home/addons/plugin.video.xbmcflicks/resources/lib/modQueue.py,
" + argsSimilar + ")"
if(not curX.TvEpisode):
- commands.append(( 'Netflix: Add to Queue', runnerAdd, ))
- commands.append(( 'Netflix: Remove From Queue', runnerRemove, ))
+ commands.append(( 'Netflix: Add to Instant Queue', runnerAdd, ))
+ commands.append(( 'Netflix: Remove From Instant Queue', runnerRemove,
))
#commands.append(( 'Netflix: Find Similar', runnerSearch, ))
else:
- commands.append(( 'Netflix: Add Entire Season to Queue', runnerAdd, ))
- commands.append(( 'Netflix: Remove Entire Season From Queue',
runnerRemove, ))
+ commands.append(( 'Netflix: Add Entire Season to Instant Queue',
runnerAdd, ))
+ commands.append(( 'Netflix: Remove Entire Season From Instant Queue',
runnerRemove, ))
liz.addContextMenuItems( commands )
whichHandler = sys.argv[1]
ok=xbmcplugin.addDirectoryItem(handle=int(whichHandler),url=url,listitem=liz,
isFolder=False)
return ok
+
+def addLinkDisc(name,url,curX,rootID=None):
+ ok=True
+ liz=xbmcgui.ListItem(name, iconImage="DefaultVideo.png",
thumbnailImage=curX.Poster)
+ #if(xSummary):
+ liz.setInfo( type="Video", infoLabels={ "Mpaa": curX.Mpaa, "TrackNumber":
int(curX.Position), "Year": int(curX.Year), "OriginalTitle": curX.Title,
"Title": curX.TitleShort, "Rating": float(curX.Rating)*2, "Duration":
str(int(curX.Runtime)/60), "Director": curX.Directors, "Genre": curX.Genres,
"CastAndRole": curX.Cast, "Plot": curX.Synop })
+
+ commands = []
+ url = REAL_LINK_PATH + curX.ID + '_disc.html'
+ argsRemove = str(curX.ID) + "discdelete"
+ argsAdd = str(curX.ID) + "discpost"
+ argsAddTop = str(curX.ID) + "disctoppost"
+ argsSimilar = str(curX.ID)
+ if rootID:
+ argsRemove = str(rootID) + "discdelete"
+ argsAdd = str(rootID) + "discpost"
+ argsSimilar = str(rootID)
+ runnerRemove =
"XBMC.RunScript(special://home/addons/plugin.video.xbmcflicks/resources/lib/modQueue.py,
" + argsRemove + ")"
+ runnerAdd =
"XBMC.RunScript(special://home/addons/plugin.video.xbmcflicks/resources/lib/modQueue.py,
" + argsAdd + ")"
+ runnerAddTop =
"XBMC.RunScript(special://home/addons/plugin.video.xbmcflicks/resources/lib/modQueue.py,
" + argsAddTop + ")"
+ runnerSearch =
"XBMC.RunScript(special://home/addons/plugin.video.xbmcflicks/resources/lib/modQueue.py,
" + argsSimilar + ")"
+
+ if(not curX.TvEpisode):
+ commands.append(( 'Netflix: Add to Disc Queue', runnerAdd, ))
+ commands.append(( 'Netflix: Remove From Disc Queue', runnerRemove, ))
+ commands.append(( 'Netflix: Add to Top of Disc Queue', runnerAddTop, ))
+ else:
+ commands.append(( 'Netflix: Add Season to Disc Queue', runnerAdd, ))
+ commands.append(( 'Netflix: Remove Season From Disc Queue',
runnerRemove, ))
+ commands.append(( 'Netflix: Add to Top of Disc Queue', runnerAddTop, ))
+
+ liz.addContextMenuItems( commands )
+ whichHandler = sys.argv[1]
+
ok=xbmcplugin.addDirectoryItem(handle=int(whichHandler),url=url,listitem=liz,
isFolder=False)
+
+ return ok
+
def writeLinkFile(id, title):
#check to see if we already have the file
havefile = os.path.isfile(LINKS_FOLDER + id + '.html')
@@ -170,6 +207,20 @@ def writeLinkFile(id, title):
f.write(redirect)
f.close()
+#writeDiscLinkFile
+def writeDiscLinkFile(id, title, webURL):
+ #check to see if we already have the file
+ havefile = os.path.isfile(LINKS_FOLDER + id + '_disc.html')
+ if(not havefile):
+ #create the file
+ player = "WiPlayerCommunityAPI"
+ if(useAltPlayer):
+ player = "WiPlayer"
+ redirect = "<!doctype html public \"-//W3C//DTD HTML 4.0
Transitional//EN\"><html><head><title>Requesting Video: " + title +
"</title><meta http-equiv=\"REFRESH\" content=\"0;url=" + webURL +
"\"></head><body bgcolor=\"#0000cc\"> <p>Redirecting to Netflix in a moment
...</p></body></html>"
+ f = open(LINKS_FOLDER + id + '_disc.html','r+')
+ f.write(redirect)
+ f.close()
+
def checkFormat(netflix, curX):
strLinkUrl = "http://api.netflix.com/catalog/titles/movies/" + curX.ID
try:
@@ -243,22 +294,43 @@ def availableTimeRemaining(expires):
return ""
def getMovieDataFromFeed(curX, curQueueItem, bIsEpisode, netflix,
instantAvail, intDisplayWhat=None):
+ #if display what = 0, will only show instant queue items
#if display what = 1, will only display movies
#if display what = 2, will only display tv shows
- #if the value is not set, everything is shown
+ #if display what = 3, working with Movies in Disc Queue
+ #if display what = 4, working with TvShows in Disc Queue
+ #if display what = 5, working with Everything in Disc Queue
+ #if the value is not set, everything is shown (instant queue items)
showTvShow = True
showMovies = True
-
+ discQueue = False
+
if intDisplayWhat:
+ if (int(intDisplayWhat) == 0):
+ discQueue = False
if (int(intDisplayWhat) == 1):
showTvShow = False
if (int(intDisplayWhat) == 2):
showMovies = False
-
+ if (int(intDisplayWhat) == 3):
+ discQueue = True
+ if (int(intDisplayWhat) == 4):
+ showTvShow = False
+ discQueue = True
+ if (int(intDisplayWhat) == 5):
+ showMovies = False
+ discQueue = True
+
+ if(instantAvail):
+ discQueue = False
+
#if it's a tv show it should be a folder, not a listing
if re.search(r"{(u'episode_short'.*?)}", curQueueItem, re.DOTALL |
re.MULTILINE):
curX.TvShow = True
+ if re.search(r"u'name': u'Television'", curQueueItem, re.IGNORECASE):
+ curX.TvShow = True
+
if (curX.TvShow):
if(not showTvShow):
return curX
@@ -311,12 +383,13 @@ def getMovieDataFromFeed(curX, curQueueItem, bIsEpisode,
netflix, instantAvail,
#check rating against max rating
if (not int(iRating) <= int(MAX_RATING)):
+ print "Item failed rating check, not adding.."
return curX
#genre
matchGenre = re.search(r"genres': \[?{.*?u'name': u'(.*?)'}",
curQueueItem, re.DOTALL | re.MULTILINE)
if matchGenre:
- curX.Genres = matchGenre.group(1).strip()
+ curX.Genres = matchGenre.group(1).strip()
#year
matchYear = re.search(r'[\'"]release_year[\'"]: u{0,1}[\'"](\d{4})[\'"]',
curQueueItem)
@@ -350,6 +423,9 @@ def getMovieDataFromFeed(curX, curQueueItem, bIsEpisode,
netflix, instantAvail,
if matchAvailUntil:
curX.AvailableUntil = matchAvailUntil.group(1)
+ matchWebURL = re.search(r"u'web_page': u'(.*?)'", curQueueItem)
+ if matchWebURL:
+ curX.WebURL = matchWebURL.group(1)
#shorttitle
matchTitleShort = re.search('[\'"]title[\'"]:
{.*?[\'"](title_)?short[\'"]: u{0,1}[\'"](.*?)[\'"].*?},', curQueueItem,
re.DOTALL | re.MULTILINE)
@@ -461,6 +537,12 @@ def getMovieDataFromFeed(curX, curQueueItem, bIsEpisode,
netflix, instantAvail,
if (VERBOSE_USER_LOG):
print "curFullId: " + curX.FullId
+ if (discQueue):
+ addLinkDisc(curX.TitleShort,REAL_LINK_PATH + curX.TitleShortLink +
'.html', curX)
+ #write the link file for Disc items that will link to the webpage
+ writeDiscLinkFile(curX.TitleShortLink, curX.Title, curX.WebURL)
+ return curX
+
if (instantAvail):
#need to verify it's available for instant watching before adding
matchIA = re.search(r"delivery_formats': {(.*?instant.*?)}",
curQueueItem, re.DOTALL | re.MULTILINE)
@@ -559,6 +641,39 @@ def addDir(name,url,mode,iconimage,data):
ok=xbmcplugin.addDirectoryItem(handle=int(whichHandler),url=u,listitem=liz,isFolder=True)
return ok
+def getUserDiscQueue(netflix,user,displayWhat):
+ print "*** What's in the Disc Queue? ***"
+ feeds = netflix.user.getDiscQueue(None,None,500)
+ if (VERBOSE_USER_LOG):
+ print feeds
+
+ counter = 0
+ reobj = re.compile(r"(?sm)(?P<main>('item': )((?!('item': )).)*)",
re.DOTALL | re.MULTILINE)
+ #real processing begins here
+ for match in reobj.finditer(str(feeds)):
+ curX = XInfo()
+ curQueueItem = match.group(1)
+
+ #now parse out each item
+ curX = getMovieDataFromFeed(curX, curQueueItem, False, netflix,
False,displayWhat)
+
+def getUserAtHomeItems(netflix,user):
+ print "*** What's Disc from the Queue are shipped or at the home? ***"
+ feeds = netflix.user.getAtHomeList(None,None,500)
+ if (VERBOSE_USER_LOG):
+ print feeds
+
+ counter = 0
+ reobj = re.compile(r"(?sm)(?P<main>('item': )((?!('item': )).)*)",
re.DOTALL | re.MULTILINE)
+ #real processing begins here
+ for match in reobj.finditer(str(feeds)):
+ curX = XInfo()
+ curQueueItem = match.group(1)
+
+ #now parse out each item
+ curX = getMovieDataFromFeed(curX, curQueueItem, False, netflix, False)
+
+
def getUserInstantQueue(netflix,user, displayWhat):
print "*** What's in the Instant Queue? ***"
#get user setting for max number to download
@@ -635,6 +750,7 @@ def parseRSSFeedItem(curQueueItem, curX):
curX.Title = match.group(1)
curX.TitleShort = match.group(1)
curX.Synop = match.group(3)
+ curX.WebURL = match.group(2)
reobj = re.compile(r".*?/(\d{1,15})", re.DOTALL | re.MULTILINE)
matchID = reobj.search(match.group(2))
if matchID:
@@ -645,13 +761,13 @@ def parseRSSFeedItem(curQueueItem, curX):
print "error parsing data from RSS feed Item"
return curX
-def convertRSSFeed(tData, intLimit):
+def convertRSSFeed(tData, intLimit, DiscQueue=None):
#parse feed to curX object
curX = XInfo()
intCount = 0
for match in re.finditer(r"(?sm)<item>(.*?)</item>", tData):
intCount = intCount + 1
- print str(intCount)
+ #print str(intCount)
if(intCount > int(intLimit)):
return
@@ -663,10 +779,33 @@ def convertRSSFeed(tData, intLimit):
exit
#add the link to the UI
- addLink(curX.TitleShort,REAL_LINK_PATH + curX.ID + '.html', curX)
-
- #write the link file
- writeLinkFile(curX.ID, curX.Title)
+ if(DiscQueue):
+ addLinkDisc(curX.TitleShort,REAL_LINK_PATH + curX.ID +
'_disc.html', curX)
+ writeDiscLinkFile(curX.ID, curX.Title, curX.WebURL)
+ else:
+ addLink(curX.TitleShort,REAL_LINK_PATH + curX.ID + '.html', curX)
+ #write the link file
+ writeLinkFile(curX.ID, curX.Title)
+
+def getUserRentalHistory(netflix, user, strHistoryType, displayWhat=None):
+ print "*** What's the rental history? ***"
+ feeds = ""
+ if(not strHistoryType):
+ feeds = netflix.user.getRentalHistory(None,None,500)
+ else:
+ feeds = netflix.user.getRentalHistory(strHistoryType,None,500)
+
+ if (VERBOSE_USER_LOG):
+ print feeds
+
+ counter = 0
+ reobj = re.compile(r"(?sm)(?P<main>('item': )((?!('item': )).)*)",
re.DOTALL | re.MULTILINE)
+ #real processing begins here
+ for match in reobj.finditer(str(feeds)):
+ curX = XInfo()
+ curQueueItem = match.group(1)
+ #now parse out each item
+ curX = getMovieDataFromFeed(curX, curQueueItem, False, netflix, False,
displayWhat)
CUR_IMAGE_MIRROR_NUM = 0
@@ -778,11 +917,11 @@ def initApp():
MY_USER['request']['key'] = match.group(1).strip()
MY_USER['request']['secret'] = match.group(2).strip()
MY_USER['access']['key'] = match.group(3).strip()
- MY_USER['access']['secret'] = match.group(4).strip()
- print "finished loading up user information from file"
+ MY_USER['access']['secret'] = match.group(4).strip()
+ print "finished loading up user information from file"
else:
#no match, need to fire off the user auth from the start
- print "couldn't load user information from userinfo.properties file"
+ print "couldn't load user information from userinfo.properties file"
#auth the user
netflixClient = NetflixClient(APP_NAME, API_KEY, API_SECRET, CALLBACK,
VERBOSE_USER_LOG)
user = getAuth(netflixClient,VERBOSE_USER_LOG)
@@ -834,14 +973,30 @@ def getTop25Feed(strArg):
time.sleep(1)
xbmcplugin.setContent(int(sys.argv[1]),'Movies')
xbmcplugin.endOfDirectory(int(sys.argv[1]))
-
-def doSearch(strArg):
+
+def getTop25FeedD(strArg):
+ initApp()
+ curUrl = "http://rss.netflix.com/Top25RSS?gid=" + str(strArg)
+ convertRSSFeed(getUrlString(curUrl), 25, True)
+ time.sleep(1)
+ xbmcplugin.setContent(int(sys.argv[1]),'Movies')
+ xbmcplugin.endOfDirectory(int(sys.argv[1]))
+
+def doSearch(strArg, strQueue, strInstantOnly=None):
+ instantOnly = False
+ strType = "3"
+ if(strInstantOnly):
+ instantOnly = True
+ strType = "5"
#title search
- print "looking for instant view items that match %s" % strArg
+ print "looking for items that match " + str(strArg ) + " in " +
str(strQueue) + " instant only is set to: " + str(instantOnly)
initApp()
+ print "Instant set to: " + str(instantOnly)
+ print "Queue set to: " + str(strQueue)
+ print "Search String is: " + str(strQueue)
if(not user):
exit
- feeds = netflixClient.user.searchTitles(strArg,0,100)
+ feeds = netflixClient.user.searchTitles(strArg,strQueue,0,100)
if(DEBUG):
print simplejson.dumps(feeds,indent=4)
counter = 0
@@ -853,7 +1008,52 @@ def doSearch(strArg):
if(DEBUG):
print "current queue item from regex is: " + str(curQueueItem)
#now parse out each item
- curX = getMovieDataFromFeed(curX, curQueueItem, False, netflixClient,
True)
+ curX = getMovieDataFromFeed(curX, curQueueItem, False, netflixClient,
instantOnly, strType)
+ time.sleep(1)
+ xbmcplugin.setContent(int(sys.argv[1]),'Movies')
+ xbmcplugin.endOfDirectory(int(sys.argv[1]))
+
+def getDVDQueue(displayWhat):
+ initApp()
+ getUserDiscQueue(netflixClient,user, displayWhat)
+ if(not user):
+ exit
+ time.sleep(1)
+ xbmcplugin.setContent(int(sys.argv[1]),'Movies')
+ xbmcplugin.endOfDirectory(int(sys.argv[1]))
+
+def rhShipped():
+ initApp()
+ getUserRentalHistory(netflixClient,user, "shipped", "3")
+ if(not user):
+ exit
+ time.sleep(1)
+ xbmcplugin.setContent(int(sys.argv[1]),'Movies')
+ xbmcplugin.endOfDirectory(int(sys.argv[1]))
+
+def rhReturned():
+ initApp()
+ getUserRentalHistory(netflixClient,user, "returned", "3")
+ if(not user):
+ exit
+ time.sleep(1)
+ xbmcplugin.setContent(int(sys.argv[1]),'Movies')
+ xbmcplugin.endOfDirectory(int(sys.argv[1]))
+
+def rhWatched():
+ initApp()
+ getUserRentalHistory(netflixClient,user, "watched")
+ if(not user):
+ exit
+ time.sleep(1)
+ xbmcplugin.setContent(int(sys.argv[1]),'Movies')
+ xbmcplugin.endOfDirectory(int(sys.argv[1]))
+
+def getHomeList():
+ initApp()
+ getUserAtHomeItems(netflixClient,user)
+ if(not user):
+ exit
time.sleep(1)
xbmcplugin.setContent(int(sys.argv[1]),'Movies')
xbmcplugin.endOfDirectory(int(sys.argv[1]))
diff --git a/plugin.video.xbmcflicks/resources/lib/menu.py
b/plugin.video.xbmcflicks/resources/lib/menu.py
index b08599e..ff22ea8 100644
--- a/plugin.video.xbmcflicks/resources/lib/menu.py
+++ b/plugin.video.xbmcflicks/resources/lib/menu.py
@@ -4,6 +4,8 @@ import urllib
from iqueue import *
# plugin modes
+MODE0iw = 0
+MODE0d = 1
MODE1 = 10
MODE1a = 11
MODE1b = 12
@@ -46,17 +48,54 @@ MODE7r = 98
MODE7s = 99
MODE7t = 100
+MODED1 = 500
+MODED1m = 510
+MODED1t = 520
+
+MODED2 = 600
+MODED3 = 700
+
+MODED7 = 800
+MODED7a = 801
+MODED7b = 802
+MODED7c = 803
+MODED7d = 804
+MODED7e = 805
+MODED7f = 806
+MODED7g = 807
+MODED7h = 808
+MODED7i = 809
+MODED7j = 810
+MODED7k = 811
+MODED7l = 812
+MODED7m = 813
+MODED7n = 814
+MODED7o = 815
+MODED7p = 816
+MODED7q = 817
+MODED7r = 818
+MODED7s = 819
+MODED7t = 820
+
+MODER = 900
+MODER1 = 901
+MODER2 = 902
+MODER3 = 903
+
# parameter keys
PARAMETER_KEY_MODE = "mode"
# menu item names
-SUBMENU1 = "My Instant Queue - ALL"
-SUBMENU1a = "My Instant Queue - Movies"
-SUBMENU1b = "My Instant Queue - TV Shows"
-SUBMENU2 = "Recommended (Filtered for Instant Watch)"
-SUBMENU3 = "All New Movies & Shows"
+SUBMENU0iw = "Instant Movies and Shows"
+SUBMENU0d = "Disc by Mail"
+
+SUBMENU1 = "Instant Queue: All"
+SUBMENU1a = "Instant Queue: Movies"
+SUBMENU1b = "Instant Queue: TV"
+SUBMENU2 = "Recommended"
+SUBMENU3 = "All New Arrivals"
SUBMENU4 = "Search..."
-SUBMENU5 = "Top 25 New Movies & Shows"
+SUBMENU5 = "Top 25 New Arrivals"
SUBMENU6 = "By Genre"
SUBMENU6a = "Action & Adventure"
SUBMENU6b = "Children & Family"
@@ -93,6 +132,43 @@ SUBMENU7r = "Sports & Fitness"
SUBMENU7s = "Television"
SUBMENU7t = "Thrillers"
+##DVD Queue
+SUBMENUD1 = "Disc Queue: All"
+SUBMENUD1m = "Disc Queue: Movies"
+SUBMENUD1t = "Disc Queue: TV"
+
+SUBMENUD2 = "Search..."
+SUBMENUD3 = "At Home"
+
+##Top 25 by Genre
+SUBMENUD7 = "Top 25's By Genre"
+SUBMENUD7a = "Action & Adventure"
+SUBMENUD7b = "Anime & Animation"
+SUBMENUD7c = "Blu-ray"
+SUBMENUD7d = "Children & Family"
+SUBMENUD7e = "Classics"
+SUBMENUD7f = "Comedy"
+SUBMENUD7g = "Documentary"
+SUBMENUD7h = "Drama"
+SUBMENUD7i = "Faith & Spirituality"
+SUBMENUD7j = "Foreign"
+SUBMENUD7k = "Gay & Lesbian"
+SUBMENUD7l = "Horror"
+SUBMENUD7m = "Independent"
+SUBMENUD7n = "Music & Musicals"
+SUBMENUD7o = "Romance"
+SUBMENUD7p = "Sci-Fi & Fantasy"
+SUBMENUD7q = "Special Interest"
+SUBMENUD7r = "Sports & Fitness"
+SUBMENUD7s = "Television"
+SUBMENUD7t = "Thrillers"
+
+## Rental History
+SUBMENUR = "Rental History"
+SUBMENUR1 = "Shipped"
+SUBMENUR2 = "Returned"
+SUBMENUR3 = "Watched"
+
# plugin handle
handle = int(sys.argv[1])
@@ -120,18 +196,40 @@ def addDirectoryItem(name, isFolder=True, parameters={},
thumbnail=None):
# UI builder functions
def show_root_menu():
- ''' Show the plugin root menu. '''
- addDirectoryItem(name=SUBMENU1, parameters={ PARAMETER_KEY_MODE:MODE1 },
isFolder=True,
thumbnail="special://home/addons/plugin.video.xbmcflicks/resources/images/iqueue_all.png")
- addDirectoryItem(name=SUBMENU1a, parameters={ PARAMETER_KEY_MODE:MODE1a },
isFolder=True,
thumbnail="special://home/addons/plugin.video.xbmcflicks/resources/images/iqueue_movies.png")
- addDirectoryItem(name=SUBMENU1b, parameters={ PARAMETER_KEY_MODE:MODE1b },
isFolder=True,
thumbnail="special://home/addons/plugin.video.xbmcflicks/resources/images/iqueue_tv.png")
+ addDirectoryItem(name=SUBMENU0iw, parameters={ PARAMETER_KEY_MODE:MODE0iw
}, isFolder=True,
thumbnail="special://home/addons/plugin.video.xbmcflicks/resources/instant.png")
+ addDirectoryItem(name=SUBMENU0d, parameters={ PARAMETER_KEY_MODE:MODE0d },
isFolder=True,
thumbnail="special://home/addons/plugin.video.xbmcflicks/resources/disc.png")
+ addDirectoryItem(name=SUBMENUR, parameters={ PARAMETER_KEY_MODE:MODER },
isFolder=True)
+ xbmcplugin.endOfDirectory(handle=handle, succeeded=True)
+
+def show_instant_menu():
+ addDirectoryItem(name=SUBMENU1, parameters={ PARAMETER_KEY_MODE:MODE1 },
isFolder=True,
thumbnail="special://home/addons/plugin.video.xbmcflicks/resources/iqueue_all.png")
+ addDirectoryItem(name=SUBMENU1a, parameters={ PARAMETER_KEY_MODE:MODE1a },
isFolder=True,
thumbnail="special://home/addons/plugin.video.xbmcflicks/resources/iqueue_movies.png")
+ addDirectoryItem(name=SUBMENU1b, parameters={ PARAMETER_KEY_MODE:MODE1b },
isFolder=True,
thumbnail="special://home/addons/plugin.video.xbmcflicks/resources/iqueue_tv.png")
- addDirectoryItem(name=SUBMENU2, parameters={ PARAMETER_KEY_MODE:MODE2 },
isFolder=True,
thumbnail="special://home/addons/plugin.video.xbmcflicks/resources/images/recog.png")
- addDirectoryItem(name=SUBMENU5, parameters={ PARAMETER_KEY_MODE:MODE5 },
isFolder=True,
thumbnail="special://home/addons/plugin.video.xbmcflicks/resources/images/new_top25.png")
- addDirectoryItem(name=SUBMENU3, parameters={ PARAMETER_KEY_MODE:MODE3 },
isFolder=True,
thumbnail="special://home/addons/plugin.video.xbmcflicks/resources/images/new_all.png")
- addDirectoryItem(name=SUBMENU4, parameters={ PARAMETER_KEY_MODE:MODE4 },
isFolder=True,
thumbnail="special://home/addons/plugin.video.xbmcflicks/resources/images/search.png")
+ addDirectoryItem(name=SUBMENU2, parameters={ PARAMETER_KEY_MODE:MODE2 },
isFolder=True,
thumbnail="special://home/addons/plugin.video.xbmcflicks/resources/recog.png")
+ addDirectoryItem(name=SUBMENU5, parameters={ PARAMETER_KEY_MODE:MODE5 },
isFolder=True,
thumbnail="special://home/addons/plugin.video.xbmcflicks/resources/new_top25.png")
+ addDirectoryItem(name=SUBMENU3, parameters={ PARAMETER_KEY_MODE:MODE3 },
isFolder=True,
thumbnail="special://home/addons/plugin.video.xbmcflicks/resources/new_all.png")
+ addDirectoryItem(name=SUBMENU4, parameters={ PARAMETER_KEY_MODE:MODE4 },
isFolder=True,
thumbnail="special://home/addons/plugin.video.xbmcflicks/resources/search.png")
#addDirectoryItem(name=SUBMENU6, parameters={ PARAMETER_KEY_MODE:MODE6 },
isFolder=True)
xbmcplugin.endOfDirectory(handle=handle, succeeded=True)
+def show_disc_menu():
+ addDirectoryItem(name=SUBMENUD1, parameters={ PARAMETER_KEY_MODE:MODED1 },
isFolder=True)
+ addDirectoryItem(name=SUBMENUD1m, parameters={ PARAMETER_KEY_MODE:MODED1m
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD1t, parameters={ PARAMETER_KEY_MODE:MODED1t
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD7, parameters={ PARAMETER_KEY_MODE:MODED7 },
isFolder=True)
+ addDirectoryItem(name=SUBMENUD2, parameters={ PARAMETER_KEY_MODE:MODED2 },
isFolder=True)
+ addDirectoryItem(name=SUBMENUD3, parameters={ PARAMETER_KEY_MODE:MODED3 },
isFolder=True)
+
+ xbmcplugin.endOfDirectory(handle=handle, succeeded=True)
+
+def show_rentalhistory_menu():
+ addDirectoryItem(name=SUBMENUR1, parameters={ PARAMETER_KEY_MODE:MODER1 },
isFolder=True)
+ addDirectoryItem(name=SUBMENUR2, parameters={ PARAMETER_KEY_MODE:MODER2 },
isFolder=True)
+ addDirectoryItem(name=SUBMENUR3, parameters={ PARAMETER_KEY_MODE:MODER3 },
isFolder=True)
+
+ xbmcplugin.endOfDirectory(handle=handle, succeeded=True)
+
def show_SUBMENU1():
''' Show first submenu. '''
for i in range(0, 5):
@@ -148,30 +246,18 @@ def show_SUBMENU2():
def show_SUBMENU6():
#add in the genre folders
- addDirectoryItem(name=SUBMENU6a, parameters={ PARAMETER_KEY_MODE:
-MODE6a }, isFolder=True)
- addDirectoryItem(name=SUBMENU6b, parameters={ PARAMETER_KEY_MODE:
-MODE6b }, isFolder=True)
- addDirectoryItem(name=SUBMENU6c, parameters={ PARAMETER_KEY_MODE:
-MODE6c }, isFolder=True)
- addDirectoryItem(name=SUBMENU6d, parameters={ PARAMETER_KEY_MODE:
-MODE6d }, isFolder=True)
- addDirectoryItem(name=SUBMENU6e, parameters={ PARAMETER_KEY_MODE:
-MODE6e }, isFolder=True)
- addDirectoryItem(name=SUBMENU6f, parameters={ PARAMETER_KEY_MODE:
-MODE6f }, isFolder=True)
- addDirectoryItem(name=SUBMENU6g, parameters={ PARAMETER_KEY_MODE:
-MODE6g }, isFolder=True)
- addDirectoryItem(name=SUBMENU6h, parameters={ PARAMETER_KEY_MODE:
-MODE6h }, isFolder=True)
- addDirectoryItem(name=SUBMENU6i, parameters={ PARAMETER_KEY_MODE:
-MODE6i }, isFolder=True)
- addDirectoryItem(name=SUBMENU6j, parameters={ PARAMETER_KEY_MODE:
-MODE6j }, isFolder=True)
- addDirectoryItem(name=SUBMENU6k, parameters={ PARAMETER_KEY_MODE:
-MODE6k }, isFolder=True)
- addDirectoryItem(name=SUBMENU6l, parameters={ PARAMETER_KEY_MODE:
-MODE6l }, isFolder=True)
+ addDirectoryItem(name=SUBMENU6a, parameters={ PARAMETER_KEY_MODE:MODE6a },
isFolder=True)
+ addDirectoryItem(name=SUBMENU6b, parameters={ PARAMETER_KEY_MODE:MODE6b },
isFolder=True)
+ addDirectoryItem(name=SUBMENU6c, parameters={ PARAMETER_KEY_MODE:MODE6c },
isFolder=True)
+ addDirectoryItem(name=SUBMENU6d, parameters={ PARAMETER_KEY_MODE:MODE6d },
isFolder=True)
+ addDirectoryItem(name=SUBMENU6e, parameters={ PARAMETER_KEY_MODE:MODE6e },
isFolder=True)
+ addDirectoryItem(name=SUBMENU6f, parameters={ PARAMETER_KEY_MODE:MODE6f },
isFolder=True)
+ addDirectoryItem(name=SUBMENU6g, parameters={ PARAMETER_KEY_MODE:MODE6g },
isFolder=True)
+ addDirectoryItem(name=SUBMENU6h, parameters={ PARAMETER_KEY_MODE:MODE6h },
isFolder=True)
+ addDirectoryItem(name=SUBMENU6i, parameters={ PARAMETER_KEY_MODE:MODE6i },
isFolder=True)
+ addDirectoryItem(name=SUBMENU6j, parameters={ PARAMETER_KEY_MODE:MODE6j },
isFolder=True)
+ addDirectoryItem(name=SUBMENU6k, parameters={ PARAMETER_KEY_MODE:MODE6k },
isFolder=True)
+ addDirectoryItem(name=SUBMENU6l, parameters={ PARAMETER_KEY_MODE:MODE6l },
isFolder=True)
xbmcplugin.endOfDirectory(handle=handle, succeeded=True)
def show_SUBMENU7():
@@ -198,7 +284,29 @@ def show_SUBMENU7():
addDirectoryItem(name=SUBMENU7t, parameters={ PARAMETER_KEY_MODE:MODE7t },
isFolder=True)
xbmcplugin.endOfDirectory(handle=handle, succeeded=True)
-
+def show_SUBMENUD7():
+ #add in the disc genre folders for the Top 25 items
+ addDirectoryItem(name=SUBMENUD7a, parameters={ PARAMETER_KEY_MODE:MODED7a
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD7b, parameters={ PARAMETER_KEY_MODE:MODED7b
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD7c, parameters={ PARAMETER_KEY_MODE:MODED7c
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD7d, parameters={ PARAMETER_KEY_MODE:MODED7d
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD7e, parameters={ PARAMETER_KEY_MODE:MODED7e
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD7f, parameters={ PARAMETER_KEY_MODE:MODED7f
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD7g, parameters={ PARAMETER_KEY_MODE:MODED7g
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD7h, parameters={ PARAMETER_KEY_MODE:MODED7h
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD7i, parameters={ PARAMETER_KEY_MODE:MODED7i
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD7j, parameters={ PARAMETER_KEY_MODE:MODED7j
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD7k, parameters={ PARAMETER_KEY_MODE:MODED7k
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD7l, parameters={ PARAMETER_KEY_MODE:MODED7l
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD7m, parameters={ PARAMETER_KEY_MODE:MODED7m
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD7n, parameters={ PARAMETER_KEY_MODE:MODED7n
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD7o, parameters={ PARAMETER_KEY_MODE:MODED7o
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD7p, parameters={ PARAMETER_KEY_MODE:MODED7p
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD7q, parameters={ PARAMETER_KEY_MODE:MODED7q
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD7r, parameters={ PARAMETER_KEY_MODE:MODED7r
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD7s, parameters={ PARAMETER_KEY_MODE:MODED7s
}, isFolder=True)
+ addDirectoryItem(name=SUBMENUD7t, parameters={ PARAMETER_KEY_MODE:MODED7t
}, isFolder=True)
+ xbmcplugin.endOfDirectory(handle=handle, succeeded=True)
# parameter values
params = parameters_string_to_dict(sys.argv[2])
@@ -212,7 +320,11 @@ print
"##########################################################"
# Depending on the mode, call the appropriate function to build the UI.
if not sys.argv[2]:
# new start
- ok = show_root_menu()
+ show_root_menu()
+elif mode == MODE0iw:
+ show_instant_menu()
+elif mode == MODE0d:
+ show_disc_menu()
elif mode == MODE1:
getInstantQueue()
elif mode == MODE1a:
@@ -229,7 +341,7 @@ elif mode == MODE4:
if (keyboard.isConfirmed()):
arg = keyboard.getText()
#print "keyboard returned: " + keyboard.getText()
- doSearch(arg)
+ doSearch(arg, "instant", True)
else:
print "user canceled"
elif mode == MODE5:
@@ -264,42 +376,109 @@ elif mode == MODE6l:
elif mode == MODE7:
ok = show_SUBMENU7()
elif mode == MODE7a:
- getTop25Feed("296")
+ getTop25Feed("296")
elif mode == MODE7b:
- getTop25Feed("623")
+ getTop25Feed("623")
elif mode == MODE7c:
- getTop25Feed("2444")
+ getTop25Feed("2444")
elif mode == MODE7d:
- getTop25Feed("302")
+ getTop25Feed("302")
elif mode == MODE7e:
- getTop25Feed("306")
+ getTop25Feed("306")
elif mode == MODE7f:
- getTop25Feed("307")
+ getTop25Feed("307")
elif mode == MODE7g:
- getTop25Feed("864")
+ getTop25Feed("864")
elif mode == MODE7h:
- getTop25Feed("315")
+ getTop25Feed("315")
elif mode == MODE7i:
- getTop25Feed("2108")
+ getTop25Feed("2108")
elif mode == MODE7j:
- getTop25Feed("2514")
+ getTop25Feed("2514")
elif mode == MODE7k:
- getTop25Feed("330")
+ getTop25Feed("330")
elif mode == MODE7l:
- getTop25Feed("338")
+ getTop25Feed("338")
elif mode == MODE7m:
- getTop25Feed("343")
+ getTop25Feed("343")
elif mode == MODE7n:
- getTop25Feed("2310")
+ getTop25Feed("2310")
elif mode == MODE7o:
- getTop25Feed("371")
+ getTop25Feed("371")
elif mode == MODE7p:
- getTop25Feed("373")
+ getTop25Feed("373")
elif mode == MODE7q:
- getTop25Feed("2223")
+ getTop25Feed("2223")
elif mode == MODE7r:
- getTop25Feed("2190")
+ getTop25Feed("2190")
elif mode == MODE7s:
- getTop25Feed("2197")
+ getTop25Feed("2197")
elif mode == MODE7t:
- getTop25Feed("387")
+ getTop25Feed("387")
+elif mode == MODED1:
+ getDVDQueue(3)
+elif mode == MODED1m:
+ getDVDQueue(4)
+elif mode == MODED1t:
+ getDVDQueue(5)
+elif mode == MODED2:
+ keyboard = xbmc.Keyboard()
+ keyboard.doModal()
+ if (keyboard.isConfirmed()):
+ arg = keyboard.getText()
+ #print "keyboard returned: " + keyboard.getText()
+ doSearch(arg, "Disc")
+ else:
+ print "user canceled"
+elif mode == MODED3:
+ getHomeList()
+elif mode == MODED7:
+ ok = show_SUBMENUD7()
+elif mode == MODED7a:
+ getTop25FeedD("296")
+elif mode == MODED7b:
+ getTop25FeedD("623")
+elif mode == MODED7c:
+ getTop25FeedD("2444")
+elif mode == MODED7d:
+ getTop25FeedD("302")
+elif mode == MODED7e:
+ getTop25FeedD("306")
+elif mode == MODED7f:
+ getTop25FeedD("307")
+elif mode == MODED7g:
+ getTop25FeedD("864")
+elif mode == MODED7h:
+ getTop25FeedD("315")
+elif mode == MODED7i:
+ getTop25FeedD("2108")
+elif mode == MODED7j:
+ getTop25FeedD("2514")
+elif mode == MODED7k:
+ getTop25FeedD("330")
+elif mode == MODED7l:
+ getTop25FeedD("338")
+elif mode == MODED7m:
+ getTop25FeedD("343")
+elif mode == MODED7n:
+ getTop25FeedD("2310")
+elif mode == MODED7o:
+ getTop25FeedD("371")
+elif mode == MODED7p:
+ getTop25FeedD("373")
+elif mode == MODED7q:
+ getTop25FeedD("2223")
+elif mode == MODED7r:
+ getTop25FeedD("2190")
+elif mode == MODED7s:
+ getTop25FeedD("2197")
+elif mode == MODED7t:
+ getTop25FeedD("387")
+elif mode == MODER:
+ show_rentalhistory_menu()
+elif mode == MODER1:
+ rhShipped()
+elif mode == MODER2:
+ rhReturned()
+elif mode == MODER3:
+ rhWatched()
diff --git a/plugin.video.xbmcflicks/resources/lib/modQueue.py
b/plugin.video.xbmcflicks/resources/lib/modQueue.py
index 27ff8db..d4f55f1 100644
--- a/plugin.video.xbmcflicks/resources/lib/modQueue.py
+++ b/plugin.video.xbmcflicks/resources/lib/modQueue.py
@@ -152,11 +152,11 @@ def initApp():
MY_USER['request']['key'] = match.group(1).strip()
MY_USER['request']['secret'] = match.group(2).strip()
MY_USER['access']['key'] = match.group(3).strip()
- MY_USER['access']['secret'] = match.group(4).strip()
- print "finished loading up user information from file"
+ MY_USER['access']['secret'] = match.group(4).strip()
+ print "finished loading up user information from file"
else:
#no match, need to fire off the user auth from the start
- print "couldn't load user information from userinfo.properties file"
+ print "couldn't load user information from userinfo.properties file"
#auth the user
netflixClient = NetflixClient(APP_NAME, API_KEY, API_SECRET, CALLBACK,
VERBOSE_USER_LOG)
user = getAuth(netflixClient,VERBOSE_USER_LOG)
@@ -173,15 +173,20 @@ if __name__ == '__main__':
strArgs = str(sys.argv[1])
movieid = ""
action = ""
+ actionParams = ""
verboseAction = ""
verboseDirection = ""
details = ""
- match = re.search(r"(.*?)(delete|post)", strArgs, re.IGNORECASE)
+ position = ""
+ discQueue = False
+
+ match = re.search(r"(.*?)(delete|post|discdelete|discpost|disctoppost)",
strArgs, re.IGNORECASE)
if match:
- movieid = match.group(1)
- print movieid
- action = match.group(2)
- print action
+ movieid = match.group(1)
+ print movieid
+ action = match.group(2)
+ actionParams = match.group(2)
+ print action
else:
"print unable to parse action item, exiting"
exit
@@ -189,9 +194,25 @@ if __name__ == '__main__':
if(action == "post"):
verboseAction = "Add"
verboseDirection = "to"
- else:
+ elif(action == "delete"):
+ verboseAction = "Remove"
+ verboseDirection = "from"
+ elif(action == "discpost"):
+ action = "post"
+ verboseAction = "Add"
+ verboseDirection = "to"
+ discQueue = True
+ elif(action == "disctoppost"):
+ action = "post"
+ verboseAction = "Add"
+ verboseDirection = "to"
+ discQueue = True
+ position = "1"
+ elif(action == "discdelete"):
+ action = "delete"
verboseAction = "Remove"
verboseDirection = "from"
+ discQueue = True
netflixClient = NetflixClient(APP_NAME, API_KEY, API_SECRET, CALLBACK,
VERBOSE_USER_LOG)
#auth the user
@@ -199,16 +220,34 @@ if __name__ == '__main__':
#if we have a user, do the action
if user:
- print "got user from main init of modQueue script"
- result = user.modifyQueue(str(movieid), str(action))
- matchr = re.search(r"'message': u'(.*?)'", str(result), re.IGNORECASE)
- if matchr:
- details = matchr.group(1)
- else:
- details = str(result)
- dialog = xbmcgui.Dialog()
- ok = dialog.ok("Instant Queue: " + verboseAction + " " + movieid,
details)
-
- #refresh UI on delete
- if(action == "delete"):
+ if(not discQueue):
+ result = user.modifyQueue(str(movieid), str(action))
+ matchr = re.search(r"'message': u'(.*?)'", str(result),
re.IGNORECASE)
+ if matchr:
+ details = matchr.group(1)
+ else:
+ details = str(result)
+ dialog = xbmcgui.Dialog()
+ ok = dialog.ok("Instant Queue: " + verboseAction + " " + movieid,
details)
+ if(discQueue):
+ if(position == ""):
+ result = user.modifyQueueDisc(str(movieid), str(action))
+ else:
+ result = user.modifyQueueDisc(str(movieid), str(action),
position)
+ matchr = re.search(r"'message': u'(.*?)'", str(result),
re.IGNORECASE)
+ if matchr:
+ details = matchr.group(1)
+ else:
+ details = str(result)
+ dialog = xbmcgui.Dialog()
+ ok = dialog.ok("Disc Queue: " + verboseAction + " " + movieid,
details)
+
+ #refresh UI on delete, disc delete, or move to top
+ if(actionParams == "delete"):
xbmc.executebuiltin("Container.Refresh")
+ elif(actionParams == "discdelete"):
+ xbmc.executebuiltin("Container.Refresh")
+ elif(actionParams == "disctoppost"):
+ xbmc.executebuiltin("Container.Refresh")
+ else:
+ print "Failed to get user information from main init of modQueue
script"
diff --git a/plugin.video.xbmcflicks/resources/lib/xinfo.py
b/plugin.video.xbmcflicks/resources/lib/xinfo.py
index 9e7483b..c40f277 100644
--- a/plugin.video.xbmcflicks/resources/lib/xinfo.py
+++ b/plugin.video.xbmcflicks/resources/lib/xinfo.py
@@ -26,4 +26,5 @@ class XInfo:
self.IsInstantAvailable = False
self.MaturityLevel = "0"
self.AvailableUntil = "0"
+ self.WebURL = ""
-----------------------------------------------------------------------
Summary of changes:
plugin.video.xbmcflicks/addon.xml | 4 +-
plugin.video.xbmcflicks/changelog.txt | 2 +
plugin.video.xbmcflicks/resources/disc.png | Bin 0 -> 42882 bytes
plugin.video.xbmcflicks/resources/instant.png | Bin 0 -> 43401 bytes
plugin.video.xbmcflicks/resources/lib/Netflix.py | 201 ++++++++++-----
plugin.video.xbmcflicks/resources/lib/iqueue.py | 244 +++++++++++++++--
plugin.video.xbmcflicks/resources/lib/menu.py | 301 ++++++++++++++++-----
plugin.video.xbmcflicks/resources/lib/modQueue.py | 81 ++++--
plugin.video.xbmcflicks/resources/lib/xinfo.py | 1 +
9 files changed, 664 insertions(+), 170 deletions(-)
create mode 100644 plugin.video.xbmcflicks/resources/disc.png
create mode 100644 plugin.video.xbmcflicks/resources/instant.png
hooks/post-receive
--
Plugins
------------------------------------------------------------------------------
Learn how Oracle Real Application Clusters (RAC) One Node allows customers
to consolidate database storage, standardize their database environment, and,
should the need arise, upgrade to a full multi-node Oracle RAC database
without downtime or disruption
http://p.sf.net/sfu/oracle-sfdevnl
_______________________________________________
Xbmc-addons mailing list
Xbmc-addons@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/xbmc-addons