docstrings

This commit is contained in:
Blacktwin 2018-08-03 17:35:49 -04:00
parent dfb9382546
commit a037db8300

View File

@ -2,11 +2,11 @@
""" """
Description: Comparing content between two or more Plex servers. Description: Comparing content between two or more Plex servers.
Creates .json file in script directory of server compared. Creates .json file in script directory of server compared.
.json file contents include list items by media types (movie, show) .json file contents include:
type combined between server 1 and server 2 items by media types (movie, show)
type missing (_mine) from s2 but found in s1 items found in server 1, server 2, etc
type missing (_missing) from s1 but found in s2 items unique to server 1
type shared (_shared) between s1 and s2 items missing from server 1
Author: Blacktwin Author: Blacktwin
Requires: requests, plexapi Requires: requests, plexapi
@ -58,6 +58,22 @@ server_lst = []
def find_things(server, media_type): def find_things(server, media_type):
"""Get all items based on media type
Parameters
----------
server: Object
plexServerObject
media_type: list
['movie', 'show', ..]
Returns
-------
dictionary
{media_type:[plexObject, ..]}
"""
dict_tt = {name: [] for name in media_type} dict_tt = {name: [] for name in media_type}
print('Finding items from {}.'.format(server.friendlyName)) print('Finding items from {}.'.format(server.friendlyName))
for section in server.library.sections(): for section in server.library.sections():
@ -69,6 +85,22 @@ def find_things(server, media_type):
def get_meta(meta): def get_meta(meta):
"""Get metadata from Plex item.
Parameters
----------
meta: Object
plexObject
Returns
-------
dictionary
{
"genres": [],
"imdb": "tt5158522",
"rating": float,
"server": ["Plex Server Name"],
"title": "Title"
}
"""
meta_dict = {'title': meta.title, meta_dict = {'title': meta.title,
'rating': meta.rating, 'rating': meta.rating,
@ -76,18 +108,50 @@ def get_meta(meta):
'server': [meta._server.friendlyName] 'server': [meta._server.friendlyName]
} }
if meta.guid: if meta.guid:
# guid will return (com.plexapp.agents.imdb://tt4302938?lang=en)
# Agents will differ between servers.
agent = meta.guid agent = meta.guid
source_name = agent.split('://')[0].split('.')[-1] source_name = agent.split('://')[0].split('.')[-1]
source_id = agent.split('://')[1].split('?')[0] source_id = agent.split('://')[1].split('?')[0]
meta_dict[source_name] = source_id meta_dict[source_name] = source_id
if meta.type == 'movie': if meta.type == 'movie':
# For movies with same titles
meta_dict['title'] = u'{} ({})'.format(meta.title, meta.year) meta_dict['title'] = u'{} ({})'.format(meta.title, meta.year)
return meta_dict return meta_dict
def org_diff(lst_dicts, media_type, main_server): def org_diff(media_type, lst_dicts, main_server):
"""Organizing the items from each server
Parameters
----------
media_type: list
['movie', 'show',..]
lst_dicts: list
[{media_type:[plexObject, ..]}, {media_type: [..]}]
main_server: str
'Plex Server Name'
Returns
-------
nested dictionary
media_type: {combined :{
list: [
{
"genres": [],
"imdb": "tt2313197",
"rating": float,
"server": ["Plex Server Name"],
"title": ""
},
],
count: int
},
missing: {..}
unique: {..}
}
"""
diff_dict = {} diff_dict = {}
seen = {} seen = {}
dupes = [] dupes = []
@ -103,17 +167,22 @@ def org_diff(lst_dicts, media_type, main_server):
title = u'{} ({})'.format(item.title, item.year) title = u'{} ({})'.format(item.title, item.year)
else: else:
title = item.title title = item.title
# Look for duplicate titles
if title not in seen: if title not in seen:
seen[title] = 1 seen[title] = 1
meta_lst.append(get_meta(item)) meta_lst.append(get_meta(item))
else: else:
# Duplicate found
if seen[title] >= 1: if seen[title] >= 1:
dupes.append([title,item._server.friendlyName]) dupes.append([title,item._server.friendlyName])
# Go back through list to find original
for meta in meta_lst: for meta in meta_lst:
if meta['title'] == title: if meta['title'] == title:
# Append the duplicate server's name
meta['server'].append(item._server.friendlyName) meta['server'].append(item._server.friendlyName)
seen[title] += 1 seen[title] += 1
# Sort item list by Plex rating
# Duplicates will use originals rating
meta_lst = sorted(meta_lst, key=lambda d: d['rating'], meta_lst = sorted(meta_lst, key=lambda d: d['rating'],
reverse=True) reverse=True)
diff_dict[mtype] = {'combined': {'count': len(meta_lst), diff_dict[mtype] = {'combined': {'count': len(meta_lst),
@ -122,8 +191,10 @@ def org_diff(lst_dicts, media_type, main_server):
print('...finding {}s missing from {}'.format( print('...finding {}s missing from {}'.format(
mtype, main_server)) mtype, main_server))
for item in meta_lst: for item in meta_lst:
# Main Server name is alone in items server list
if main_server not in item['server']: if main_server not in item['server']:
missing.append(item) missing.append(item)
# Main Server name is absent in items server list
elif main_server in item['server'] and len(item['server']) == 1: elif main_server in item['server'] and len(item['server']) == 1:
unique.append(item) unique.append(item)
diff_dict[mtype].update({'missing': {'count': len(missing), diff_dict[mtype].update({'missing': {'count': len(missing),
@ -161,11 +232,13 @@ if __name__ == "__main__":
sys.exit(1) sys.exit(1)
server_compare = SERVER_DICT[opts.server[0]] server_compare = SERVER_DICT[opts.server[0]]
# First server in args is main server.
main_server = server_compare.connect() main_server = server_compare.connect()
print('Connected to {} server.'.format(main_server.friendlyName)) print('Connected to {} server.'.format(main_server.friendlyName))
for server in opts.server[1:]: for server in opts.server[1:]:
other_server = SERVER_DICT[server] other_server = SERVER_DICT[server]
# Attempt to connect to other servers
try: try:
server_connected = other_server.connect() server_connected = other_server.connect()
print('Connected to {} server.'.format( print('Connected to {} server.'.format(