Skip to content

Instantly share code, notes, and snippets.

@frank1x
Forked from brimur/preCachePlexEpisode.py
Created January 30, 2022 03:42
Show Gist options
  • Save frank1x/fcf47429f66eb238fceca843aba0b5de to your computer and use it in GitHub Desktop.
Save frank1x/fcf47429f66eb238fceca843aba0b5de to your computer and use it in GitHub Desktop.
Python script to cache the next episode of a TV show playing in Plex using rclone
#######################################
# This python script should be run
# as a cron job every 15 minutes to
# cache the next episode of a currently
# playing TV show.
########################################
import requests
import os
import psutil
from plexapi.server import PlexServer, CONFIG
from plexapi.exceptions import NotFound
from plexapi.video import Episode
PLEX_URL = 'http://127.0.0.1:32400'
PLEX_TOKEN = ''
if not PLEX_URL:
PLEX_URL = CONFIG.data['auth'].get('server_baseurl')
if not PLEX_TOKEN:
PLEX_TOKEN = CONFIG.data['auth'].get('server_token') 
plex = PlexServer(PLEX_URL, PLEX_TOKEN)
currentlyPlaying = plex.sessions()
for episode in currentlyPlaying:
if isinstance(episode, Episode):
show = episode.grandparentTitle
seasonNumber = episode.parentIndex
filename = episode.media[0].parts[0].file
episodeNumber = episode.index
episodeSection = episode.librarySectionTitle
print("Show: " + show)
print("Season: " + str(seasonNumber))
print("Ep Num: " + str(episodeNumber))
def nextEpisode(show, seasonNumber, episodeNumber):
episodes = plex.library.section(episodeSection).get(show).episodes()
try:
index = next(i for i, ep in enumerate(episodes) if ep.seasonNumber == seasonNumber and ep.episodeNumber == episodeNumber)
return episodes[index + 1]
except StopIteration:
raise NotFound
except IndexError:
# already last episode
pass
nextEp = nextEpisode(show, int(seasonNumber), int(episodeNumber))
try:
fileToCache = nextEp.media[0].parts[0].file
print("Next ep is " + fileToCache)
startCache = 1
except:
print("No file found to cache. Possibly last available episode?")
startCache = 0
if startCache == 1 and fileToCache:
for proc in psutil.process_iter():
if proc.name() in 'rclone':
if proc.cmdline()[1] in 'md5sum':
if proc.cmdline()[2] in fileToCache:
print("File is already being cached: " + fileToCache)
startCache = 0
if startCache == 1 and fileToCache:
print("Starting cache of " + fileToCache)
bashCommand = 'nohup rclone md5sum "' + fileToCache + '" &'
os.system(bashCommand)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment