Skip to content

Instantly share code, notes, and snippets.

@Nixellion
Last active March 22, 2024 11:50
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Nixellion/03eb0f92cbd7ad173f33ecab225333a9 to your computer and use it in GitHub Desktop.
Save Nixellion/03eb0f92cbd7ad173f33ecab225333a9 to your computer and use it in GitHub Desktop.
Generate Plex Playlist for Stargate shows based on Canonical watch order
# TODO:
# - [ ] Add films processing
# https://docs.google.com/spreadsheets/u/0/d/1b5T6bk5bS9LDaIVXR55-agOd_FYgTN0TZcpZDfvnMg4/pub?output=html
# https://python-plexapi.readthedocs.io/en/latest/modules/playlist.html
# https://www.reddit.com/r/PleX/comments/hmunh9/creating_playlists_with_plex_server_api/
data = '''
Film 01x01
Film 01x01
Film 01x01
SG-1 01x01
SG-1 01x02
SG-1 01x01-02
SG-1 01x03
SG-1 01x04
SG-1 01x05
SG-1 01x06
SG-1 01x07
SG-1 01x08
SG-1 01x09
SG-1 01x10
SG-1 01x11
SG-1 01x12
SG-1 01x13
SG-1 01x14
SG-1 01x15
SG-1 01x16
SG-1 01x17
SG-1 01x18
SG-1 01x19
SG-1 01x20
SG-1 01x21
SG-1 01x22
SG-1 02x01
SG-1 02x02
SG-1 02x03
SG-1 02x04
SG-1 02x05
SG-1 02x06
SG-1 02x07
SG-1 02x08
SG-1 02x09
SG-1 02x10
SG-1 02x11
SG-1 02x12
SG-1 02x13
SG-1 02x14
SG-1 02x15
SG-1 02x16
SG-1 02x17
SG-1 02x18
SG-1 02x19
SG-1 02x20
SG-1 02x21
SG-1 02x22
SG-1 03x01
SG-1 03x02
SG-1 03x03
SG-1 03x04
SG-1 03x05
SG-1 03x06
SG-1 03x07
SG-1 03x08
SG-1 03x09
SG-1 03x10
SG-1 03x11
SG-1 03x12
SG-1 03x13
SG-1 03x14
SG-1 03x15
SG-1 03x16
SG-1 03x17
SG-1 03x18
SG-1 03x19
SG-1 03x20
SG-1 03x21
SG-1 03x22
SG-1 04x01
SG-1 04x02
SG-1 04x03
SG-1 04x04
SG-1 04x05
SG-1 04x06
SG-1 04x07
SG-1 04x08
SG-1 04x09
SG-1 04x10
SG-1 04x11
SG-1 04x12
SG-1 04x13
SG-1 04x14
SG-1 04x15
SG-1 04x16
SG-1 04x17
SG-1 04x18
SG-1 04x19
SG-1 04x20
SG-1 04x21
SG-1 04x22
SG-1 05x01
SG-1 05x02
SG-1 05x03
SG-1 05x04
SG-1 05x05
SG-1 05x06
SG-1 05x07
SG-1 05x08
SG-1 05x09
SG-1 05x10
SG-1 05x11
SG-1 05x12
SG-1 05x13
SG-1 05x14
SG-1 05x15
SG-1 05x16
SG-1 05x17
SG-1 05x18
SG-1 05x19
SG-1 05x20
SG-1 05x21
SG-1 05x22
SG-1 06x01
SG-1 06x02
SG-1 06x03
SG-1 06x04
SG-1 06x05
SG-1 06x06
SG-1 06x07
SG-1 06x08
SG-1 06x09
SG-1 06x10
SG-1 06x11
SG-1 06x12
SG-1 06x13
SG-1 06x14
SG-1 06x15
SG-1 06x16
SG-1 06x17
SG-1 06x18
SG-1 06x19
SG-1 06x20
SG-1 06x21
SG-1 06x22
SG-1 07x01
SG-1 07x02
SG-1 07x03
SG-1 07x04
SG-1 07x05
SG-1 07x06
SG-1 07x07
SG-1 07x08
SG-1 07x09
SG-1 07x10
SG-1 07x11
SG-1 07x12
SG-1 07x13
SG-1 07x14
SG-1 07x15
SG-1 07x16
SG-1 07x17
SG-1 07x18
SG-1 07x19
SG-1 07x20
SG-1 07x21
SG-1 07x22
SG-1 08x01
SG-1 08x02
Atl 01x01
Atl 01x02
Atl 01x01-02
SG-1 08x03
Atl 01x03
SG-1 08x04
Atl 01x04
SG-1 08x05
Atl 01x05
SG-1 08x06
Atl 01x06
SG-1 08x07
Atl 01x07
SG-1 08x08
Atl 01x08
SG-1 08x09
Atl 01x09
SG-1 08x10
Atl 01x10
Atl 01x11
SG-1 08x11
SG-1 08x12
SG-1 08x13
SG-1 08x14
SG-1 08x15
SG-1 08x16
SG-1 08x17
Atl 01x12
SG-1 08x18
SG-1 08x18
Atl 01x13
Atl 01x14
Atl 01x15
Atl 01x16
Atl 01x17
Atl 01x18
SG-1 08x19
SG-1 08x20
Atl 01x19
Atl 01x20
Atl 02x01
SG-1 09x01
SG-1 09x02
SG-1 09x03
SG-1 09x04
Atl 02x02
Atl 02x03
Atl 02x04
SG-1 09x05
Atl 02x05
SG-1 09x06
Atl 02x06
SG-1 09x07
Atl 02x07
Atl 02x08
SG-1 09x08
SG-1 09x09
Atl 02x09
Atl 02x10
Atl 02x11
Atl 02x12
Atl 02x13
Atl 02x14
Atl 02x15
Atl 02x16
SG-1 09x10
SG-1 09x11
Atl 02x17
SG-1 09x12
Atl 02x18
SG-1 09x13
Atl 02x19
SG-1 09x14
Atl 02x20
Atl 03x01
Atl 03x02
SG-1 09x15
SG-1 09x16
SG-1 09x17
SG-1 09x18
SG-1 09x19
SG-1 09x20
SG-1 10x01
SG-1 10x02
SG-1 10x03
Atl 03x03
SG-1 10x04
Atl 03x04
SG-1 10x05
Atl 03x05
Atl 03x06
SG-1 10x06
SG-1 10x07
Atl 03x07
SG-1 10x08
Atl 03x08
SG-1 10x09
Atl 03x09
Atl 03x10
Atl 03x11
Atl 03x12
Atl 03x13
Atl 03x14
Atl 03x15
Atl 03x16
SG-1 10x10
SG-1 10x11
Atl 03x17
SG-1 10x12
Atl 03x18
SG-1 10x13
Atl 03x19
SG-1 10x14
SG-1 10x15
SG-1 10x16
SG-1 10x17
SG-1 10x18
SG-1 10x19
SG-1 10x20
SG-1 11x01
Atl 03x20
Atl 04x01
Atl 04x02
Atl 04x03
Atl 04x04
Atl 04x05
Atl 04x06
Atl 04x07
Atl 04x08
Atl 04x09
Atl 04x10
Atl 04x11
Atl 04x12
Atl 04x13
Atl 04x14
Atl 04x15
Atl 04x16
Atl 04x17
Atl 04x18
Atl 04x19
Atl 04x20
Atl 05x01
SG-1 11x02
Atl 05x02
Atl 05x03
Atl 05x04
Atl 05x05
Atl 05x06
Atl 05x07
Atl 05x08
Atl 05x09
Atl 05x10
Atl 05x11
Atl 05x12
Atl 05x13
Atl 05x14
Atl 05x15
Atl 05x16
Atl 05x17
Atl 05x18
Atl 05x19
Atl 05x20
Atl 05x20
Uni 01x01
Uni 01x02
Uni 01x03
Uni 01x01-03
Uni Kx01
Uni Kx02
Uni Kx03
Uni Kx04
Uni Kx05
Uni Kx06
Uni Kx07
Uni Kx08
Uni Kx09
Uni Kx10
Uni Kx11
Uni Kx12
Uni Kx13
Uni Kx14
Uni Kx15
Uni Kx16
Uni Kx17
Uni Kx18
Uni Kx19
Uni Kx20
Uni Kx21
Uni Kx22
Uni Kx23
Uni Kx24
Uni Kx25
Uni Kx26
Uni Kx27
Uni Kx28
Uni Kx29
Uni Kx30
Uni Kx31
Uni Kx32
Uni Kx33
Uni Kx34
Uni 01x04
Uni 01x05
Uni 01x06
Uni 01x07
Uni 01x08
Uni 01x09
Uni 01x10
Uni 01x11
Uni 01x12
Uni 01x13
Uni 01x14
Uni 01x15
Uni 01x16
Uni 01x17
Uni 01x18
Uni 01x19
Uni 01x20
Uni 02x01
Uni 02x02
Uni 02x03
Uni 02x04
Uni 02x05
Uni 02x06
Uni 02x07
Uni 02x08
Uni 02x09
Uni 02x10
Uni 02x11
Uni 02x12
Uni 02x13
Uni 02x14
Uni 02x15
Uni 02x16
Uni 02x17
Uni 02x18
Uni 02x19
Uni 02x20
'''
import os
from plexapi.myplex import MyPlexAccount
from plexapi.playlist import Playlist
APP_DIR = os.path.dirname(os.path.realpath(__file__)) # rp, realpath
print("""# STARGATE PLAYLIST GENERATOR FOR PLEX
This script will connect to your Plex server through the API, find all Stargate: SG-1, Atlantis and Universe seasons, and generate a new Playlist titled: "Stargate: Canon watch order" where all existing episodes will be placed in a Canon watch order based on this spreadsheet: https://docs.google.com/spreadsheets/u/0/d/1b5T6bk5bS9LDaIVXR55-agOd_FYgTN0TZcpZDfvnMg4/pub?output=html
Any missing episodes will be simply ignored.
After playlist is generated you will be able to manually edit it in Plex as any other playlist.
---
""")
login, password, servername = input("Please, enter login, password, server name - separated by spaces: ").split(" ")
data_order = data.split("\n")
data_dict = {}
print("Connecting to plex...")
account = MyPlexAccount(login, password)
plex = account.resource(servername).connect() # returns a PlexServer instanc
print("Parsing shows...")
for showname, showid in [
['Stargate SG-1', "SG-1"],
['Stargate Atlantis', "Atl"],
['Stargate Universe', "Uni"],
]:
for episode in plex.library.section('TV Shows').get(showname).episodes():
dict_key = '{} {}x{}'.format(showid, str(episode.parentIndex).zfill(2), str(episode.index).zfill(2))
if dict_key in data_dict:
print(f"WARNING! {dict_key} already in dict. Overwritten.")
# print(f"Adding: {dict_key}")
data_dict[dict_key] = episode
playlist_objects = []
print("Creating ordered array...")
for id in data_order:
if id not in data_dict:
if "Uni K" not in id:
print(f"WARNING! Could not find: {id} in data_dict. Missing episode from plex?")
continue
playlist_objects.append(data_dict[id])
print("Creating playlist...")
playlist = Playlist.create(
server=plex,
title="Stargate: Canon watch order",
items=playlist_objects
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment