phoenixplexcode / phoenixadult.bundle Goto Github PK
View Code? Open in Web Editor NEWPlex Meta-Data Agent for scene videos from multiple adult sites
Plex Meta-Data Agent for scene videos from multiple adult sites
Can you please bring this to Jellyfin?
Jellyfin is open source and respects users privacy. Lots of users are switching off Plex tbh. Would be nice to have this.
in networkNubiles.py bugfix
import PAsearchSites
import PAgenres
import PAactors
def search(results,encodedTitle,title,searchTitle,siteNum,lang,searchByDateActor,searchDate,searchSiteID):
if searchSiteID != 9999:
siteNum = searchSiteID
if searchDate:
url = PAsearchSites.getSearchSearchURL(siteNum) + "date/" + searchDate + "/" + searchDate
log("URL SEARCH: " + url)
searchResults = HTML.ElementFromURL(url)
for searchResult in searchResults.xpath('//div[contains(@class,"thumbnail-grid videoset")]'):
titleNoFormatting = searchResult.xpath('.//img')[0].get('alt').strip()
temp = searchResult.xpath('.//a[@class="title"]')[0].get('href')
alpha = temp.replace('/', '_', 2).find('/')+1
omega = temp.rfind('/')
curID = temp[alpha:omega].replace('/','_').replace('?','!')
Log('curID: ' + str(curID))
releaseDate = parse(searchResult.xpath('.//span[@class="date"]')[0].text_content().strip()).strftime('%Y-%m-%d')
if searchDate:
score = 100 - Util.LevenshteinDistance(searchDate, releaseDate)
else:
score = 100 - Util.LevenshteinDistance(searchTitle.lower(), titleNoFormatting.lower())
results.Append(MetadataSearchResult(id = curID + "|" + str(siteNum), name = titleNoFormatting + " [" + PAsearchSites.getSearchSiteName(siteNum) + "] " + releaseDate, score = score, lang = lang))
if unicode(searchTitle, 'utf-8').isnumeric():
url = PAsearchSites.getSearchBaseURL(siteNum) + "/video/watch/" + searchTitle.lower().replace(" ","-").replace("'","-")
searchResults = HTML.ElementFromURL(url)
searchResult = searchResults.xpath('//div[@class="descrips"]')[0]
titleNoFormatting = searchResult.xpath('//span[@class="wp-title videotitle"]')[0].text_content()
curID = searchTitle.lower().replace(" ","-").replace("'","-")
releaseDate = parse(searchResult.xpath('//div[@class="descrips"]//div[@class="row"]//div[@class="col-lg-6 col-sm-6"]//span')[10].text_content().strip()).strftime('%Y-%m-%d')
score = 100
results.Append(MetadataSearchResult(id = curID + "|" + str(siteNum), name = titleNoFormatting + " [" + PAsearchSites.getSearchSiteName(siteNum) + "] " + releaseDate, score = score, lang = lang))
return results
def update(metadata,siteID,movieGenres,movieActors):
detailsPageElements = HTML.ElementFromURL(PAsearchSites.getSearchBaseURL(siteID) + '/video/watch/' + str(metadata.id).split("|")[0])
art = []
# Title
title = detailsPageElements.xpath('//span[contains(@class,"wp-title videotitle")]')[0].text_content().strip()
metadata.title = title
#episode = title.split(' - ')[-1].strip()
#Log("Sort Title: "+episode + " - " + title[:title.rfind('-')])
#metadata.sort_title = episode + " - " + title[:title.rfind('-')]
# Studio
metadata.studio = "Nubiles"
# Summary
try:
paragraphs = detailsPageElements.xpath('//*[@id="rmjs-1"]/p[1]')
pNum = 0
summary = ""
for paragraph in paragraphs:
if pNum >= 0 and pNum < (len(paragraphs)):
summary = summary + '\n\n' + paragraph.text_content()
pNum += 1
except:
pass
if summary == '':
try:
summary = detailsPageElements.xpath('//div[@class="video-description"]/article')[0].text_content().strip()
except:
pass
metadata.summary = summary.strip()
# Collections / Tagline
siteName = detailsPageElements.xpath('//span[@class="featuring-modelname model"]/preceding::a[1]')[0].text_content().strip()
if "stepsiblingscaught" in siteName.lower():
tagline = "Step Siblings Caught"
elif "momsteachsex" in siteName.lower():
tagline = "Moms Teach Sex"
elif "badteenspunished" in siteName.lower():
tagline = "Bad Teens Punished"
elif "princesscum" in siteName.lower():
tagline = "Princess Cum"
elif "nubilesunscripted" in siteName.lower():
tagline = "Nubiles Unscripted"
elif "nubilescasting" in siteName.lower():
tagline = "Nubiles Casting"
elif "petitehdporn" in siteName.lower():
tagline = "Petite HD Porn"
elif "driverxxx" in siteName.lower():
tagline = "Driver XXX"
elif "petiteballerinasfucked" in siteName.lower():
tagline = "Petite Ballerinas Fucked"
elif "teacherfucksteens" in siteName.lower():
tagline = "Teacher Fucks Teens"
elif "bountyhunterporn" in siteName.lower():
tagline = "Bountyhunter Porn"
elif "daddyslilangel" in siteName.lower():
tagline = "Daddy's Lil Angel"
elif "myfamilypies" in siteName.lower():
tagline = "My Family Pies"
elif "nubiles.net" in siteName.lower():
tagline = "Nubiles"
elif "brattysis" in siteName.lower():
tagline = "Bratty Sis"
elif "anilos" in siteName.lower():
tagline = "Anilos"
elif "hotcrazymess" in siteName.lower():
tagline = "Hot Crazy Mess"
elif "nfbusty" in siteName.lower():
tagline = "NF Busty"
elif "thatsitcomporn" in siteName.lower():
tagline = "That Sitcom Show"
else:
tagline = PAsearchSites.getSearchSiteName(siteID)
metadata.collections.clear()
metadata.tagline = tagline
metadata.collections.add(tagline)
# Date
date = detailsPageElements.xpath('//div[@class="descrips"]//div[@class="row"]//div[@class="col-lg-6 col-sm-6"]//span')[10].text_content().strip()
if len(date) > 0:
date_object = parse(date)
metadata.originally_available_at = date_object
metadata.year = metadata.originally_available_at.year
# Actors
movieActors.clearActors()
actors = detailsPageElements.xpath('//span[@class="featuring-modelname model"]/a')
if len(actors) > 0:
for actorLink in actors:
actorName = actorLink.text_content().strip()
actorPageURL = actorLink.get("href")
actorPage = HTML.ElementFromURL((PAsearchSites.getSearchBaseURL(siteID)+actorPageURL))
actorPhotoURL = "http:"+actorPage.xpath('//div[@id="modelprofile"]/img')[0].get("src")
movieActors.addActor(actorName,actorPhotoURL)
if "Logan Long" in summary:
movieActors.addActor('Logan Long','')
elif "Patrick Delphia" in summary:
movieActors.addActor('Patrick Delphia','')
elif "Seth Gamble" in summary:
movieActors.addActor('Seth Gamble','')
elif "Alex D." in summary:
movieActors.addActor('Alex D.','')
elif "Lucas Frost" in summary:
movieActors.addActor('Lucas Frost','')
elif "Van Wylde" in summary:
movieActors.addActor('Van Wylde','')
elif "Tyler Nixon" in summary:
movieActors.addActor('Tyler Nixon','')
elif "Logan Pierce" in summary:
movieActors.addActor('Logan Pierce','')
elif "Johnny Castle" in summary:
movieActors.addActor('Johnny Castle','')
elif "Damon Dice" in summary:
movieActors.addActor('Damon Dice','')
elif "Scott Carousel" in summary:
movieActors.addActor('Scott Carousel','')
elif "Dylan Snow" in summary:
movieActors.addActor('Dylan Snow','')
elif "Michael Vegas" in summary:
movieActors.addActor('Michael Vegas','')
elif "Xander Corvus" in summary:
movieActors.addActor('Xander Corvus','')
elif "Chad White" in summary:
movieActors.addActor('Chad White','')
# Genres
movieGenres.clearGenres()
genres = detailsPageElements.xpath('//div[@class="tags categories"]/a')
if len(genres) > 0:
for genreLink in genres:
genreName = genreLink.text_content().strip().lower()
movieGenres.addGenre(genreName)
# Posters
background = "http:" + detailsPageElements.xpath('///*[@id="belt"]/div[8]/div/div[3]/div[2]/a/img')[0].get('src')
metadata.art[background] = Proxy.Preview(HTTP.Request(background, headers={'Referer': 'http://www.google.com'}).content, sort_order = 1)
# Scene cover in NubileFilms
try:
posters = detailsPageElements.xpath('//div[@class="thumbnail-grid photoset"]//img')
for poster in posters:
posterName = poster.get("alt")
if posterName == title:
Log('Cover image found')
posterLink = "http:" + poster.get("src")
metadata.posters[posterLink] = Proxy.Preview(HTTP.Request(posterLink, headers={'Referer': 'http://www.google.com'}).content, sort_order = 1)
except:
metadata.posters[background] = Proxy.Preview(HTTP.Request(background, headers={'Referer': 'http://www.google.com'}).content, sort_order = 1)
try:
photoPageURL = PAsearchSites.getSearchBaseURL(siteID) + detailsPageElements.xpath('//a[@class="btn btn-primary btn-xs wptag " and contains(text(),"Pics")]')[0].get('href')
Log("photoPageURL: " + str(photoPageURL))
photoPageElements = HTML.ElementFromURL(photoPageURL)
for posterUrl in photoPageElements.xpath('//figure[@class="photo-thumbnail"]//img'):
art.append("http:" + posterUrl.get('src').replace('/tn',''))
except:
pass
j = 1
Log("Artwork found: " + str(len(art)))
for posterUrl in art:
if not PAsearchSites.posterAlreadyExists(posterUrl,metadata):
#Download image file for analysis
try:
img_file = urllib.urlopen(posterUrl)
im = StringIO(img_file.read())
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.Preview(HTTP.Request(posterUrl, headers={'Referer': 'http://www.google.com'}).content, sort_order = j)
if width > 100 and width > height:
# Item is an art item
metadata.art[posterUrl] = Proxy.Preview(HTTP.Request(posterUrl, headers={'Referer': 'http://www.google.com'}).content, sort_order = j)
j = j + 1
except:
pass
return metadata
Could we search as well if the date is YY MM DD ?
Please understand that I am a newbie to this place and have many questions that you probably think are obvious.
First and simplest question I have is how to I request a site to be added?
For example SexMex doesn't show up. What is the proper method of making this request? Do I have to make a pull?
Thank you
None of my searches for PureTaboo get the correct results. For example:
PureTaboo - 2018-05-10 - Trailer Park Taboo Part 3.mp4
Just gives a list of their scenes, not containing it. I can provide other examples also.
I had to change line 10 to get the next link down. (from 0 to 1)
curID = searchResult.xpath('.//a')[1].get("href")
It was picking up the "join" link and trying to pull the video ID from it.
@macr0dev This plug-in works really well in retrieving movie meta-data for the supported porn sites on my Plex Server.
But I was wondering if you could add support for VR porn sites now that they are becoming increasingly popular, such as...
Naughty America VR
VR Bangers
WankzVR
MilfVR
BaDoink VR
Virtual Taboo
etc...
Thanks in advance.
I wanted to say thanks alot for this plugin, it works like a charm with the supported sites but I wasn't sure if there was any sort of etiquette for requesting any additional sites so I thought I would just ask.
Colette
Digital Playground
Little Caprice Dreams
Playboy Plus
Twistys
I also have no idea if it's possible in any way to grab any metadata for these but I have alot of videos from ManyVids
TIA
The search doesn't return anything for Vixen.
Anyone else also having trouble?
i cant find any videos on *.fidelity, is there any mistake
Just a few suggestions for more networks to add: Nubiles Network, Fake Agent, Passion HD, JoyMii, P*** Pros, Teen Mega World, CLouder, ExpolitedCollegeGirls, GirlsdoP*. Thanks for all the hard work!
Hello,
Thank you for this amazing bundle.
Can you please add a way to pull photo set metadata from websites as well?
I'd love metadata for photosets from MetArt, SexArt and Hegre.
Thank you!
PS. I hope I posted this in the right place. Please tell me if I should post requests somewhere else.
Any way to add video to collection based on actor name?
can i use this plugin rename my video?
can you add support https://www.darkx.com/en/network
There is a separate agent for Data18 but they have changed their website. They now have data on videos that is current but the agent will not work.
Can this be worked into the Phoenix.Adult agent?
Can you please add Naughty America's New Sites, TeensLoveCream & SlutStepSister
Updated code tonight from GitHub. Was working before. Now seems to skip the search. Here is the log.
2020-02-04 01:12:02,918 (2108) : INFO (agentkit:957) - Searching for matches for {'openSubtitlesHash': '539ce44efbe86787', 'name': '2009 10 06 7266 Lillakatt', 'filename': 'S%3A%5CX%5CSites%5CKink%5CHogtied%5C2009-10-06%207266_LillaKatt%2Emp4', 'plexHash': 'a46fae8b46e19254a3132e56a57974b1a7832c43', 'duration': '2767865', 'id': '21967'}
2020-02-04 01:12:02,918 (2108) : DEBUG (networking:143) - Requesting 'http://127.0.0.1:32400/library/metadata/21967/tree'
2020-02-04 01:12:02,930 (2108) : INFO (logkit:16) - *MEDIA TITLE 2009 10 06 7266 Lillakatt
2020-02-04 01:12:02,930 (2108) : INFO (logkit:16) - Getting Search Settings for: 2009 10 06 7266 Lillakatt
2020-02-04 01:12:02,930 (2108) : INFO (logkit:16) - mediaTitle w/ possible abbreviation: 2009 10 06 7266 Lillakatt
2020-02-04 01:12:02,936 (2108) : INFO (logkit:16) - mediaTitle w/ possible abbrieviation fixed: 2009 10 06 7266 Lillakatt
2020-02-04 01:12:02,937 (2108) : CRITICAL (core:574) - Exception in the search function of agent named 'PhoenixAdult', called with keyword arguments {'openSubtitlesHash': '539ce44efbe86787', 'name': '2009 10 06 7266 Lillakatt', 'filename': 'S%3A%5CX%5CSites%5CKink%5CHogtied%5C2009-10-06%207266_LillaKatt%2Emp4', 'plexHash': 'a46fae8b46e19254a3132e56a57974b1a7832c43', 'duration': '2767865', 'id': '21967'} (most recent call last):
File "C:\Program Files (x86)\Plex\Plex Media Server\Resources\Plug-ins-f5213a238\Framework.bundle\Contents\Resources\Versions\2\Python\Framework\api\agentkit.py", line 1007, in search
agent.search(*f_args, **f_kwargs)
File "C:\Users\Donovan\AppData\Local\Plex Media Server\Plug-ins\PhoenixAdult.bundle\Contents\Code_init.py", line 54, in search
searchSettings = PAsearchSites.getSearchSettings(title)
File "C:\Users\Donovan\AppData\Local\Plex Media Server\Plug-ins\PhoenixAdult.bundle\Contents\Code\PAsearchSites.py", line 1205, in getSearchSettings
searchSiteID = getSearchSiteIDByFilter(mediaTitle)
File "C:\Users\Donovan\AppData\Local\Plex Media Server\Plug-ins\PhoenixAdult.bundle\Contents\Code\PAsearchSites.py", line 979, in getSearchSiteIDByFilter
if sites[0].lower().replace(" ","").replace("'","") in searchFilter.lower().replace(".com","").replace("'","") or sites[0].lower().replace(" ","").replace("'","") in searchFilter.lower().replace(".com","").replace(" ","").replace("'",""):
File "C:\Program Files (x86)\Plex\Plex Media Server\Resources\Plug-ins-f5213a238\Framework.bundle\Contents\Resources\Versions\2\Python\Framework\code\sandbox.py", line 108, in
getitem = lambda x, y: x.getitem(y),
AttributeError: 'NoneType' object has no attribute 'getitem'
I'm a newbie to PLEX and I wanted to use it for my scene collection. I've installed the PhoenixAdult, Data18-Phoenix, Vixen and Blacked bundles. They're in the NAS Plug Ins folder and they appear as options when I do a manual search, but I haven't been able to find a single file. Even trying movies like 'deep throat' or 'pirates' which are definitely in Data18 etc. Most of my collection are scenes. I haven't done any renaming yet as I wanted to get the search working first.
Any help for a newbie please?
Is it possible that Lezkiss (https://lezkiss.com/) gets added to the supported networks?
Please add
Netvideogirls
CastingCouch-hd
Thanks
I cannot get any Passion-HD, Fantasy-HD, or PureMature videos to find matches, no issues on another 400 videos...please help.
Hey.. Thanks for the amazing job
I tried your plugin and it works with many sites but when I tried Reality Kings...it does not pull any data at all
I tried different format such as:
Reality Kings - scene name
RealityKings - scene name
Reality Kings Network - scene name
nothing works!
am I missing something? is there something wrong with my format?
SCORELAND HD
PUREMATURE
NEWSENSATIONS
SPYFAM
can you please add those
thanks
Hello!
Sex Art Metadata is not pulling from the site. I've tried all various naming conventions. Interestingly, Met Art metadata pulls just fine without naming the download file.
Suggestions?
Thank you!
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.