From 07849391f9c2b804c5af9884030c4f30d5073f81 Mon Sep 17 00:00:00 2001 From: diamondpete <87245367+diamondpete@users.noreply.github.com> Date: Wed, 31 Jan 2024 00:16:47 -0500 Subject: [PATCH] Rework Bellesa to New Site --- Contents/Code/PAsiteList.py | 9 ++- Contents/Code/networkBellesa.py | 136 ++++++++++++++++++++++++++++++++ docs/sitelist.md | 5 +- 3 files changed, 144 insertions(+), 6 deletions(-) create mode 100644 Contents/Code/networkBellesa.py diff --git a/Contents/Code/PAsiteList.py b/Contents/Code/PAsiteList.py index e2e60dc6f..03888c161 100644 --- a/Contents/Code/PAsiteList.py +++ b/Contents/Code/PAsiteList.py @@ -189,6 +189,7 @@ import siteSexSelector import siteXevUnleashed import networkPKJMedia +import networkBellesa searchSites = { 0: ('BlackedRaw', 'https://www.blackedraw.com', '/graphql'), @@ -990,7 +991,7 @@ 796: ('Moms On Moms', 'https://www.girlsway.com', '/en/video/1/1/'), 797: ('We Like Girls', 'https://www.girlsway.com', '/en/video/1/1/'), 798: ('Lil Humpers', 'https://www.realitykings.com', 'https://site-api.project1service.com'), - 799: ('Bellesa Films', 'https://www.bellesafilms.com', 'https://site-api.project1service.com'), + 799: ('Bellesa Films', 'https://bellesaplus.co', 'https://bellesaplus.co/api/rest/v1'), 800: ('ClubSweethearts', 'https://adultprime.com', '/studios/search?type='), 801: (), 802: ('Family Sinners', 'https://www.familysinners.com', 'https://site-api.project1service.com'), @@ -1067,7 +1068,7 @@ 873: ('SubmissiveX', 'http://www.kink.com', '/search?channelIds=submissivex&q='), 874: ('Filthy Femdom', 'http://www.kink.com', '/search?channelIds=filthyfemdom&q='), 875: ('Anal Mom', 'https://analmom.com', '/movies/'), - 876: ('Bellesa House', 'https://www.bellesafilms.com', 'https://site-api.project1service.com'), + 876: ('Bellesa House', 'https://bellesaplus.co', 'https://bellesaplus.co/api/rest/v1'), 877: ('Reality Lovers', 'https://realitylovers.com', '/videos/search'), 878: ('Adult Time', 'https://adulttime.com', 'https://tsmkfa364q-dsn.algolia.net/1/indexes/*/queries'), 879: ('RealJamVR', 'https://realjamvr.com', '/scene/'), @@ -2673,9 +2674,9 @@ def getProviderFromSiteNum(siteNum): elif siteNum == 798: provider = network1service - # Bellesa Films + # Bellesa elif siteNum == 799 or siteNum == 876: - provider = network1service + provider = networkBellesa # Adult Prime elif siteNum == 800 or (1601 <= siteNum <= 1672) or siteNum == 1749: diff --git a/Contents/Code/networkBellesa.py b/Contents/Code/networkBellesa.py new file mode 100644 index 000000000..7a35dbc24 --- /dev/null +++ b/Contents/Code/networkBellesa.py @@ -0,0 +1,136 @@ +import PAsearchSites +import PAutils + + +def getJSONfromAPI(type, query, siteNum): + url = '%s/%s?%s' % (PAsearchSites.getSearchSearchURL(siteNum), type, query) + headers = { + 'Content-Type': 'application/json', + 'Referer': PAsearchSites.getSearchBaseURL(siteNum) + } + req = PAutils.HTTPRequest(url, headers=headers) + result = HTML.ElementFromString(req.text) + + return json.loads(result.xpath('//body')[0].text_content()) + + +def search(results, lang, siteNum, searchData): + sceneID = None + parts = searchData.title.split() + if unicode(parts[0], 'UTF-8').isdigit(): + sceneID = parts[0] + searchData.title = searchData.title.replace(sceneID, '', 1).strip() + + if sceneID: + scenePageElements = getJSONfromAPI('videos', 'filter[id]=%s' % sceneID, siteNum)[0] + + titleNoFormatting = PAutils.parseTitle(scenePageElements['title'], siteNum) + curID = sceneID + subSite = scenePageElements['content_provider'][0]['name'] + + date = scenePageElements['posted_on'] + if date: + releaseDate = datetime.fromtimestamp(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 [Bellesa/%s] %s' % (titleNoFormatting, subSite, displayDate), score=score, lang=lang)) + else: + searchResults = getJSONfromAPI('search', 'limit=40&order[relevance]=DESC&q=%s&providers=bellesa' % searchData.title.replace(' ', '%20'), siteNum) + + for searchResult in searchResults['videos']: + titleNoFormatting = PAutils.parseTitle(searchResult['title'], siteNum) + curID = searchResult['id'] + + date = searchResult['posted_on'] + if date: + releaseDate = datetime.fromtimestamp(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 [Bellesa] %s' % (titleNoFormatting, displayDate), score=score, lang=lang)) + + return results + + +def update(metadata, lang, siteNum, movieGenres, movieActors, art): + metadata_id = metadata.id.split('|') + sceneDate = metadata_id[2] + sceneID = metadata_id[0] + + detailsPageElements = getJSONfromAPI('videos', 'filter[id]=%s' % sceneID, siteNum)[0] + + # Title + metadata.title = PAutils.parseTitle(detailsPageElements['title'], siteNum) + + # Summary + metadata.summary = detailsPageElements['description'] + + # Studio + metadata.studio = 'Bellesa' + + # Tagline and Collection(s) + tagline = detailsPageElements['content_provider'][0]['name'] + metadata.tagline = tagline + metadata.collections.add(tagline) + + # Release Date + if sceneDate: + date_object = parse(sceneDate) + metadata.originally_available_at = date_object + metadata.year = metadata.originally_available_at.year + + # Genres + genres = detailsPageElements['tags'].split(',') + for genreLink in genres: + genreName = genreLink.strip() + + movieGenres.addGenre(genreName) + + # Actor(s) + actors = detailsPageElements['performers'] + + for actor in actors: + actorName = actor['name'] + actorPhotoURL = '' + + if actor['image']: + actorPhotoURL = actor['image'] + + movieActors.addActor(actorName, actorPhotoURL) + + # Posters + art.append(detailsPageElements['image']) + + 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/docs/sitelist.md b/docs/sitelist.md index b6423bf0c..e318c89d7 100644 --- a/docs/sitelist.md +++ b/docs/sitelist.md @@ -315,6 +315,9 @@ If you're having difficulty finding the SceneID, double-check [PAsiteList.py](.. - MonroeLee - See Him Fuck - TaliaShepard ++ #### Bellesa | ✅ - **Flaresolverr Required** + - Bellesa Films + - Bellesa House + #### Black PayBack | ✓ + #### Black Valley Girls | ❌ - **SceneID** + #### Blowpass | ✅ @@ -792,8 +795,6 @@ If you're having difficulty finding the SceneID, double-check [PAsiteList.py](.. - SweetheartVideo - SweetSinner + #### MileHighNetwork Other Sites | ✅ - - BellesaFilms - - BellesaHouse - Dilfed - FamilySinners - Gilfed