pkkid / python-plexapi

Python bindings for the Plex API.
BSD 3-Clause "New" or "Revised" License
1.15k stars 199 forks source link

Add an actor to a movie/video with role and thumb #462

Open dom6770 opened 4 years ago

dom6770 commented 4 years ago

So far I have created a little script to add an specific actor to a search result:

from plexapi.server import PlexServer
PLEX_URL = 'http://192.168.178.100:32400'
PLEX_TOKEN = 'token'
homeserver = PlexServer(PLEX_URL, PLEX_TOKEN)

tag = input(f"Actor: ")

for video in homeserver.library.section('test').search(None, collection=[tag]): 
    video._edit_tags(tag="actor", items=[tag])

It work's fine. An actor appears on that particular video(s) in the collection. Now, I just don't want to add the actor, I also want to add the role and a thumb (photo URL), but so far I could not find anything in the documentation and in the source code. (might be it's quite late and I am tired), but I would be thankful if someone could help me with it or make it possible.

blacktwin commented 4 years ago

You and me both. Creating an actor also creates the actor in the DB where I assume you could add the missing thumb and role but I haven't tried that yet. I'd prefer to do it all with API commands.

blacktwin commented 4 years ago

@JonnyWong16 found how to add a thumb.

edits = {
    'actor[0].tag.tag': 'Mom',
    'actor[0].locked': 1,
    'actor[0].tag.thumb': 'https://nickelodeonuniverse.com/wp-content/uploads/Spongebob.png'
}
movie = plex.library.section('Movies').get('Title')
movie.edit(**edits)

Still trying to find role.

JonnyWong16 commented 4 years ago

Found it.

edits = {
    'actor[0].tag.tag': 'Mom',
    'actor[0].locked': 1,
    'actor[0].tagging.text': 'Test Role',
    'actor[0].tag.thumb': 'https://nickelodeonuniverse.com/wp-content/uploads/Spongebob.png'
}
movie = plex.library.section('Movies').get('Title')
movie.edit(**edits)

image

blacktwin commented 4 years ago

Need a addActor or add additional kwargs if it already exists.

Hellowlol commented 4 years ago

Imo we should support objects. So Role.create() and allow that to be passed to edit that serialize this to a url.

blacktwin commented 4 years ago

Agreed.

JonnyWong16 commented 4 years ago

While you're at it, there's a bug if you use _edit_tags(). Somewhere in the code when retrieving a movie, it only retrieves the first 3 actors. Therefore, when you use _edit_tags(), the tag_helper() inserts the new actor into position 4.

Hellowlol commented 4 years ago

It only retrieves 3 as this only what re xml includes. If we want more the user has to movie.reload() is the fourth item overwritten?

JonnyWong16 commented 4 years ago

From my tests it looks like it's inserted and not overwritten. Needs more testing though.

blacktwin commented 4 years ago

@Hellowlol I don't think we can use the Role class to create or edit a role/actor. The actor is tied to a Video object and in order to create one we need to use a Video. I'm thinking of adding the method to add or edit an actor in the Video class.

Some findings in case they are relevant:

Actor's thumb follows the name of the actor across libraries and videos. The role is attached to the video. Actors are not linked across libraries, at least in the WebUI but plex.search('Bob Odenkirk') works :)

blacktwin commented 4 years ago

Refreshing an item removes all added actors from the item. This makes sense for known movies and shows where metadata is available as refreshing wipes the previous metadata values and updates. However, for Home Videos adding an actor named Mom would be pretty cool but if the library get refreshed all your custom actors are lost.

Hellowlol commented 4 years ago

It shouldn’t be deleted as long as the item is locked.

blacktwin commented 4 years ago

Locked attribute doesn't exist for the tag/field and adding the usual locked str doesn't make a difference. I've created a Plex Feature Request. But I'm not sure that we are really supposed to be allowed to edit actors like this.

blacktwin commented 4 years ago

With actor[0] and using index= for actor[index] has been very inconsistent. Typically any new actor created or any existing actor that is edited (add or change role, thumb, or just index) moves the actor to the beginning of cast list. However I've observed several times where changing the index value to -1, 1, or 2 when creating or just updating the index value for an existing actor will cause them to move forward or backward in the listings. This has been somewhat random.