136 lines
4.3 KiB
Python
136 lines
4.3 KiB
Python
#!/usr/bin/env python
|
|
"""
|
|
Description: Removes Shows from On Deck
|
|
Author: Blacktwin
|
|
Requires: requests, plexapi
|
|
|
|
Example:
|
|
python off_deck.py --shows "The Simpsons" Seinfeld
|
|
- The Simpsons and Seinfeld will be removed from On Deck
|
|
|
|
python off_deck.py --shows "The Simpsons" Seinfeld --user Steve
|
|
- The Simpsons and Seinfeld will be removed from Steve's On Deck
|
|
|
|
python off_deck.py --playlist "Favorite Shows!"
|
|
- Any Show found in Favorite Shows playlist will be remove
|
|
from On Deck
|
|
|
|
!!!NOTICE!!!
|
|
|
|
* This script should be used for Shows that you have already watched and
|
|
don't want showing up on your On Deck.
|
|
|
|
* For episodes of show already watched the view count will be reset back to it
|
|
original.
|
|
|
|
* For episodes of show not watched the view count will be set to 1.
|
|
|
|
"""
|
|
|
|
import requests
|
|
import argparse
|
|
from plexapi.server import PlexServer, CONFIG
|
|
|
|
PLEX_URL = ''
|
|
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', '')
|
|
|
|
sess = requests.Session()
|
|
# Ignore verifying the SSL certificate
|
|
sess.verify = False # '/path/to/certfile'
|
|
# If verify is set to a path to a directory,
|
|
# the directory must have been processed using the c_rehash utility supplied
|
|
# with OpenSSL.
|
|
if sess.verify is False:
|
|
# Disable the warning that the request is insecure, we know that...
|
|
import urllib3
|
|
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
|
|
|
plex = PlexServer(PLEX_URL, PLEX_TOKEN, session=sess)
|
|
account = plex.myPlexAccount()
|
|
|
|
|
|
def get_on_deck(server, off_deck):
|
|
"""
|
|
|
|
Parameters
|
|
----------
|
|
server : class
|
|
User's server to pull On Deck list
|
|
off_deck : list
|
|
List of Shows to remove from On Deck
|
|
|
|
Returns
|
|
-------
|
|
dict
|
|
Show, episodes, and episodes view count
|
|
|
|
"""
|
|
watched_statuses = {}
|
|
for item in server.library.onDeck():
|
|
if item.type == 'episode' and item.grandparentTitle in off_deck:
|
|
grandparent = server.fetchItem(item.grandparentRatingKey)
|
|
watched_statuses['grandparent'] = grandparent
|
|
watched_statuses['episodes'] = []
|
|
for episode in grandparent.episodes():
|
|
watched_statuses['episodes'].append({'object': episode,
|
|
'viewCount': episode.viewCount})
|
|
return watched_statuses
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
parser = argparse.ArgumentParser(description="Remove items from On Deck.",
|
|
formatter_class=argparse.RawTextHelpFormatter)
|
|
parser.add_argument('--shows', nargs='+',
|
|
help='Shows to be removed from On Deck.')
|
|
parser.add_argument('--user', nargs='?',
|
|
help='User whose On Deck will be modified.')
|
|
parser.add_argument('--playlist', nargs='?',
|
|
help='Shows in playlist to be removed from On Deck')
|
|
|
|
opts = parser.parse_args()
|
|
|
|
ep_list = []
|
|
to_remove = ''
|
|
|
|
if opts.user:
|
|
user_acct = account.user(opts.user)
|
|
plex_server = PlexServer(PLEX_URL, user_acct.get_token(plex.machineIdentifier))
|
|
else:
|
|
plex_server = plex
|
|
|
|
if opts.shows and not opts.playlist:
|
|
to_remove = opts.shows
|
|
elif not opts.shows and opts.playlist:
|
|
to_remove = [x.grandparentTitle for x in plex_server.playlist(opts.playlist).items()]
|
|
|
|
if not to_remove:
|
|
print('Nothing to remove...')
|
|
exit()
|
|
|
|
print('Finding listed shows On Deck...')
|
|
while True:
|
|
off_deck = get_on_deck(plex_server, to_remove)
|
|
if off_deck:
|
|
ep_list += off_deck['episodes']
|
|
print('Marking {} Unwatched'.format(off_deck['grandparent']
|
|
.title.encode('UTF-8')))
|
|
off_deck['grandparent'].markUnwatched()
|
|
else:
|
|
break
|
|
|
|
print('Resetting watch counts...')
|
|
for item in ep_list:
|
|
print('Resetting view count for {}: S{:02}E{:02} {}'.format(
|
|
item['object'].grandparentTitle.encode('UTF-8'),
|
|
int(item['object'].parentIndex), int(item['object'].index),
|
|
item['object'].title.encode('UTF-8')))
|
|
# if viewCount was 0 then make 1 so as not to return to On Deck.
|
|
for _ in range(item['viewCount'] if item['viewCount'] != 0 else 1):
|
|
item['object'].markWatched() |