diff --git a/Contents/Code/PAsiteList.py b/Contents/Code/PAsiteList.py index d6bf7438e..76505f838 100644 --- a/Contents/Code/PAsiteList.py +++ b/Contents/Code/PAsiteList.py @@ -79,7 +79,6 @@ import networkSinX import networkPureCFNM import siteATKGirlfriends -import networkTwoWebMedia import siteInterracialPass import network1service import networkTeamSkeet @@ -146,7 +145,6 @@ import siteFemjoy import networkThickCash import networkPornCZ -import networkTopWebModels import siteMyDirtyHobby import networkMetadataAPI import networkCouplesCinema @@ -1030,9 +1028,9 @@ 834: ('LadyVoyeurs', 'https://www.ladyvoyeurs.com', '/models/'), 835: ('BAMVisions', 'https://tour.bamvisions.com', '/search.php?st=advanced&qall='), 836: ('ATKGirlfriends', 'https://www.atkgirlfriends.com', '/tour/model/'), - 837: ('Wank It Now', 'https://www.wankitnow.com', '/search'), - 838: ('Bopping Babes', 'https://www.boppingbabes.com', '/search'), - 839: ('Upskirt Jerk', 'https://www.upskirtjerk.com', '/search'), + 837: ('WankItNow', 'https://www.wankitnow.com', '/videos'), + 838: ('BoppingBabes', 'https://www.boppingbabes.com', '/videos'), + 839: ('UpskirtJerk', 'https://www.upskirtjerk.com', '/videos'), 840: ('Interracial Pass', 'https://www.interracialpass.com', '/t1/search.php?query='), 841: ('LookAtHerNow', 'https://www.lookathernow.com', 'https://site-api.project1service.com'), 842: ('Mylfwood', 'https://www.mylf.com', '/movies/'), @@ -1422,14 +1420,14 @@ 1226: ('Czech Bi Porn', 'https://www.czechbiporn.com', '/en/search-results?value='), 1227: ('Czech Shemale', 'https://www.czechshemale.com', '/en/search-results?value='), 1228: ('Czech Gay City', 'https://www.czechgaycity.com', '/en/search-results?value='), - 1229: ('Top Web Models', 'https://tour.topwebmodels.com', '/search/'), - 1230: ('Big Gulp Girls', 'https://tour.biggulpgirls.com', '/search/'), - 1231: ('2 Girls 1 Camera', 'https://tour.2girls1camera.com', '/search/'), - 1232: ('Cougar Season', 'https://tour.cougarseason.com', '/search/'), - 1233: ('Deepthroat Sirens', 'https://tour.deepthroatsirens.com', '/search/'), - 1234: ('Facials Forever', 'https://tour.facialsforever.com', '/search/'), - 1235: ('Pounded Petite', 'https://tour.poundedpetite.com', '/search/'), - 1236: ('She\'s Brand New', 'https://tour.shesbrandnew.com', '/search/'), + 1229: ('Top Web Models', 'https://tour.topwebmodels.com', '/scenes'), + 1230: ('Big Gulp Girls', 'https://tour.biggulpgirls.com', '/scenes'), + 1231: ('2 Girls 1 Camera', 'https://tour.2girls1camera.com', '/scenes'), + 1232: ('Cougar Season', 'https://tour.cougarseason.com', '/scenes'), + 1233: ('Deepthroat Sirens', 'https://tour.deepthroatsirens.com', '/scenes'), + 1234: ('Facials Forever', 'https://tour.facialsforever.com', '/scenes'), + 1235: ('Pounded Petite', 'https://tour.poundedpetite.com', '/scenes'), + 1236: ('She\'s Brand New', 'https://tour.shesbrandnew.com', '/scenes'), 1237: ('MyDirtyHobby', 'https://en.mydirtyhobby.com', '/search?searchKeyword='), 1238: ('Deviante', 'https://www.deviante.com', 'https://site-api.project1service.com'), 1239: ('Forgive Me Father', 'https://www.forgivemefather.com', 'https://site-api.project1service.com'), @@ -1768,17 +1766,17 @@ 1672: ('Young Busty', 'https://adultprime.com', '/studios/search?type='), 1673: ('Abuse Me', 'http://bangbrosportal.com', '/?s='), 1674: ('DirtyAuditions', 'https://dirtyauditions.com', '/_next/data/'), - 1675: ('Sexy Modern Bull', 'https://sexymodernbull.com', '/search/'), - 1676: ('GotFilled', 'https://gotfilled.com', '/search/'), - 1677: ('ComeInside', 'https://comeinside.com', '/models/'), - 1678: ('Benefit Monkey', 'https://benefitmonkey.com', '/search/'), - 1679: ('Ricky\'s Room', 'https://rickysroom.com', '/search/'), - 1680: ('Inserted', 'https://inserted.com', '/search/'), - 1681: ('BJRAW', 'https://bjraw.com', '/search/'), - 1682: ('AltErotic', 'https://alterotic.com', '/search/'), - 1683: ('Lezkey', 'https://lezkey.com', '/search/'), - 1684: ('Side Chick', 'https://sidechick.com', '/search/'), - 1685: ('JAV888', 'https://jav888.com', '/search/'), + 1675: ('Sexy Modern Bull', 'https://sexymodernbull.com', '/videos'), + 1676: ('GotFilled', 'https://gotfilled.com', '/videos'), + 1677: ('Come Inside', 'https://comeinside.com', '/scenes'), + 1678: ('Benefit Monkey', 'https://benefitmonkey.com', '/scenes'), + 1679: ('Ricky\'s Room', 'https://rickysroom.com', '/videos'), + 1680: ('Inserted', 'https://inserted.com', '/videos'), + 1681: ('BJ Raw', 'https://bjraw.com', '/videos'), + 1682: ('AltErotic', 'https://alterotic.com', '/videos'), + 1683: ('Lezkey', 'https://lezkey.com', '/scenes'), + 1684: ('SIDECHICK', 'https://sidechick.com', '/videos'), + 1685: ('JAV888', 'https://jav888.com', '/videos'), 1686: ('Smashed', 'https://nubiles-porn.com', '/video/website/68/'), 1687: ('Pie 4k', 'https://vip4k.com', '/en/search/'), 1688: ('Shower 4K', 'https://pornplus.com', '/video/'), @@ -1840,7 +1838,7 @@ 1744: ('ScoreVideos', 'https://www.scorevideos.com', '/porn-videos/'), 1745: ('Bush', 'https://www.cherrypimps.com', '/search.php?query='), 1746: ('Ginger', 'https://www.cherrypimps.com', '/search.php?query='), - 1747: ('Divine-DD', 'https://www.divine-dd.com', '/search/'), + 1747: ('Divine-DD', 'https://www.divine-dd.com', '/videos'), 1748: ('Serve 4K', 'https://vip4k.com', '/en/search/'), 1749: ('Fan Fuckers', 'https://adultprime.com', '/studios/search?type='), 1750: ('Fill Up My Mom', 'https://www.filthykings.com', 'https://tsmkfa364q-dsn.algolia.net/1/indexes/*/queries'), @@ -1895,9 +1893,9 @@ 1799: ('Brand New Amateurs', 'https://brandnewamateurs.com', '/models'), 1800: ('Hot Wives Cheating', 'https://hotwivescheating.com/', '/MemberSceneSearch?q='), 1801: ('Pornbox', 'https://www.pornbox.com', '/store/search?q='), - 1802: ('Downblouse Jerk', 'https://www.downblousejerk.com', '/search'), - 1803: ('Real Bikini Girls', 'https://www.realbikinigirls.com', '/search'), - 1804: ('Lingerie Tales', 'https://www.lingerietales.com', '/search'), + 1802: ('DownblouseJerk', 'https://www.downblousejerk.com', '/videos'), + 1803: ('RealBikiniGirls', 'https://www.realbikinigirls.com', '/videos'), + 1804: ('LingerieTales', 'https://www.lingerietales.com', '/videos'), 1805: ('DFXtra', 'https://www.dogfartnetwork.com', 'https://tsmkfa364q-dsn.algolia.net/1/indexes/*/queries'), 1806: ('Milfy', 'https://www.milfy.com', '/graphql'), 1807: ('Use POV', 'https://www.usepov.com', '/movies/'), @@ -1922,6 +1920,28 @@ 1826: ('Cream Her', 'https://www.creamher.com', '/search.php?query='), 1827: ('DR. Daddy POV', 'https://www.drdaddypov.com', '/search.php?query='), 1828: ('Goth Girlfriends', 'https://www.gothgirlfriends.com', '/search.php?query='), + 1829: ('POV Perv', 'https://tour.povperv.com', '/scenes'), + 1830: ('LegendaryX', 'https://legendaryx.com', '/videos'), + 1831: ('Amazing Films', 'https://amazingfilms.com', '/videos'), + 1832: ('Lucid Flix', 'https://lucidflix.com', '/episodes'), + 1833: ('Nick Marxx', 'https://nickmarxx.com', '/videos'), + 1834: ('BlackBullChallenge', 'https://blackbullchallenge.com', '/videos'), + 1835: ('Dark Shade', 'https://darkshade.com', '/videos'), + 1836: ('Dick HD Daily', 'https://dickhddaily.com', '/videos'), + 1837: ('Dire Desires', 'https://diredesires.com', '/scenes'), + 1838: ('Purity VR', 'https://purityvr.com', '/videos'), + 1839: ('Passion POV', 'https://passionpov.com', '/videos'), + 1840: ('Queer Crush', 'https://queercrush.com', '/videos'), + 1841: ('Hard Werk', 'https://hardwerk.com', '/films'), + 1842: ('Cannon Prod', 'https://cannonprod.com', '/videos'), + 1843: ('Bemefi', 'https://bemefi.com', '/videos'), + 1844: ('FreakMobMedia', 'https://freakmobmedia.com', '/videos'), + 1845: ('XFul', 'https://xful.com', '/videos'), + 1846: ('S3XUS', 'https://s3xus.com', '/scenes'), + 1847: ('Yes Girlz', 'https://yesgirlz.com', '/scenes'), + 1848: ('Z Filmz Originals', 'https://z-filmz-originals.com', '/videos'), + 1849: ('Hoby Buchanon', 'https://hobybuchanon.com', '/updates'), + 1850: ('VRHush', 'https://vrhush.com', '/scenes'), } abbreviations = ( @@ -2021,6 +2041,7 @@ ('^faq ', 'FirstAnalQuest '), ('^fds ', 'FakeDrivingSchool '), ('^fft ', 'FemaleFakeTaxi '), + ('^ffr ', 'FacialsForever '), ('^fhd ', 'FantasyHD '), ('^fhl ', 'FakeHostel '), ('^fho ', 'FakehubOriginals '), @@ -2028,6 +2049,7 @@ ('^fj ', 'Femjoy '), ('^fka ', 'FakeAgent '), ('^fm ', 'FuckingMachines '), + ('^fmm ', 'FreakMobMedia '), ('^fms ', 'FantasyMassage '), ('^frs ', 'FitnessRooms '), ('^ft ', 'FastTimes '), @@ -2760,10 +2782,6 @@ def getProviderFromSiteNum(siteNum): elif siteNum == 836: provider = siteATKGirlfriends - # TwoWebMedia - elif (837 <= siteNum <= 839) or (1802 <= siteNum <= 1804): - provider = networkTwoWebMedia - # Interracial Pass / ExploitedX / I Kiss Girls elif siteNum == 840 or (976 <= siteNum <= 978) or siteNum == 1244 or (1563 <= siteNum <= 1564): provider = siteInterracialPass @@ -3080,10 +3098,6 @@ def getProviderFromSiteNum(siteNum): elif (1196 <= siteNum <= 1228): provider = networkPornCZ - # Top Web Models - elif (1229 <= siteNum <= 1236): - provider = networkTopWebModels - # MyDirtyHobby elif siteNum == 1237: provider = siteMyDirtyHobby @@ -3208,7 +3222,7 @@ def getProviderFromSiteNum(siteNum): provider = siteJAVDatabase # Radical Cash - elif (1675 <= siteNum <= 1685) or siteNum == 1747: + elif (837 <= siteNum <= 839) or (1229 <= siteNum <= 1236) or (1675 <= siteNum <= 1685) or siteNum == 1747 or (1802 <= siteNum <= 1804) or (1829 <= siteNum <= 1850): provider = networkRadicalCash # Teeny Taboo diff --git a/Contents/Code/networkRadicalCash.py b/Contents/Code/networkRadicalCash.py index caa7d9201..21072fac1 100644 --- a/Contents/Code/networkRadicalCash.py +++ b/Contents/Code/networkRadicalCash.py @@ -9,43 +9,49 @@ def search(results, lang, siteNum, searchData): sceneId = parts[0] searchData.title = searchData.title.replace(sceneId, '', 1).strip() - if PAsearchSites.getSearchSiteName(siteNum) == 'ComeInside': - searchURL = PAsearchSites.getSearchSearchURL(siteNum) + slugify(searchData.title.lower()) - else: - searchURL = PAsearchSites.getSearchSearchURL(siteNum) + searchData.encoded.lower() - + searchURL = '%s/api/search/%s' % (PAsearchSites.getSearchBaseURL(siteNum), searchData.encoded.lower()) req = PAutils.HTTPRequest(searchURL) - searchPageElements = HTML.ElementFromString(req.text) - - searchResults = json.loads(searchPageElements.xpath('//script[@type="application/json"]')[0].text_content()) - - if PAsearchSites.getSearchSiteName(siteNum) == 'ComeInside': - data = searchResults['props']['pageProps']['model_contents'] - else: - data = searchResults['props']['pageProps']['contents']['data'] + searchResults = req.json() + data = searchResults['playlists'] if siteNum == 1677 else searchResults['scenes'] if searchResults: for searchResult in data: - titleNoFormatting = PAutils.parseTitle(searchResult['title'], siteNum) - videoId = searchResult['id'] + for type in ['scene', 'bts']: + if type == 'bts' and siteNum == 1835: + titleNoFormatting = 'BTS: %s' % PAutils.parseTitle(searchResult['title'], siteNum) + + releaseDate = parse(searchResult['publish_date']).strftime('%Y-%m-%d') + sceneURL = '%s/bts/%s-bts' % (PAsearchSites.getSearchBaseURL(siteNum), searchResult['slug']) - if PAsearchSites.getSearchSiteName(siteNum) == 'ComeInside': - releaseDate = parse(searchResult['created_at']).strftime('%Y-%m-%d') - sceneURL = '%s/scenes/%s/%s' % (PAsearchSites.getSearchBaseURL(siteNum), videoId, searchResult['slug']) - else: - releaseDate = parse(searchResult['publish_date']).strftime('%Y-%m-%d') - sceneURL = '%s/videos/%s' % (PAsearchSites.getSearchBaseURL(siteNum), searchResult['slug']) + curID = PAutils.Encode(sceneURL) - curID = PAutils.Encode(sceneURL) + if searchData.date: + score = 80 - Util.LevenshteinDistance(searchData.date, releaseDate) + else: + score = 80 - Util.LevenshteinDistance(searchData.title.lower(), titleNoFormatting.lower()) - if sceneId and int(sceneId) == int(videoId): - score == 100 - elif searchData.date: - score = 80 - Util.LevenshteinDistance(searchData.date, releaseDate) - else: - score = 80 - Util.LevenshteinDistance(searchData.title.lower(), titleNoFormatting.lower()) + results.Append(MetadataSearchResult(id='%s|%d' % (curID, siteNum), name='%s [%s] %s' % (titleNoFormatting, PAsearchSites.getSearchSiteName(siteNum), releaseDate), score=score, lang=lang)) + elif type == 'scene': + titleNoFormatting = PAutils.parseTitle(searchResult['title'], siteNum) + videoId = searchResult['id'] - results.Append(MetadataSearchResult(id='%s|%d' % (curID, siteNum), name='%s [%s] %s' % (titleNoFormatting, PAsearchSites.getSearchSiteName(siteNum), releaseDate), score=score, lang=lang)) + if siteNum == 1677: + releaseDate = parse(searchResult['created_at']).strftime('%Y-%m-%d') + sceneURL = '%s/%s/%s' % (PAsearchSites.getSearchSearchURL(siteNum), videoId, searchResult['slug']) + else: + releaseDate = parse(searchResult['publish_date']).strftime('%Y-%m-%d') + sceneURL = '%s/%s' % (PAsearchSites.getSearchSearchURL(siteNum), searchResult['slug']) + + curID = PAutils.Encode(sceneURL) + + if sceneId and int(sceneId) == int(videoId): + score == 100 + elif searchData.date: + score = 80 - Util.LevenshteinDistance(searchData.date, releaseDate) + else: + score = 80 - Util.LevenshteinDistance(searchData.title.lower(), titleNoFormatting.lower()) + + results.Append(MetadataSearchResult(id='%s|%d' % (curID, siteNum), name='%s [%s] %s' % (titleNoFormatting, PAsearchSites.getSearchSiteName(siteNum), releaseDate), score=score, lang=lang)) return results @@ -58,7 +64,7 @@ def update(metadata, lang, siteNum, movieGenres, movieActors, art): detailsPageElements = HTML.ElementFromString(req.text) videoPageElements = json.loads(detailsPageElements.xpath('//script[@type="application/json"]')[0].text_content()) - if PAsearchSites.getSearchSiteName(siteNum) == 'ComeInside': + if siteNum == 1677: video = videoPageElements['props']['pageProps']['playlist'] content = videoPageElements['props']['pageProps']['content'] else: @@ -69,14 +75,23 @@ def update(metadata, lang, siteNum, movieGenres, movieActors, art): metadata.title = PAutils.parseTitle(video['title'], siteNum) # Summary - metadata.summary = video['description'] + summary = video['description'] + if not re.search(r'.$(?<=(!|\.|\?))', summary): + summary = summary + '.' + metadata.summary = summary # Studio - metadata.studio = 'Radical Cash' + if (1229 <= siteNum <= 1236): + metadata.studio = 'Top Web Models' + elif (837 <= siteNum <= 839): + metadata.studio = 'TwoWebMedia' + else: + metadata.studio = 'Radical Cash' # Tagline and Collection(s) - tagline = PAsearchSites.getSearchSiteName(siteNum) - metadata.tagline = tagline + tagline = content['site'] if siteNum == 1677 else video['site'] + if metadata.studio != tagline: + metadata.tagline = tagline metadata.collections.add(tagline) # Release Date @@ -98,12 +113,25 @@ def update(metadata, lang, siteNum, movieGenres, movieActors, art): movieActors.addActor(actorName, actorPhotoURL) # Posters - art.append(content['trailer_screencap']) + if content['trailer_screencap']: + art.append(content['trailer_screencap']) + + if 'previews' in content: + for image in content['previews']['full']: + art.append(image) + for imageType in ['extra_thumbnails']: if imageType in content: for image in list(content[imageType]): art.append(image) + if not art: + if 'thumbs' in content: + for image in content['thumbs']: + art.append(image) + + images = [] + posterExists = False Log('Artwork found: %d' % len(art)) for idx, posterUrl in enumerate(art, 1): if not PAsearchSites.posterAlreadyExists(posterUrl, metadata): @@ -117,10 +145,27 @@ def update(metadata, lang, siteNum, movieGenres, movieActors, art): if height > width: # Item is a poster metadata.posters[posterUrl] = Proxy.Media(image.content, sort_order=idx) + posterExists = True if width > height: # Item is an art item + images.append((image, posterUrl)) metadata.art[posterUrl] = Proxy.Media(image.content, sort_order=idx) except: pass + elif PAsearchSites.posterOnlyAlreadyExists(posterUrl, metadata): + posterExists = True + + if not posterExists: + for idx, (image, posterUrl) in enumerate(images, 1): + try: + im = StringIO(image.content) + resized_image = Image.open(im) + width, height = resized_image.size + # Add the image proxy items to the collection + if width > 1: + # Item is a poster + metadata.posters[posterUrl] = Proxy.Media(image.content, sort_order=idx) + except: + pass return metadata diff --git a/Contents/Code/networkTopWebModels.py b/Contents/Code/networkTopWebModels.py deleted file mode 100644 index 0ab93210d..000000000 --- a/Contents/Code/networkTopWebModels.py +++ /dev/null @@ -1,128 +0,0 @@ -import PAsearchSites -import PAutils - - -def getJSONfromPage(url): - req = PAutils.HTTPRequest(url) - detailsPageElements = HTML.ElementFromString(req.text) - - if req.ok: - data = None - node = detailsPageElements.xpath('//script[contains(., "window.__DATA__")]') - if node: - data = node[0].text_content().split('=', 1)[1].strip() - - if data: - return json.loads(data)['data'] - - return None - - -def search(results, lang, siteNum, searchData): - sceneID = None - parts = searchData.title.split() - if unicode(parts[0], 'UTF-8').isdigit(): - sceneID = int(parts[0]) - - if sceneID > 100: - searchData.title = searchData.title.replace(str(sceneID), '', 1).strip() - - searchData.encoded = searchData.title.replace(' ', '%20') - searchResults = getJSONfromPage(PAsearchSites.getSearchSearchURL(siteNum) + searchData.encoded)['videos'] - - if 'items' in searchResults: - for searchResult in searchResults['items']: - titleNoFormatting = searchResult['title'] - resultID = searchResult['id'] - - sceneURLTitle = slugify(titleNoFormatting, replacements=[('\'', '')]) - sceneURL = '%s/scenes/%s/%s' % (PAsearchSites.getSearchBaseURL(siteNum), resultID, sceneURLTitle) - curID = PAutils.Encode(sceneURL) - - date = searchResult['release_date'] - if date: - releaseDate = parse(date).strftime('%Y-%m-%d') - else: - releaseDate = searchData.dateFormat() if searchData.date else '' - displayDate = releaseDate if date else '' - - if resultID == sceneID: - score = 100 - elif searchData.date and displayDate: - score = 100 - Util.LevenshteinDistance(searchData.date, releaseDate) - else: - score = 100 - Util.LevenshteinDistance(searchData.title.lower(), titleNoFormatting.lower()) - - results.Append(MetadataSearchResult(id='%s|%d' % (curID, siteNum), name='%s [TWM/%s] %s' % (titleNoFormatting, PAsearchSites.getSearchSiteName(siteNum), displayDate), score=score, lang=lang)) - - return results - - -def update(metadata, lang, siteNum, movieGenres, movieActors, art): - metadata_id = str(metadata.id).split('|') - sceneURL = PAutils.Decode(metadata_id[0]) - - basePageElements = getJSONfromPage(sceneURL) - detailsPageElements = basePageElements['video'] - - # Title - metadata.title = detailsPageElements['title'] - - # Summary - metadata.summary = PAutils.cleanHTML(detailsPageElements['description']) - - # Studio - metadata.studio = 'Top Web Models' - - # Tagline and Collection(s) - if 'sites' in detailsPageElements: - tagline = re.sub(r"(\w)([A-Z])", r"\1 \2", json.loads(json.dumps(detailsPageElements['sites'][0]))['name']) - else: - tagline = PAsearchSites.getSearchSiteName(siteNum) - metadata.tagline = tagline - metadata.collections.add(tagline) - - # Date - date = detailsPageElements['release_date'] - if date: - date_object = parse(date) - metadata.originally_available_at = date_object - metadata.year = metadata.originally_available_at.year - - # Genres - for genreLink in detailsPageElements['tags']: - genreName = genreLink['name'] - - movieGenres.addGenre(genreName) - - # Actor(s) - for actorLink in detailsPageElements['models']: - actorName = actorLink['name'] - actorPhotoURL = actorLink['thumb'] - - movieActors.addActor(actorName, actorPhotoURL) - - # Posters - art.append(detailsPageElements['thumb']) - art.append(basePageElements['file_poster']) - - Log('Artwork found: %d' % len(art)) - for idx, posterUrl in enumerate(art, 1): - if not PAsearchSites.posterAlreadyExists(posterUrl, metadata): - # Download image file for analysis - try: - image = PAutils.HTTPRequest(posterUrl) - im = StringIO(image.content) - resized_image = Image.open(im) - width, height = resized_image.size - # Add the image proxy items to the collection - if width > 1 or height > width: - # Item is a poster - metadata.posters[posterUrl] = Proxy.Media(image.content, sort_order=idx) - if width > 100 and width > height: - # Item is an art item - metadata.art[posterUrl] = Proxy.Media(image.content, sort_order=idx) - except: - pass - - return metadata diff --git a/Contents/Code/networkTwoWebMedia.py b/Contents/Code/networkTwoWebMedia.py deleted file mode 100644 index 5390fe750..000000000 --- a/Contents/Code/networkTwoWebMedia.py +++ /dev/null @@ -1,114 +0,0 @@ -import PAsearchSites -import PAutils - - -def getJSONfromPage(url): - req = PAutils.HTTPRequest(url) - detailsPageElements = HTML.ElementFromString(req.text) - - if req.ok: - data = None - node = detailsPageElements.xpath('//script[@id="__NEXT_DATA__"]') - if node: - data = node[0].text_content() - - if data: - return json.loads(data)['props']['pageProps'] - - return None - - -def search(results, lang, siteNum, searchData): - searchURL = '%s/%s' % (PAsearchSites.getSearchSearchURL(siteNum), searchData.encoded) - searchResults = getJSONfromPage(searchURL)['contents']['data'] - for searchResult in searchResults: - titleNoFormatting = PAutils.parseTitle(searchResult['title'], siteNum) - sceneURL = '%s/videos/%s' % (PAsearchSites.getSearchBaseURL(siteNum), searchResult['slug']) - curID = PAutils.Encode(sceneURL) - - date = searchResult['publish_date'] - if date: - releaseDate = parse(date).strftime('%Y-%m-%d') - else: - releaseDate = searchData.dateFormat() if searchData.date else '' - - displayDate = releaseDate if date else '' - - if searchData.date: - score = 100 - Util.LevenshteinDistance(searchData.date, releaseDate) - else: - score = 100 - Util.LevenshteinDistance(searchData.title.lower(), titleNoFormatting.lower()) - - results.Append(MetadataSearchResult(id='%s|%d|%s' % (curID, siteNum, releaseDate), name='%s [TwoWebMedia/%s] %s' % (titleNoFormatting, PAsearchSites.getSearchSiteName(siteNum), displayDate), score=score, lang=lang)) - - return results - - -def update(metadata, lang, siteNum, movieGenres, movieActors, art): - metadata_id = str(metadata.id).split('|') - sceneURL = PAutils.Decode(metadata_id[0]) - jsonPageElements = getJSONfromPage(sceneURL) - models = jsonPageElements['models'] - detailsPageElements = jsonPageElements['content'] - - # Title - metadata.title = PAutils.parseTitle(detailsPageElements['title'], siteNum) - - # Summary - metadata.summary = detailsPageElements['description'] - - # Studio - metadata.studio = 'TwoWebMedia' - - # Tagline and Collection(s) - tagline = PAsearchSites.getSearchSiteName(siteNum) - metadata.tagline = tagline - metadata.collections.add(tagline) - - # Release Date - date = detailsPageElements['publish_date'].split()[0] - if date: - date_object = datetime.strptime(date, '%Y/%m/%d') - metadata.originally_available_at = date_object - metadata.year = metadata.originally_available_at.year - - # Genres - for genreLink in detailsPageElements['tags']: - genreName = genreLink - - movieGenres.addGenre(genreName) - - # Actor(s) - for actorLink in models: - actorName = actorLink['name'] - actorPhotoURL = actorLink['thumbnails'][0] - - movieActors.addActor(actorName, actorPhotoURL) - - # Posters - for idx, poster in enumerate(detailsPageElements['photos']['full']): - art.append(detailsPageElements['photos']['full'][str(idx)]) - - Log('Artwork found: %d' % len(art)) - for idx, posterUrl in enumerate(art, 1): - # Remove Timestamp and Token from URL - cleanUrl = posterUrl.split('?')[0] - art[idx - 1] = cleanUrl - if not PAsearchSites.posterAlreadyExists(cleanUrl, metadata): - # Download image file for analysis - try: - image = PAutils.HTTPRequest(posterUrl, headers={'Referer': sceneURL}) - im = StringIO(image.content) - resized_image = Image.open(im) - width, height = resized_image.size - # Add the image proxy items to the collection - if width > 1: - # Item is a poster - metadata.posters[cleanUrl] = Proxy.Media(image.content, sort_order=idx) - if width > 100: - # Item is an art item - metadata.art[cleanUrl] = Proxy.Media(image.content, sort_order=idx) - except: - pass - - return metadata diff --git a/docs/sitelist.md b/docs/sitelist.md index 27dd9a6ba..2f088c084 100644 --- a/docs/sitelist.md +++ b/docs/sitelist.md @@ -1241,20 +1241,57 @@ If you're having difficulty finding the SceneID, double-check [PAsiteList.py](.. + #### QueenSnake | ❌ - **Exact Title Only** + #### Radical Cash | ✅ - AltErotic + - Amazing Films + - Bemefi - Benefit Monkey - - BJRAW - - ComeInside - **Actor Name Only** + - BJ Raw + - BlackBullChallenge + - Cannon Prod + - Come Inside - **Actor Name Only** + - Dark Shade + - Dick HD Daily + - Dire Desires - Divine-DD + - FreakMobMedia - GotFilled + - Hard Werk + - Hoby Buchanon - Inserted - JAV888 + - LegendaryX - Lezkey + - Lucid Flix + - Nick Marxx + - Passion POV + - POV Perv + - Purity VR + - Queer Crush - Ricky's Room + - S3XUS - Sexy Modern Bull - Side Chick + - Top Web Models + - 2 Girls 1 Camera + - Big Gulp Girls + - Cougar Season + - Deep Throat Sirens + - Facials Forever + - Pounded Petite + - She's Brand New + - TwoWebMedia + - BoppingBabes + - DownblouseJerk + - LingerieTales + - RealBikiniGirls + - UpskirtJerk + - WankItNow + - VRHush + - XFul + - Yes Girlz + - Z Filmz Originals + #### Other Radical Cash Sites | ✅ - PurgatoryX - - ToughLoveX - **Actor Name Only or Title Name Only** + - ToughLoveX - **Actor Name Only or Title Only** + #### Reality Kings Network | ✅ - 40 Inch Plus - 8th Street Latinas @@ -1586,14 +1623,6 @@ If you're having difficulty finding the SceneID, double-check [PAsiteList.py](.. - Over 40 Handjobs - Shady Spa - Teen Tugs -+ #### Top Web Models | ✅ - - 2 Girls 1 Camera - - Big Gulp Girls - - Cougar Season - - Deepthroat Sirens - - Facials Forever - - Pounded Petite - - She's Brand New + #### TransAngels | ✅ + #### True Amateurs | ✅ + #### Twistys | ✅ @@ -1602,13 +1631,6 @@ If you're having difficulty finding the SceneID, double-check [PAsiteList.py](.. - Twistys - TwistysHard - WhenGirlsPlay -+ #### TwoWebMedia | ✅ - - Bopping Babes - - Downblouse Jerk - - Lingerie Tales - - Real Bikini Girls - - Upskirt Jerk - - Wank It Now + #### Ultrafilms | ✓ + #### VIPissy | ✓ + #### VirtualPorn | ✅