-
-
Save JonnyWong16/2607abf0e3431b6f133861bbe1bb694e to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3 | |
# -*- coding: utf-8 -*- | |
# | |
# Description: Sync Plex playlists to shared users. | |
# Author: /u/SwiftPanda16 | |
# Requires: plexapi | |
from plexapi.exceptions import NotFound | |
from plexapi.server import PlexServer | |
### EDIT SETTINGS ### | |
PLEX_URL = 'http://localhost:32400' | |
PLEX_TOKEN = 'xxxxxxxxxx' | |
# List of playlists to sync, set PLAYLISTS = None to sync all playlists | |
PLAYLISTS = ['Playlist 1', 'Playlist 2', 'Playlist 3'] | |
# List of users to sync the playlists to, set USERS = None to sync to all users | |
USERS = ['Username 1', 'Username 2', 'Username 3'] | |
### CODE BELOW ### | |
def sync_playlists(): | |
plex = PlexServer(PLEX_URL, PLEX_TOKEN) | |
account = plex.myPlexAccount() | |
if PLAYLISTS is None: | |
playlists = plex.playlists() | |
else: | |
playlists = [plex.playlist(playlist) for playlist in PLAYLISTS] | |
if USERS is None: | |
users = account.users() | |
else: | |
users = [account.user(username) for username in USERS] | |
for user in users: | |
user_plex = plex.switchUser(user.username or user.title) | |
for playlist in playlists: | |
print(f"Syncing playlist '{playlist.title}' to user '{user.username or user.title}'...") | |
# Delete the old playlist | |
try: | |
user_plex.playlist(playlist.title).delete() | |
except NotFound: | |
pass | |
# Create a new playlist | |
user_plex.createPlaylist(playlist.title, items=playlist.items()) | |
if __name__ == "__main__": | |
sync_playlists() | |
print("Done.") |
Where PLAYLISTS is at the top replace that with PLAYLISTS = []
Then inside the main function but it here:
def main():
"""Main script"""
plex = PlexServer(PLEX_URL, PLEX_TOKEN)
plex_users = get_user_tokens(plex.machineIdentifier)
PLAYLISTS = [x.title for x in plex.playlists()]
plex_playlists = {playlist.title: playlist.items() for playlist in plex.playlists()}
for playlist in PLAYLISTS:
playlist_items = plex_playlists.get(playlist)
Got the same error, "NameError: name 'plex' is not defined".
Trying to sync every playlist to all users.
If you want to share your own playlist with another user you should use ````playlist.copyToUser('username')``` See http://python-plexapi.readthedocs.io/en/latest/modules/playlist.html#plexapi.playlist.Playlist.copyToUser
I keep getting this error:
C:\JBOPS\utility>python sync_playlists_to_users.py
C:\Python27\lib\site-packages\urllib3\connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)
C:\Python27\lib\site-packages\urllib3\connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)
Traceback (most recent call last):
File "sync_playlists_to_users.py", line 112, in <module>
main()
File "sync_playlists_to_users.py", line 78, in main
plex_users = get_user_tokens(plex.machineIdentifier)
File "sync_playlists_to_users.py", line 70, in get_user_tokens
users = {user_ids[user['@userID']]: user['@accessToken'] for user in api_shared_servers['MediaContainer']['SharedServer']}
File "sync_playlists_to_users.py", line 70, in <dictcomp>
users = {user_ids[user['@userID']]: user['@accessToken'] for user in api_shared_servers['MediaContainer']['SharedServer']}
KeyError: u'10033576'
Any ideas?
I also get errors on line 112. Trying to sync every playlist to all my users.
root@openmediavault:/home# python sync_playlists_to_users.py /usr/local/lib/python2.7/dist-packages/urllib3/connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning) /usr/local/lib/python2.7/dist-packages/urllib3/connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning) Traceback (most recent call last): File "sync_playlists_to_users.py", line 112, in <module> main() File "sync_playlists_to_users.py", line 88, in main print("Cloning the '{title}' playlist...".format(title=playlist)) UnicodeEncodeError: 'ascii' codec can't encode character u'\xc5' in position 7: ordinal not in range(128)
I've added the changes above to my own fork and it works for me, just enter your token and run!
https://gist.github.com/Naesstrom/9dcaeac37d5b99d1a4b5b89442133599
Thanks, tried your fork but still get errors.
root@openmediavault:/home/playlist# python sync_playlists_to_all_users.py
/usr/local/lib/python2.7/dist-packages/urllib3/connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)
/usr/local/lib/python2.7/dist-packages/urllib3/connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)
Traceback (most recent call last):
File "sync_playlists_to_all_users.py", line 113, in
main()
File "sync_playlists_to_all_users.py", line 89, in main
print("Cloning the '{title}' playlist...".format(title=playlist))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xc5' in position 7: ordinal not in range(128)
Could it be that I have playlist names containing international characters?
@Naesstrom
Tried to rename the first playlist wich contained the letter Å to A and then it worked! But I have a lot of playlist containing international characters so I would appreciate if is possible to fix this in the script.
@johma74 Try using Python 3. I do not see any issues with playlists with Unicode in them on Python 3.
Python 2 is outdated (with support being dropped in less than 2 years) and does not support Unicode as well as Python 3 does.
@JonnyWong16
I want to thank you for this. Got me going on how to put in what I wanted to do. Along with your other script.
https://github.com/pbrink231/plex_top_playlists
Sorry if this is a dumb question but I'm not coding literate. I get this error:
Traceback (most recent call last):
File "/tmp/user.scripts/tmpScripts/plex - sync playlists/script", line 9, in
import requests
ImportError: No module named requests
Where is the script supposed to be importing requests from?
Thanks
I keep getting this error:
users = {user_ids[user['@userid']]: user['@accesstoken'] for user in api_shared_servers['MediaContainer']['SharedServer']}
KeyError: u'10033576'Any ideas?
Sean, I was having the same issue.
I was able to look into it and I figured it out partially. If I print out each user(Put the code below on line 72) with this snippet:
x=0
for user in api_shared_servers['MediaContainer']['SharedServer']:
print x, user
x+=1
I can see that one of my usersthe admin account has no (u'@username', u''), (u'@email', u''), and the @userid ends up not being found for that user. ~~I am not sure where this user exists/came from as I do NOT have the guest account enabled.~~If you print out the object on line 69 user_ids, you can see the guest account. This is a really old Plex database that I have transferred around for several years. So it's possible it was left there. Edit: I'm not sure if it's intended by the plexapi library to not return the admin user. Doing the fix I have below lets you sync your admin playlist to someone else, but if they make an update you can't add your name to the list to have it sync to you. So their additions get overwritten.
I'm able to hotfix it, by changing the list to start from 1, instead of 0. (My mystery userThe admin is at index 0, I think). So I would use the code above to confirm yours is at 0 too. Then change line 70 to this:
users = {user_ids[user['@userID']]: user['@accessToken'] for user in api_shared_servers['MediaContainer']['SharedServer'][1:]}
This will only keep working if that user at index 0 remains as my mystery useradmin account.
Edit: Whelp, found out that mystery user is my account. Not sure why it shows up as not having a username or email.
ImportError: No module named requests
Where is the script supposed to be importing requests from? Thanks
Hey there, @BinsonBuzz!
If you are on windows, open a command prompt and try typing
python -m pip install requests
If you are on linux/unix you can try this:
pip install requests
edit: You asked where from, requests is not part of the standard library.
Pip is a popular package management system for python that you can use to help you download the requests library.
Doesn't work for me. I get the same error that other's have reported:
/usr/lib/python2.7/site-packages/urllib3/connectionpool.py:847: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)
/usr/lib/python2.7/site-packages/urllib3/connectionpool.py:847: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)
Traceback (most recent call last):
File "./sync_playlists_to_all_users.py", line 108, in
main()
File "./sync_playlists_to_all_users.py", line 74, in main
plex_users = get_user_tokens(plex.machineIdentifier)
File "./sync_playlists_to_all_users.py", line 67, in get_user_tokens
user_ids = {user['@id']: user.get('@username', user.get('@title')) for user in api_users['MediaContainer']['User']}
TypeError: string indices must be integers, not str
I think I figured it out. The message was because for some reason this script will only transfer the playlists from the main account (server owner) to all user accounts. Playlist from the user accounts dont get shared.
PLEX_TOKEN = 'xxxxxxxxxxxxx' # main account
# PLEX_TOKEN = 'yyyyyyyyyyyyy' # user account
I switched back and forth a few times and don't understand why it doesn't work from the regular users.
When running the plexapi playlist example it works no matter who is the user:
for playlist in plex.playlists():
print(playlist.title)
I have a crazy huge MCU Chronological playlist that includes movies, TV episodes and shorts. The script only copied the movie items in the playlists, unfortunately.
Every time this script is run it is duplicating the old playlists and not deleting the old ones for me. Anyone else?
Has anyone found a way to copy other users playlist to the main admin account on the server? One of my users has made an epic playlist that I want to copy to my account so that I can distribute with the rest of the family.
Also, is it possible to copy the text in the description field to all users?
Does this allow you to sync audio playlists between users in Plex or only video playlists?
@codylegger I also wanted to do this. See: https://gist.github.com/murat3/1eace37a6c4a681f19fb044690c2aaac
I made a docker container with plex playlist sync for easier deployment.
I had this working on my Mac..
I moved my Plex server to a new Mac
I updated the token but now I get this error
Warning (from warnings module):
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/urllib3/connectionpool.py", line 1013
warnings.warn(
InsecureRequestWarning: Unverified HTTPS request is being made to host 'plex.tv'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
Warning (from warnings module):
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/urllib3/connectionpool.py", line 1013
warnings.warn(
InsecureRequestWarning: Unverified HTTPS request is being made to host 'plex.tv'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
Traceback (most recent call last):
File "/Users/brettwatson/Desktop/sync_playlists_to_all_users.py", line 113, in
main()
File "/Users/brettwatson/Desktop/sync_playlists_to_all_users.py", line 80, in main
PLAYLISTS = [x.title for x in plex.playlists()]
File "/Users/brettwatson/Desktop/sync_playlists_to_all_users.py", line 80, in
PLAYLISTS = [x.title for x in plex.playlists()]
AttributeError: 'Tag' object has no attribute 'title'
any ideas?
I worked it out the new plexapi kills the script revert to the older plexapi and it works
I worked it out the new plexapi kills the script revert to the older plexapi and it works
@brettwatson77 What version of plexapi did you have to revert to?
I had to revert to # PlexAPI Settings PROJECT = 'PlexAPI' VERSION = ‘4.1.2' And then the script worked again.. It its still working for me with this version of the Plex api Has the script been updated to work with the new plex api? B
…
On 17 Sep 2021, at 8:47 am, shinedou @.***> wrote: @shinedou commented on this gist. I worked it out the new plexapi kills the script revert to the older plexapi and it works What version of plexapi did you have to revert to? — You are receiving this because you commented. Reply to this email directly, view it on GitHub https://gist.github.com/2607abf0e3431b6f133861bbe1bb694e#gistcomment-3895839, or unsubscribe https://github.com/notifications/unsubscribe-auth/ARMFWJVBYKZTLCZGJNZLBJ3UCJXZXANCNFSM4H5X6J5A. Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.
I switched to 4.1.2 , still doesn't work
Is the what the settings should look like?
PLEX_URL = 'http://localhost:32400'
PLEX_TOKEN = 'removed'
PLAYLISTS = [ 'Treadmill'] # List of playlists to sync
USERS = [ 'john.smith' ] # List of users to sync the playlists to
john.smith is a managed user, token is for the Admin account.
Environment
Python = v3.9.7
pip freeze output:
charset-normalizer==2.0.7
idna==3.3
PlexAPI==4.1.2
requests==2.26.0
urllib3==1.26.7
XML2Dict==0.2.2
xmltodict==0.12.0
Error message
Traceback (most recent call last): File "/Users/jgooch/repos/sync_playlists/sync_playlists.py", line 112, in <module> main() File "/Users/jgooch/repos/sync_playlists/sync_playlists.py", line 78, in main plex_users = get_user_tokens(plex.machineIdentifier) File "/Users/jgooch/repos/sync_playlists/sync_playlists.py", line 72, in get_user_tokens users = {user_ids[user['@userID']]: user['@accessToken'] for user in api_shared_servers['MediaContainer']['SharedServer']} File "/Users/jgooch/repos/sync_playlists/sync_playlists.py", line 72, in <dictcomp> users = {user_ids[user['@userID']]: user['@accessToken'] for user in api_shared_servers['MediaContainer']['SharedServer']} TypeError: string indices must be integers
syncing playlists is already possible in plex - officially (but of course, plex style, only for the admin).
vote here to get "better playlists", like having the "sharing power" for all users.
unsubscribed.
@blacktwin
You mean at line 18 & 19 or somewhere else in the script?
Once I've synced the playlists, will they update for my other users when I add new media to them or do I need to resync them again? Guess it would be possible to just add it to a cron job to sync them once a week or something
[EDIT]
Tried adding the lines and running the script but got this: