diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py deleted file mode 100644 index 907a02c..0000000 --- a/Contents/Code/__init__.py +++ /dev/null @@ -1,387 +0,0 @@ -from PMS import * -from PMS.Objects import * -from PMS.Shortcuts import * -from urlparse import urljoin -import time -from exceptions import IndexError -#################################################################################################### - -PLUGIN_TITLE = 'Pornhub' -STEALTH_TITLE = 'System Stats' -PLUGIN_PREFIX = '/video/pornhub' - -BASE_URL = 'http://www.pornhub.com' -CATEGORIES = '%s/categories' % BASE_URL -AMFPROXY = 'http://amfproxy.plexapp.net/pornhub/%s.xml' -SORT_ORDER = [ - ['Most Recent', 'o=mr'], - ['Most Viewed - All Time', 'o=mv&t=a'], - ['Most Viewed - This Month', 'o=mv&t=m'], - ['Most Viewed - This Week', 'o=mv&t=w'], - ['Most Viewed - Today', 'o=mv&t=t'], - ['Top Rated - All Time', 'o=tr&t=a'], - ['Top Rated - This Month', 'o=tr&t=m'], - ['Top Rated - This Week', 'o=tr&t=w'], - ['Top Rated - Today', 'o=tr&t=t'], - ['Most Discussed - All Time', 'o=md&t=a'], - ['Most Discussed - This Month', 'o=md&t=m'], - ['Most Discussed - This Week', 'o=md&t=w'], - ['Most Discussed - Today', 'o=md&t=t'], - ['Being Watched', 'o=bw'], - ['Longest', 'o=lg']] - -# Default artwork and icons -PLUGIN_ARTWORK = 'art-default.png' -PLUGIN_ICON_DEFAULT = 'icon-default.png' -STEALTH_ARTWORK = 'art-stealth.png' -STEALTH_ICON = 'icon-stealth.png' - -#################################################################################################### - -# Lazy Loader -global pages -pages = list() -global dirItems -dirItems = MediaContainer() -global parseThread -parseThread = None -global noMorePages -noMorePages = True -global noMoreMeta -noMoreMeta = True -global metaThread -global lastMatchKey -lastMatchKey = None - -#################################################################################################### - -def LL(sender, pageGetter, parser, metaGetter, url, matchKey, title1=None, title2=None, viewGroup=None, contextMenu=None, replaceParent=False, **kwargs): - global pages, dirItems, parseThread, metaThread, noMorePages, noMoreMeta, lastMatchKey, parseThreadShouldDie, metaThreadShouldDie - Log(matchKey) - Log(lastMatchKey) - - if pageGetter == 'getURLs': - pageHnd = getURLs - elif pageGetter == 'getVideos': - pageHnd = getVideos - else: - raise - - if parser == 'getVideos': - parseHnd = getVideos - else: - raise - - if metaGetter == 'getMeta': - metaHnd = getMeta - elif metaGetter == 'NOP': - metaHnd = NOP - - - if matchKey != lastMatchKey: - lastMatchKey = matchKey - parseThreadShouldDie = True - metaThreadShouldDie = True - while (parseThreadShouldDie and not noMorePages) or (metaThreadShouldDie and not noMoreMeta): - Log('Waiting for old threads to die') - Log([parseThreadShouldDie, noMorePages, metaThreadShouldDie, noMoreMeta]) - time.sleep(1) - Log('Threads are all dead') - pages = list() - dirItems = MediaContainer(title1=title1, title2=title2, viewGroup=viewGroup, contextMenu=contextMenu, replaceParent=replaceParent) - parseThread = None - if parseThread == None: - parseThreadShouldDie = False - metaThreadShouldDie = False - pages = pageHnd(url, **kwargs) - noMorePages = False - noMoreMeta = False - dirItems.autoRefresh=5 - parseThread = Thread.Create(parseEach, parseHnd, **kwargs) - metaThread = Thread.Create(getMetaEach, metaHnd) - time.sleep(3) - return(dirItems) - -def parseEach(parser, **kwargs): - global pages, dirItems, noMorePages, parseThread, parseThreadShouldDie - while True: - if parseThreadShouldDie: - parseThreadShouldDie = False - return - try: - url = pages[0] - del pages[0] - except: - Log('Out of pages') - noMorePages = True - return - else: - try: - parser(url, **kwargs) - except: - Log('parser raised an exception') - -def getMetaEach(metaGetter): - global dirItems, noMorePages, noMoreMeta, metaThreadShouldDie - itemIndex = 0 - while True: - if metaThreadShouldDie: - metaThreadShouldDie = False - return - try: - dirItem = dirItems[itemIndex] - except IndexError: - if noMorePages: - Log('No more videos') - del dirItems.autoRefresh - noMoreMeta = True - return - else: - Log('Waiting for videos') - time.sleep(1) - else: - itemIndex += 1 - try: - metaGetter(dirItem) - except: - Log('metaGetter raised an exception') - -#################################################################################################### - -def P(pref, default=''): - p = Prefs.Get(pref) - if p == None: - return default - else: - return p - -def V(val, default=''): - if val == None: - return default - else: - return val -#################################################################################################### - -def Start(): - if P('Stealth', False): - Plugin.AddPrefixHandler(PLUGIN_PREFIX, MainMenu, STEALTH_TITLE, STEALTH_ICON, STEALTH_ARTWORK) - else: - Plugin.AddPrefixHandler(PLUGIN_PREFIX, MainMenu, PLUGIN_TITLE, PLUGIN_ICON_DEFAULT, PLUGIN_ARTWORK) - Plugin.AddViewGroup('List', viewMode='List', mediaType='items') - - # Set the default MediaContainer attributes - MediaContainer.title1 = PLUGIN_TITLE - MediaContainer.viewGroup = 'List' - MediaContainer.art = R(PLUGIN_ARTWORK) - - Plugin.AddViewGroup('_List', viewMode='List', mediaType='items') - Plugin.AddViewGroup('_InfoList', viewMode='InfoList', mediaType='items') - Plugin.AddViewGroup('_Pictures', viewMode='Pictures', mediaType='items') - Plugin.AddViewGroup('_Wall Stream', viewMode='WallStream', mediaType='items') - Plugin.AddViewGroup('_Cover Flow', viewMode='Coverflow', mediaType='items') - - # Set the default cache time - HTTP.SetCacheTime(CACHE_1HOUR) - -#################################################################################################### - -def CreatePrefs(): - Prefs.Add(id='Stealth', type='bool', default=False, label='Stealth Mode') - Prefs.Add(id='catView', type='enum', default='List', label='Default Category View', values='List|InfoList|Pictures|Wall Stream|Cover Flow') - Prefs.Add(id='videoView', type='enum', default='List', label='Default Video View', values='List|InfoList|Pictures|Wall Stream|Cover Flow') - sortValues = '' - for sort, key in SORT_ORDER: - sortValues += sort + '|' - sortValues = sortValues + 'Prompt' - Prefs.Add(id='pageCount', type='text', default='1', label='Pages (26 videos each)') - Prefs.Add(id='sortOrder', type='enum', default='Prompt', label='Default Sort Order', values=sortValues) - for category in XML.ElementFromURL(CATEGORIES, isHTML=True, cacheTime=CACHE_1DAY, errors='ignore').xpath('//li[@class="cat_pic"]//strong/text()'): - Prefs.Add(id=category.strip().replace(' ', '_').replace('/', '_'), type='bool', default=True, label='Show ' + category.strip()) - -def CreateDict(): - Dict.Set('oldStealthSetting', False) - -#################################################################################################### - -def getURLs(url, sortURL, **kwargs): - if url.find('?') == -1: - totalUrl = urljoin(BASE_URL, url + '?' + sortURL) - else: - totalUrl = urljoin(BASE_URL, url + '&' + sortURL) - videoPage = XML.ElementFromURL(totalUrl, isHTML=True, errors='ignore') - try: - pageCount = int(videoPage.xpath('//span[text()="Last"]/parent::*')[0].get('href').split('=')[-1]) - except: - pageCount = len(videoPage.xpath('//ul[@class="pagination"]/li')) - 1 - if pageCount == -1: - pageCount = 1 - pages = list() - for p in range(1, pageCount + 1): - pages.append(totalUrl + '&page=' + str(p)) - return pages - -def getVideos(url, **kwargs): - global dirItems - Log('getVideos for ' + url) - for video in XML.ElementFromURL(url, isHTML=True, errors='ignore').xpath('//div[@class="wrap"]'): - title = video.xpath('.//a[@class="title"]')[0].text.strip() - duration = TimeToSeconds(video.xpath('.//var[@class="duration"]')[0].text) * 1000 - thumb = video.xpath('.//img')[0].get('src') - rating = float(video.xpath('.//div[starts-with(@class,"rating-container")]/div[@class="value"]')[0].text.split('%')[0]) * 2 - - added = L('Added: %s') % video.xpath('.//var[@class="added"]')[0].text - views = L('Views: %s views') % video.xpath('.//span[@class="views"]/var')[0].text - - viewkey = video.xpath('.//a')[0].get('href').split('viewkey=') - premium = video.xpath('.//a')[0].get('href').find('view_video_2.php') - private = thumb.find('private-video') - - if len(viewkey) > 1 and premium < 0 and private < 0: - videoURL = 'http://www.pornhub.com/view_video.php?viewkey=' + viewkey[1] - dirItems.Append(Function(VideoItem(getVideo, title=title, summary=added + '\n' + views, duration=duration, thumb=thumb, art=None, rating=rating), videoURL=videoURL)) - -def getMeta(dirItem): - Log(dirItem.__dict__) - metaURL = dirItem._Function__kwargs['videoURL'] - Log('Getting metadata for ' + metaURL) - - metaPage = None - tries = 3 - while metaPage == None and tries != 0: - metaPage = XML.ElementFromURL(metaURL, True, errors='ignore', cacheTime=CACHE_1MONTH) - tries -= 1 - if metaPage == None:return - - summary = dirItem.summary + '\n' - users = metaPage.xpath('//a[starts-with(@href,"/user/")]') - if len(users) != 0: - summary += 'From: ' + V(users[0].text) + '\n' - stars = metaPage.xpath('//a[starts-with(@href,"/video/search?pornstar")]') - if len(stars) != 0: - summary += 'Pornstars: ' - for star in stars: - summary += V(star.text) +', ' - summary = summary[:-2] + '\n' - tags = metaPage.xpath('//a[starts-with(@href,"/video/search?search=")]') - if len(tags) != 0: - summary += 'Tags: ' - for tag in tags: - summary += V(tag.text) + ', ' - summary = summary[:-2] + '\n' - dirItem.summary = summary - -def getVideo(sender, videoURL): - js = XML.ElementFromURL(videoURL, True).xpath('//div[@id="playerDiv_1"]/following-sibling::script')[0].text - for line in js.split('\n'): - if '"video_url"' in line: - url = line.split('"')[-2] - return Redirect(url) - -def MainMenu(): - stealthSetting = Prefs.Get('Stealth') - if Dict.Get('oldStealthSetting') != stealthSetting: - Dict.Set('oldStealthSetting', stealthSetting) - time.sleep(5) - Log('Stealth Mode toggled, Restarting') - Plugin.Restart() - - dir = MediaContainer(noCache=True) - dir.viewGroup = '_' + Prefs.Get('catView') - - sortName, sortURL = getSort() - # 'All' item - if sortName == '': - dir.Append(Function(DirectoryItem(SortOrder, title='All', thumb=R(PLUGIN_ICON_DEFAULT)), url='/video?c=', title2='All')) - else: - dir.Append(Function(DirectoryItem(LL, title='All', thumb=R(PLUGIN_ICON_DEFAULT)), pageGetter='getURLs', parser='getVideos', metaGetter='getMeta', title1=PLUGIN_TITLE, title2='All', url='/video?c=', sortURL=sortURL, matchKey=['/video?c=', sortURL])) - - for category in XML.ElementFromURL(CATEGORIES, isHTML=True, cacheTime=CACHE_1DAY, errors='ignore').xpath('//li[@class="cat_pic"]'): - url = category.xpath('./a')[0].get('href') - - title = category.xpath('.//strong')[0].text.strip() - thumb = category.xpath('./a/img')[0].get('src') - if Prefs.Get(title.strip().replace(' ', '_').replace('/', '_')): - if sortName == '': - dir.Append(Function(DirectoryItem(SortOrder, title=title, thumb=thumb), url=url, title2=title, viewGroup='_' + Prefs.Get('videoView'))) - else: - dir.Append(Function(DirectoryItem(LL, title=title, thumb=thumb), pageGetter='getURLs', parser='getVideos', metaGetter='getMeta', title1=PLUGIN_TITLE, title2=title, url=url, sortURL=sortURL, viewGroup='_' + Prefs.Get('videoView'), matchKey=[url, sortURL])) - #dir.Append(Function(DirectoryItem(LL, title=L('Users')), pageGetter=getURLs, parser=getUsers, metaGetter=NOP, title1=PLUGIN_TITLE, title2='Users', url='http://www.pornhub.com/user/search', sortURL='o=recent_users', viewGroup='_' + Prefs.Get('videoView'), matchKey=['http://www.pornhub.com/user/search', sortURL])) - - dir.Append(Function(InputDirectoryItem(InputVideoList, title=L("Search Videos ..."), prompt=L("Search on Pornhub"), subtitle = L('Search by keyword in pornhub archive'), summary = 'You can type in any word you want to search content for. This can be tags, names, ...' ), title1 = PLUGIN_TITLE, title2 = 'Search - "%s"', url = 'http://www.pornhub.com/video/search?search=%s', sortURL=sortURL)) - #Add search item - #dir.Append(Function(InputDirectoryItem(InputUserList, title=L("Search Users ..."), prompt=L("Search User by name"), subtitle = L('Search by name in pornhub user list')), title1 = PLUGIN_TITLE, title2 = 'Search User - "%s"', url = BASE_URL + '/user/search?username=%s', sortURL=sortURL)) - dir.Append(PrefsItem('Preferences', thumb=R('icon-prefs.png'))) - return dir - -#################################################################################################### - -def SortOrder(sender, url, title2, viewGroup): - dir = MediaContainer(title2=title2) - - for (sortTitle,sortURL) in SORT_ORDER: - dir.Append(Function(DirectoryItem(LL, title=sortTitle, thumb=R(PLUGIN_ICON_DEFAULT)), pageGetter='getURLs', parser='getVideos', metaGetter='getMeta', title1=title2, title2=sortTitle, url=url, sortURL=sortURL, viewGroup=viewGroup, matchKey=[url, sortURL])) - - return dir - -#################################################################################################### - -def InputVideoList(sender, query, title1, title2, url, sortURL, page=1): - Log('(PLUG-IN) **==> ENTER Search on PornHub') - title2 = title2 % query - query = String.Quote(query, usePlus=True) - url = url % query - return LL(sender, title1=title1, title2=title2, url=url, sortURL=sortURL, pageGetter=getURLs, parser=getVideos, metaGetter=getMeta, matchKey=['searchVideos', query]) - -#################################################################################################### - -def TimeToSeconds(timecode): - seconds = 0 - duration = timecode.split(':') - duration.reverse() - - for i in range(0, len(duration)): - seconds += int(duration[i]) * (60**i) - - return seconds - -#################################################################################################### - -def getSort(): - sort = Prefs.Get('sortOrder') - for name, url in SORT_ORDER: - if sort == name: return [name, url] - return ['',''] - -#################################################################################################### - -# TODO: write user metadata getter - -def getUsers(url, **kwargs): - global dirItems - for user in XML.ElementFromURL(url, isHTML=True, errors='ignore').xpath('//div[@class="user-box"]'): - name = user.xpath('./a/span')[0].text - link = user.xpath('./a')[0].get('href') - thumb = user.xpath('./a/img')[0].get('src') - #userid = link.split('user/')[1] - - if len(link) > 1: - userURL = BASE_URL + link #+ '/videos/recent?' - dirItems.Append(Function(DirectoryItem(getUsers2, title=name, thumb=thumb), title1=PLUGIN_TITLE, userName=name, url=userURL, viewGroup='_' + Prefs.Get('videoView'))) - -def getUsers2(sender, url, title1, userName, viewGroup): - dir = MediaContainer(title1=title1, title2=userName, viewGroup=viewGroup) - dir.Append(Function(DirectoryItem(LL, title='Favourites'), pageGetter='getURLs', parser='getVideos', metaGetter='NOP', title1=PLUGIN_TITLE, title2='Favourites - ' + userName, url=url + '/videos/favorites', sortURL='o=mr', viewGroup='_' + Prefs.Get('videoView'), matchKey=['getUsersFaves', userName])) - dir.Append(Function(DirectoryItem(LL, title='Recents'), pageGetter='getURLs', parser='getVideos', metaGetter='NOP', title1=PLUGIN_TITLE, title2='Recents - ' + userName, url=url + '/videos/recent?', sortURL='', viewGroup='_' + Prefs.Get('videoView'), matchKey=['getUsersRecents', userName])) - return dir - -def NOP(*args, **kwargs): - pass - -#################################################################################################### - -def InputUserList(sender, query, title1, title2, url, sortURL, page=1): - Log('(PLUG-IN) **==> ENTER Search on PornHub') - title2 = title2 % query - query = String.Quote(query, usePlus=True) - url = url % query - return LL(sender, url=url, pageGetter=getURLs, parser=getUsers, metaGetter=NOP, title1=PLUGIN_TITLE, title2=query, sortURL='', viewGroup='_' + Prefs.Get('videoView'), matchKey=['searchUsers', query]) diff --git a/Contents/Info.plist b/Contents/Info.plist deleted file mode 100644 index ab99edd..0000000 --- a/Contents/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - - CFBundleIdentifier - com.plexapp.plugins.pornhub - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - AAPL - CFBundleSignature - hook - CFBundleVersion - 1.0 - PlexFrameworkVersion - 1 - PlexPluginDebug - 1 - PlexPluginMode - AlwaysOn - - diff --git a/Contents/Resources/art-default.png b/Contents/Resources/art-default.png deleted file mode 100644 index b2a63b1..0000000 Binary files a/Contents/Resources/art-default.png and /dev/null differ diff --git a/Contents/Resources/art-stealth.png b/Contents/Resources/art-stealth.png deleted file mode 100644 index 4588c18..0000000 Binary files a/Contents/Resources/art-stealth.png and /dev/null differ diff --git a/Contents/Resources/icon-default.png b/Contents/Resources/icon-default.png deleted file mode 100644 index 0495274..0000000 Binary files a/Contents/Resources/icon-default.png and /dev/null differ diff --git a/Contents/Resources/icon-next.png b/Contents/Resources/icon-next.png deleted file mode 100644 index 10d9414..0000000 Binary files a/Contents/Resources/icon-next.png and /dev/null differ diff --git a/Contents/Resources/icon-prefs.png b/Contents/Resources/icon-prefs.png deleted file mode 100644 index 696ea78..0000000 Binary files a/Contents/Resources/icon-prefs.png and /dev/null differ diff --git a/Contents/Resources/icon-stealth.png b/Contents/Resources/icon-stealth.png deleted file mode 100644 index 3f51ae9..0000000 Binary files a/Contents/Resources/icon-stealth.png and /dev/null differ diff --git a/Contents/Site Configurations/pornhub.xml b/Contents/Site Configurations/pornhub.xml deleted file mode 100644 index 2656ba2..0000000 --- a/Contents/Site Configurations/pornhub.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file