mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-12 08:16:06 -07:00
Initial library_id changes
* Give the library sections their own db table.
This commit is contained in:
parent
1de3c0d559
commit
09aac22909
12 changed files with 420 additions and 204 deletions
|
@ -60,49 +60,41 @@ DOCUMENTATION :: END
|
||||||
% if data:
|
% if data:
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
% if data['media_type'] != 'library':
|
|
||||||
<div class="art-face" style="background-image:url(pms_image_proxy?img=${data['art']}&width=1920&height=1080)"></div>
|
<div class="art-face" style="background-image:url(pms_image_proxy?img=${data['art']}&width=1920&height=1080)"></div>
|
||||||
% endif
|
|
||||||
<div class="summary-container">
|
<div class="summary-container">
|
||||||
<div class="summary-navbar">
|
<div class="summary-navbar">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<div class="summary-navbar-list">
|
<div class="summary-navbar-list">
|
||||||
<ul class="list-unstyled breadcrumb">
|
<ul class="list-unstyled breadcrumb">
|
||||||
% if data['media_type'] == 'library':
|
% if data['media_type'] == 'library':
|
||||||
% if data['library'] == 'movie':
|
<li class="active">${data['title']}</li>
|
||||||
<li class="active">Movies</li>
|
|
||||||
% elif data['library'] == 'show':
|
|
||||||
<li class="active">TV Shows</li>
|
|
||||||
% elif data['library'] == 'artist':
|
|
||||||
<li class="active">Music</li>
|
|
||||||
% endif
|
|
||||||
% elif data['media_type'] == 'movie':
|
% elif data['media_type'] == 'movie':
|
||||||
<li><a href="info?item_id=movie">Movies</a></li>
|
<li><a href="info?library_id=${data['library_id']}">${data['library_title']}</a></li>
|
||||||
<li class="active">${data['title']}</li>
|
<li class="active">${data['title']}</li>
|
||||||
% elif data['media_type'] == 'show':
|
% elif data['media_type'] == 'show':
|
||||||
<li><a href="info?item_id=show">TV Shows</a></li>
|
<li><a href="info?library_id=${data['library_id']}">${data['library_title']}</a></li>
|
||||||
<li class="active">${data['title']}</li>
|
<li class="active">${data['title']}</li>
|
||||||
% elif data['media_type'] == 'season':
|
% elif data['media_type'] == 'season':
|
||||||
<li class="hidden-xs hidden-sm"><a href="info?item_id=show">TV Shows</a></li>
|
<li class="hidden-xs hidden-sm"><a href="info?library_id=${data['library_id']}">${data['library_title']}</a></li>
|
||||||
<li><a href="info?item_id=${data['parent_rating_key']}">${data['parent_title']}</a></li>
|
<li><a href="info?item_id=${data['parent_rating_key']}">${data['parent_title']}</a></li>
|
||||||
<li class="active">Season ${data['index']}</li>
|
<li class="active">Season ${data['media_index']}</li>
|
||||||
% elif data['media_type'] == 'episode':
|
% elif data['media_type'] == 'episode':
|
||||||
<li class="hidden-xs hidden-sm"><a href="info?item_id=show">TV Shows</a></li>
|
<li class="hidden-xs hidden-sm"><a href="info?library_id=${data['library_id']}">${data['library_title']}</a></li>
|
||||||
<li class="hidden-xs hidden-sm"><a href="info?item_id=${data['grandparent_rating_key']}">${data['grandparent_title']}</a></li>
|
<li class="hidden-xs hidden-sm"><a href="info?item_id=${data['grandparent_rating_key']}">${data['grandparent_title']}</a></li>
|
||||||
<li><a href="info?item_id=${data['parent_rating_key']}">Season ${data['parent_index']}</a></li>
|
<li><a href="info?item_id=${data['parent_rating_key']}">Season ${data['parent_media_index']}</a></li>
|
||||||
<li class="active">Episode ${data['index']} - ${data['title']}</li>
|
<li class="active">Episode ${data['media_index']} - ${data['title']}</li>
|
||||||
% elif data['media_type'] == 'artist':
|
% elif data['media_type'] == 'artist':
|
||||||
<li><a href="info?item_id=artist">Music</a></li>
|
<li><a href="info?library_id=${data['library_id']}">${data['library_title']}</a></li>
|
||||||
<li class="active">${data['title']}</li>
|
<li class="active">${data['title']}</li>
|
||||||
% elif data['media_type'] == 'album':
|
% elif data['media_type'] == 'album':
|
||||||
<li class="hidden-xs hidden-sm"><a href="info?item_id=artist">Music</a></li>
|
<li class="hidden-xs hidden-sm"><a href="info?library_id=${data['library_id']}">${data['library_title']}</a></li>
|
||||||
<li><a href="info?item_id=${data['parent_rating_key']}">${data['parent_title']}</a></li>
|
<li><a href="info?item_id=${data['parent_rating_key']}">${data['parent_title']}</a></li>
|
||||||
<li class="active">${data['title']}</li>
|
<li class="active">${data['title']}</li>
|
||||||
% elif data['media_type'] == 'track':
|
% elif data['media_type'] == 'track':
|
||||||
<li class="hidden-xs hidden-sm"><a href="info?item_id=artist">Music</a></li>
|
<li class="hidden-xs hidden-sm"><a href="info?library_id=${data['library_id']}">${data['library_title']}</a></li>
|
||||||
<li class="hidden-xs hidden-sm"><a href="info?item_id=${data['grandparent_rating_key']}">${data['grandparent_title']}</a></li>
|
<li class="hidden-xs hidden-sm"><a href="info?item_id=${data['grandparent_rating_key']}">${data['grandparent_title']}</a></li>
|
||||||
<li><a href="info?item_id=${data['parent_rating_key']}">${data['parent_title']}</a></li>
|
<li><a href="info?item_id=${data['parent_rating_key']}">${data['parent_title']}</a></li>
|
||||||
<li class="active">Track ${data['index']} - ${data['title']}</li>
|
<li class="active">Track ${data['media_index']} - ${data['title']}</li>
|
||||||
% endif
|
% endif
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
@ -143,18 +135,18 @@ DOCUMENTATION :: END
|
||||||
<h1> </h1><h1>${data['title']}</h1>
|
<h1> </h1><h1>${data['title']}</h1>
|
||||||
% elif data['media_type'] == 'season':
|
% elif data['media_type'] == 'season':
|
||||||
<h1> </h1><h1><a href="info?item_id=${data['parent_rating_key']}">${data['parent_title']}</a></h1>
|
<h1> </h1><h1><a href="info?item_id=${data['parent_rating_key']}">${data['parent_title']}</a></h1>
|
||||||
<h3 class="hidden-xs">S${data['index']}</h3>
|
<h3 class="hidden-xs">S${data['media_index']}</h3>
|
||||||
% elif data['media_type'] == 'episode':
|
% elif data['media_type'] == 'episode':
|
||||||
<h1><a href="info?item_id=${data['grandparent_rating_key']}">${data['grandparent_title']}</a></h1>
|
<h1><a href="info?item_id=${data['grandparent_rating_key']}">${data['grandparent_title']}</a></h1>
|
||||||
<h2>${data['title']}</h2>
|
<h2>${data['title']}</h2>
|
||||||
<h3 class="hidden-xs">S${data['parent_index']} · E${data['index']}</h3>
|
<h3 class="hidden-xs">S${data['parent_media_index']} · E${data['media_index']}</h3>
|
||||||
% elif data['media_type'] == 'album':
|
% elif data['media_type'] == 'album':
|
||||||
<h1><a href="info?item_id=${data['parent_rating_key']}">${data['parent_title']}</a></h1>
|
<h1><a href="info?item_id=${data['parent_rating_key']}">${data['parent_title']}</a></h1>
|
||||||
<h2>${data['title']}</h2>
|
<h2>${data['title']}</h2>
|
||||||
% elif data['media_type'] == 'track':
|
% elif data['media_type'] == 'track':
|
||||||
<h1><a href="info?item_id=${data['grandparent_rating_key']}">${data['grandparent_title']}</a></h1>
|
<h1><a href="info?item_id=${data['grandparent_rating_key']}">${data['grandparent_title']}</a></h1>
|
||||||
<h2><a href="info?item_id=${data['parent_rating_key']}">${data['parent_title']}</a> - ${data['title']}</h2>
|
<h2><a href="info?item_id=${data['parent_rating_key']}">${data['parent_title']}</a> - ${data['title']}</h2>
|
||||||
<h3 class="hidden-xs">T${data['index']}</h3>
|
<h3 class="hidden-xs">T${data['media_index']}</h3>
|
||||||
% endif
|
% endif
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -315,6 +307,13 @@ DOCUMENTATION :: END
|
||||||
% endif
|
% endif
|
||||||
% endif
|
% endif
|
||||||
<div class='col-md-12'>
|
<div class='col-md-12'>
|
||||||
|
% if data['media_type'] == 'library' and config['update_library_ids'] == 1:
|
||||||
|
<div id="update_library_ids_mssage" style="text-align: center; margin-top: 20px;">
|
||||||
|
<i class="fa fa-refresh fa-spin"></i> Updating library ids in the database. This could take a few minutes depending on the size of your database.
|
||||||
|
<br />
|
||||||
|
The history table will refresh automatically when the update is complete. Please wait...
|
||||||
|
</div>
|
||||||
|
% endif
|
||||||
<div class='table-card-header'>
|
<div class='table-card-header'>
|
||||||
<div class="header-bar">
|
<div class="header-bar">
|
||||||
<span>Watch History for <strong>${data['title']}</strong></span>
|
<span>Watch History for <strong>${data['title']}</strong></span>
|
||||||
|
@ -417,21 +416,15 @@ DOCUMENTATION :: END
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="summary-content-title-wrapper">
|
|
||||||
<div class="col-md-12">
|
|
||||||
<h4 style="text-align: center; margin-bottom: 20px;">
|
|
||||||
Error retrieving item metadata. This media item is not available in the Plex Media Server library.
|
|
||||||
</h4>
|
|
||||||
% if query:
|
|
||||||
<h4 style="text-align: center; margin-bottom: 20px;">
|
|
||||||
If the item has been moved, please select the correct match below to update the PlexPy database.
|
|
||||||
</h4>
|
|
||||||
% endif
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="summary-content-wrapper">
|
<div class="summary-content-wrapper">
|
||||||
<div class='col-md-12'>
|
<div class='col-md-12'>
|
||||||
|
<div style="text-align: center; margin-top: 20px;">
|
||||||
|
<i class="fa fa-exclamation-triangle"></i> Error retrieving item metadata. This media item is not available in the Plex Media Server library.
|
||||||
|
</div>
|
||||||
% if query:
|
% if query:
|
||||||
|
<div style="text-align: center; margin-top: 20px;">
|
||||||
|
If the item has been moved, please select the correct match below to update the PlexPy database.
|
||||||
|
</div>
|
||||||
<div class='table-card-header'>
|
<div class='table-card-header'>
|
||||||
<div class="header-bar">
|
<div class="header-bar">
|
||||||
<span>Search Results for <strong>${query['query_string']}</strong></span>
|
<span>Search Results for <strong>${query['query_string']}</strong></span>
|
||||||
|
@ -507,10 +500,23 @@ DOCUMENTATION :: END
|
||||||
type: 'post',
|
type: 'post',
|
||||||
data: function ( d ) {
|
data: function ( d ) {
|
||||||
return { 'json_data': JSON.stringify( d ),
|
return { 'json_data': JSON.stringify( d ),
|
||||||
'media_type': "${data['media_type_filter']}" };
|
'library_id': "${data['library_id']}" };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ("${config['update_library_ids']}" == "1") {
|
||||||
|
$.ajax({
|
||||||
|
url: 'update_library_ids',
|
||||||
|
type: 'post',
|
||||||
|
cache: false,
|
||||||
|
async: true,
|
||||||
|
data: { },
|
||||||
|
complete: function (xhr, status) {
|
||||||
|
$('#update_library_ids_mssage').remove();
|
||||||
|
history_table.draw();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
% elif data['media_type'] == 'show' or data['media_type'] == 'artist':
|
% elif data['media_type'] == 'show' or data['media_type'] == 'artist':
|
||||||
<script>
|
<script>
|
||||||
|
|
|
@ -18,7 +18,7 @@ data['children_list'] :: Usable paramaters
|
||||||
|
|
||||||
== Global keys ==
|
== Global keys ==
|
||||||
rating_key Returns the unique identifier for the media item.
|
rating_key Returns the unique identifier for the media item.
|
||||||
index Returns the episode number.
|
media_index Returns the episode number.
|
||||||
title Returns the name of the episode.
|
title Returns the name of the episode.
|
||||||
thumb Returns the location of the item's thumbnail. Use with pms_image_proxy.
|
thumb Returns the location of the item's thumbnail. Use with pms_image_proxy.
|
||||||
parent_thumb Returns the location of the item's parent thumbnail. Use with pms_image_proxy.
|
parent_thumb Returns the location of the item's parent thumbnail. Use with pms_image_proxy.
|
||||||
|
@ -47,7 +47,7 @@ DOCUMENTATION :: END
|
||||||
% endif
|
% endif
|
||||||
<div class="item-children-card-overlay">
|
<div class="item-children-card-overlay">
|
||||||
<div class="item-children-overlay-text">
|
<div class="item-children-overlay-text">
|
||||||
Season ${child['index']}
|
Season ${child['media_index']}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -57,7 +57,7 @@ DOCUMENTATION :: END
|
||||||
<div class="item-children-poster-face episode-poster" style="background-image: url(pms_image_proxy?img=${child['thumb']}&width=300&height=450);">
|
<div class="item-children-poster-face episode-poster" style="background-image: url(pms_image_proxy?img=${child['thumb']}&width=300&height=450);">
|
||||||
<div class="item-children-card-overlay">
|
<div class="item-children-card-overlay">
|
||||||
<div class="item-children-overlay-text">
|
<div class="item-children-overlay-text">
|
||||||
Episode ${child['index']}
|
Episode ${child['media_index']}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -75,7 +75,7 @@ DOCUMENTATION :: END
|
||||||
% elif data['children_type'] == 'track':
|
% elif data['children_type'] == 'track':
|
||||||
% if loop.index % 2 == 0:
|
% if loop.index % 2 == 0:
|
||||||
<div class="item-children-list-item-even">
|
<div class="item-children-list-item-even">
|
||||||
<span class="item-children-list-item-index">${child['index']}</span>
|
<span class="item-children-list-item-index">${child['media_index']}</span>
|
||||||
<span class="item-children-list-item-title">${child['title']}</span>
|
<span class="item-children-list-item-title">${child['title']}</span>
|
||||||
<span class="item-children-list-item-duration" id="item-children-list-item-duration-${loop.index + 1}">
|
<span class="item-children-list-item-duration" id="item-children-list-item-duration-${loop.index + 1}">
|
||||||
<script>$('#item-children-list-item-duration-${loop.index + 1}').text(moment.utc(${child['duration']}).format("m:ss"));</script>
|
<script>$('#item-children-list-item-duration-${loop.index + 1}').text(moment.utc(${child['duration']}).format("m:ss"));</script>
|
||||||
|
@ -83,7 +83,7 @@ DOCUMENTATION :: END
|
||||||
</div>
|
</div>
|
||||||
% else:
|
% else:
|
||||||
<div class="item-children-list-item-odd">
|
<div class="item-children-list-item-odd">
|
||||||
<span class="item-children-list-item-index">${child['index']}</span>
|
<span class="item-children-list-item-index">${child['media_index']}</span>
|
||||||
<span class="item-children-list-item-title">${child['title']}</span>
|
<span class="item-children-list-item-title">${child['title']}</span>
|
||||||
<span class="item-children-list-item-duration" id="item-children-list-item-duration-${loop.index + 1}">
|
<span class="item-children-list-item-duration" id="item-children-list-item-duration-${loop.index + 1}">
|
||||||
<script>$('#item-children-list-item-duration-${loop.index + 1}').text(moment.utc(${child['duration']}).format("m:ss"));</script>
|
<script>$('#item-children-list-item-duration-${loop.index + 1}').text(moment.utc(${child['duration']}).format("m:ss"));</script>
|
||||||
|
|
|
@ -35,8 +35,8 @@ duration Returns the standard runtime of the media.
|
||||||
content_rating Returns the age rating for the media.
|
content_rating Returns the age rating for the media.
|
||||||
summary Returns a brief description of the media plot.
|
summary Returns a brief description of the media plot.
|
||||||
grandparent_title Returns the name of the show, or artist.
|
grandparent_title Returns the name of the show, or artist.
|
||||||
parent_index Returns the index number of the season.
|
parent_media_index Returns the index number of the season.
|
||||||
index Returns the index number of the episode, or track.
|
media_index Returns the index number of the episode, or track.
|
||||||
parent_thumb Returns the location of the item's thumbnail. Use with pms_image_proxy.
|
parent_thumb Returns the location of the item's thumbnail. Use with pms_image_proxy.
|
||||||
writers Returns an array of writers.
|
writers Returns an array of writers.
|
||||||
thumb Returns the location of the item's thumbnail. Use with pms_image_proxy.
|
thumb Returns the location of the item's thumbnail. Use with pms_image_proxy.
|
||||||
|
@ -112,7 +112,7 @@ DOCUMENTATION :: END
|
||||||
</div>
|
</div>
|
||||||
<div class="item-children-instance-text-wrapper season-item">
|
<div class="item-children-instance-text-wrapper season-item">
|
||||||
<h3 title="${child['parent_title']}">${child['parent_title']}</h3>
|
<h3 title="${child['parent_title']}">${child['parent_title']}</h3>
|
||||||
<h3 class="text-muted">S${child['index']}</h3>
|
<h3 class="text-muted">S${child['media_index']}</h3>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
@ -135,7 +135,7 @@ DOCUMENTATION :: END
|
||||||
<div class="item-children-instance-text-wrapper episode-item">
|
<div class="item-children-instance-text-wrapper episode-item">
|
||||||
<h3 title="${child['grandparent_title']}">${child['grandparent_title']}</h3>
|
<h3 title="${child['grandparent_title']}">${child['grandparent_title']}</h3>
|
||||||
<h3 title="${child['title']}">${child['title']}</h3>
|
<h3 title="${child['title']}">${child['title']}</h3>
|
||||||
<h3 class="text-muted">S${child['parent_index']} · E${child['index']}</h3>
|
<h3 class="text-muted">S${child['parent_media_index']} · E${child['media_index']}</h3>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
@ -199,7 +199,7 @@ DOCUMENTATION :: END
|
||||||
<div class="item-children-poster-face album-poster" style="background-image: url(pms_image_proxy?img=${child['parent_thumb']}&width=300&height=300);">
|
<div class="item-children-poster-face album-poster" style="background-image: url(pms_image_proxy?img=${child['parent_thumb']}&width=300&height=300);">
|
||||||
<div class="item-children-card-overlay">
|
<div class="item-children-card-overlay">
|
||||||
<div class="item-children-overlay-text">
|
<div class="item-children-overlay-text">
|
||||||
Track ${child['index']}
|
Track ${child['media_index']}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -39,7 +39,7 @@ DOCUMENTATION :: END
|
||||||
<div class="home-platforms-instance-name">
|
<div class="home-platforms-instance-name">
|
||||||
% if library['type'] != 'photo':
|
% if library['type'] != 'photo':
|
||||||
<h4>
|
<h4>
|
||||||
<a href="info?item_id=${library['type']}" title="${library['rows']['title']}">${library['rows']['title']}</a>
|
<a href="info?library_id=${library['rows']['key']}" title="${library['rows']['title']}">${library['rows']['title']}</a>
|
||||||
</h4>
|
</h4>
|
||||||
% else:
|
% else:
|
||||||
<h4>${library['rows']['title']}</h4>
|
<h4>${library['rows']['title']}</h4>
|
||||||
|
|
|
@ -50,7 +50,7 @@ DOCUMENTATION :: END
|
||||||
% if item['type'] == 'episode':
|
% if item['type'] == 'episode':
|
||||||
<h3 title="${item['grandparent_title']}">${item['grandparent_title']}</h3>
|
<h3 title="${item['grandparent_title']}">${item['grandparent_title']}</h3>
|
||||||
<h3 title="${item['title']}">${item['title']}</h3>
|
<h3 title="${item['title']}">${item['title']}</h3>
|
||||||
<h3 class="text-muted">S${item['parent_index']} · E${item['index']}</h3>
|
<h3 class="text-muted">S${item['parent_media_index']} · E${item['media_index']}</h3>
|
||||||
% elif item['type'] == 'movie':
|
% elif item['type'] == 'movie':
|
||||||
<h3 title="${item['title']}">${item['title']}</h3>
|
<h3 title="${item['title']}">${item['title']}</h3>
|
||||||
<h3 class="text-muted">${item['year']}</h3>
|
<h3 class="text-muted">${item['year']}</h3>
|
||||||
|
|
|
@ -405,11 +405,10 @@ def dbcheck():
|
||||||
'CREATE TABLE IF NOT EXISTS session_history_metadata (id INTEGER PRIMARY KEY, '
|
'CREATE TABLE IF NOT EXISTS session_history_metadata (id INTEGER PRIMARY KEY, '
|
||||||
'rating_key INTEGER, parent_rating_key INTEGER, grandparent_rating_key INTEGER, '
|
'rating_key INTEGER, parent_rating_key INTEGER, grandparent_rating_key INTEGER, '
|
||||||
'title TEXT, parent_title TEXT, grandparent_title TEXT, full_title TEXT, media_index INTEGER, '
|
'title TEXT, parent_title TEXT, grandparent_title TEXT, full_title TEXT, media_index INTEGER, '
|
||||||
'parent_media_index INTEGER, thumb TEXT, parent_thumb TEXT, grandparent_thumb TEXT, art TEXT, media_type TEXT, '
|
'parent_media_index INTEGER, library_id INTEGER, thumb TEXT, parent_thumb TEXT, grandparent_thumb TEXT, '
|
||||||
'year INTEGER, originally_available_at TEXT, added_at INTEGER, updated_at INTEGER, last_viewed_at INTEGER, '
|
'art TEXT, media_type TEXT, year INTEGER, originally_available_at TEXT, added_at INTEGER, updated_at INTEGER, '
|
||||||
'content_rating TEXT, summary TEXT, tagline TEXT, rating TEXT, duration INTEGER DEFAULT 0, guid TEXT, '
|
'last_viewed_at INTEGER, content_rating TEXT, summary TEXT, tagline TEXT, rating TEXT, '
|
||||||
'directors TEXT, writers TEXT, actors TEXT, genres TEXT, studio TEXT)'
|
'duration INTEGER DEFAULT 0, guid TEXT, directors TEXT, writers TEXT, actors TEXT, genres TEXT, studio TEXT)'
|
||||||
''
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# users table :: This table keeps record of the friends list
|
# users table :: This table keeps record of the friends list
|
||||||
|
@ -421,6 +420,20 @@ def dbcheck():
|
||||||
'keep_history INTEGER DEFAULT 1, deleted_user INTEGER DEFAULT 0)'
|
'keep_history INTEGER DEFAULT 1, deleted_user INTEGER DEFAULT 0)'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# notify_log table :: This is a table which logs notifications sent
|
||||||
|
c_db.execute(
|
||||||
|
'CREATE TABLE IF NOT EXISTS notify_log (id INTEGER PRIMARY KEY AUTOINCREMENT, '
|
||||||
|
'session_key INTEGER, rating_key INTEGER, user_id INTEGER, user TEXT, '
|
||||||
|
'agent_id INTEGER, agent_name TEXT, on_play INTEGER, on_stop INTEGER, on_watched INTEGER, '
|
||||||
|
'on_pause INTEGER, on_resume INTEGER, on_buffer INTEGER)'
|
||||||
|
)
|
||||||
|
|
||||||
|
# library_sections table :: This table keeps record of the servers library sections
|
||||||
|
c_db.execute(
|
||||||
|
'CREATE TABLE IF NOT EXISTS library_sections (id INTEGER PRIMARY KEY AUTOINCREMENT, '
|
||||||
|
'section_id INTEGER UNIQUE, section_name TEXT, section_type TEXT)'
|
||||||
|
)
|
||||||
|
|
||||||
# Upgrade sessions table from earlier versions
|
# Upgrade sessions table from earlier versions
|
||||||
try:
|
try:
|
||||||
c_db.execute('SELECT started from sessions')
|
c_db.execute('SELECT started from sessions')
|
||||||
|
@ -547,6 +560,50 @@ def dbcheck():
|
||||||
'ALTER TABLE sessions ADD COLUMN transcode_height INTEGER'
|
'ALTER TABLE sessions ADD COLUMN transcode_height INTEGER'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Upgrade sessions table from earlier versions
|
||||||
|
try:
|
||||||
|
c_db.execute('SELECT buffer_count from sessions')
|
||||||
|
except sqlite3.OperationalError:
|
||||||
|
logger.debug(u"Altering database. Updating database table sessions.")
|
||||||
|
c_db.execute(
|
||||||
|
'ALTER TABLE sessions ADD COLUMN buffer_count INTEGER DEFAULT 0'
|
||||||
|
)
|
||||||
|
c_db.execute(
|
||||||
|
'ALTER TABLE sessions ADD COLUMN buffer_last_triggered INTEGER'
|
||||||
|
)
|
||||||
|
|
||||||
|
# Upgrade sessions table from earlier versions
|
||||||
|
try:
|
||||||
|
c_db.execute('SELECT last_paused from sessions')
|
||||||
|
except sqlite3.OperationalError:
|
||||||
|
logger.debug(u"Altering database. Updating database table sessions.")
|
||||||
|
c_db.execute(
|
||||||
|
'ALTER TABLE sessions ADD COLUMN last_paused INTEGER'
|
||||||
|
)
|
||||||
|
|
||||||
|
# Upgrade session_history table from earlier versions
|
||||||
|
try:
|
||||||
|
c_db.execute('SELECT reference_id from session_history')
|
||||||
|
except sqlite3.OperationalError:
|
||||||
|
logger.debug(u"Altering database. Updating database table session_history.")
|
||||||
|
c_db.execute(
|
||||||
|
'ALTER TABLE session_history ADD COLUMN reference_id INTEGER DEFAULT 0'
|
||||||
|
)
|
||||||
|
# Set reference_id to the first row where (user_id = previous row, rating_key != previous row) and user_id = user_id
|
||||||
|
c_db.execute(
|
||||||
|
'UPDATE session_history ' \
|
||||||
|
'SET reference_id = (SELECT (CASE \
|
||||||
|
WHEN (SELECT MIN(id) FROM session_history WHERE id > ( \
|
||||||
|
SELECT MAX(id) FROM session_history \
|
||||||
|
WHERE (user_id = t1.user_id AND rating_key <> t1.rating_key AND id < t1.id)) AND user_id = t1.user_id) IS NULL \
|
||||||
|
THEN (SELECT MIN(id) FROM session_history WHERE (user_id = t1.user_id)) \
|
||||||
|
ELSE (SELECT MIN(id) FROM session_history WHERE id > ( \
|
||||||
|
SELECT MAX(id) FROM session_history \
|
||||||
|
WHERE (user_id = t1.user_id AND rating_key <> t1.rating_key AND id < t1.id)) AND user_id = t1.user_id) END) ' \
|
||||||
|
'FROM session_history AS t1 ' \
|
||||||
|
'WHERE t1.id = session_history.id) '
|
||||||
|
)
|
||||||
|
|
||||||
# Upgrade session_history_metadata table from earlier versions
|
# Upgrade session_history_metadata table from earlier versions
|
||||||
try:
|
try:
|
||||||
c_db.execute('SELECT full_title from session_history_metadata')
|
c_db.execute('SELECT full_title from session_history_metadata')
|
||||||
|
@ -565,13 +622,14 @@ def dbcheck():
|
||||||
'ALTER TABLE session_history_metadata ADD COLUMN tagline TEXT'
|
'ALTER TABLE session_history_metadata ADD COLUMN tagline TEXT'
|
||||||
)
|
)
|
||||||
|
|
||||||
# notify_log table :: This is a table which logs notifications sent
|
# Upgrade session_history_metadata table from earlier versions
|
||||||
c_db.execute(
|
try:
|
||||||
'CREATE TABLE IF NOT EXISTS notify_log (id INTEGER PRIMARY KEY AUTOINCREMENT, '
|
c_db.execute('SELECT library_id from session_history_metadata')
|
||||||
'session_key INTEGER, rating_key INTEGER, user_id INTEGER, user TEXT, '
|
except sqlite3.OperationalError:
|
||||||
'agent_id INTEGER, agent_name TEXT, on_play INTEGER, on_stop INTEGER, on_watched INTEGER, '
|
logger.debug(u"Altering database. Updating database table session_history_metadata.")
|
||||||
'on_pause INTEGER, on_resume INTEGER, on_buffer INTEGER, on_created INTEGER)'
|
c_db.execute(
|
||||||
)
|
'ALTER TABLE session_history_metadata ADD COLUMN library_id INTEGER'
|
||||||
|
)
|
||||||
|
|
||||||
# Upgrade users table from earlier versions
|
# Upgrade users table from earlier versions
|
||||||
try:
|
try:
|
||||||
|
@ -591,6 +649,24 @@ def dbcheck():
|
||||||
'ALTER TABLE users ADD COLUMN keep_history INTEGER DEFAULT 1'
|
'ALTER TABLE users ADD COLUMN keep_history INTEGER DEFAULT 1'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Upgrade users table from earlier versions
|
||||||
|
try:
|
||||||
|
c_db.execute('SELECT custom_avatar_url from users')
|
||||||
|
except sqlite3.OperationalError:
|
||||||
|
logger.debug(u"Altering database. Updating database table users.")
|
||||||
|
c_db.execute(
|
||||||
|
'ALTER TABLE users ADD COLUMN custom_avatar_url TEXT'
|
||||||
|
)
|
||||||
|
|
||||||
|
# Upgrade users table from earlier versions
|
||||||
|
try:
|
||||||
|
c_db.execute('SELECT deleted_user from users')
|
||||||
|
except sqlite3.OperationalError:
|
||||||
|
logger.debug(u"Altering database. Updating database table users.")
|
||||||
|
c_db.execute(
|
||||||
|
'ALTER TABLE users ADD COLUMN deleted_user INTEGER DEFAULT 0'
|
||||||
|
)
|
||||||
|
|
||||||
# Upgrade notify_log table from earlier versions
|
# Upgrade notify_log table from earlier versions
|
||||||
try:
|
try:
|
||||||
c_db.execute('SELECT on_pause from notify_log')
|
c_db.execute('SELECT on_pause from notify_log')
|
||||||
|
@ -615,74 +691,12 @@ def dbcheck():
|
||||||
'ALTER TABLE notify_log ADD COLUMN on_created INTEGER'
|
'ALTER TABLE notify_log ADD COLUMN on_created INTEGER'
|
||||||
)
|
)
|
||||||
|
|
||||||
# Upgrade sessions table from earlier versions
|
|
||||||
try:
|
|
||||||
c_db.execute('SELECT buffer_count from sessions')
|
|
||||||
except sqlite3.OperationalError:
|
|
||||||
logger.debug(u"Altering database. Updating database table sessions.")
|
|
||||||
c_db.execute(
|
|
||||||
'ALTER TABLE sessions ADD COLUMN buffer_count INTEGER DEFAULT 0'
|
|
||||||
)
|
|
||||||
c_db.execute(
|
|
||||||
'ALTER TABLE sessions ADD COLUMN buffer_last_triggered INTEGER'
|
|
||||||
)
|
|
||||||
|
|
||||||
# Upgrade users table from earlier versions
|
|
||||||
try:
|
|
||||||
c_db.execute('SELECT custom_avatar_url from users')
|
|
||||||
except sqlite3.OperationalError:
|
|
||||||
logger.debug(u"Altering database. Updating database table users.")
|
|
||||||
c_db.execute(
|
|
||||||
'ALTER TABLE users ADD COLUMN custom_avatar_url TEXT'
|
|
||||||
)
|
|
||||||
|
|
||||||
# Upgrade sessions table from earlier versions
|
|
||||||
try:
|
|
||||||
c_db.execute('SELECT last_paused from sessions')
|
|
||||||
except sqlite3.OperationalError:
|
|
||||||
logger.debug(u"Altering database. Updating database table sessions.")
|
|
||||||
c_db.execute(
|
|
||||||
'ALTER TABLE sessions ADD COLUMN last_paused INTEGER'
|
|
||||||
)
|
|
||||||
|
|
||||||
# Add "Local" user to database as default unauthenticated user.
|
# Add "Local" user to database as default unauthenticated user.
|
||||||
result = c_db.execute('SELECT id FROM users WHERE username = "Local"')
|
result = c_db.execute('SELECT id FROM users WHERE username = "Local"')
|
||||||
if not result.fetchone():
|
if not result.fetchone():
|
||||||
logger.debug(u'User "Local" does not exist. Adding user.')
|
logger.debug(u'User "Local" does not exist. Adding user.')
|
||||||
c_db.execute('INSERT INTO users (user_id, username) VALUES (0, "Local")')
|
c_db.execute('INSERT INTO users (user_id, username) VALUES (0, "Local")')
|
||||||
|
|
||||||
# Upgrade session_history table from earlier versions
|
|
||||||
try:
|
|
||||||
c_db.execute('SELECT reference_id from session_history')
|
|
||||||
except sqlite3.OperationalError:
|
|
||||||
logger.debug(u"Altering database. Updating database table session_history.")
|
|
||||||
c_db.execute(
|
|
||||||
'ALTER TABLE session_history ADD COLUMN reference_id INTEGER DEFAULT 0'
|
|
||||||
)
|
|
||||||
# Set reference_id to the first row where (user_id = previous row, rating_key != previous row) and user_id = user_id
|
|
||||||
c_db.execute(
|
|
||||||
'UPDATE session_history ' \
|
|
||||||
'SET reference_id = (SELECT (CASE \
|
|
||||||
WHEN (SELECT MIN(id) FROM session_history WHERE id > ( \
|
|
||||||
SELECT MAX(id) FROM session_history \
|
|
||||||
WHERE (user_id = t1.user_id AND rating_key <> t1.rating_key AND id < t1.id)) AND user_id = t1.user_id) IS NULL \
|
|
||||||
THEN (SELECT MIN(id) FROM session_history WHERE (user_id = t1.user_id)) \
|
|
||||||
ELSE (SELECT MIN(id) FROM session_history WHERE id > ( \
|
|
||||||
SELECT MAX(id) FROM session_history \
|
|
||||||
WHERE (user_id = t1.user_id AND rating_key <> t1.rating_key AND id < t1.id)) AND user_id = t1.user_id) END) ' \
|
|
||||||
'FROM session_history AS t1 ' \
|
|
||||||
'WHERE t1.id = session_history.id) '
|
|
||||||
)
|
|
||||||
|
|
||||||
# Upgrade users table from earlier versions
|
|
||||||
try:
|
|
||||||
c_db.execute('SELECT deleted_user from users')
|
|
||||||
except sqlite3.OperationalError:
|
|
||||||
logger.debug(u"Altering database. Updating database table users.")
|
|
||||||
c_db.execute(
|
|
||||||
'ALTER TABLE users ADD COLUMN deleted_user INTEGER DEFAULT 0'
|
|
||||||
)
|
|
||||||
|
|
||||||
conn_db.commit()
|
conn_db.commit()
|
||||||
c_db.close()
|
c_db.close()
|
||||||
|
|
||||||
|
|
|
@ -250,19 +250,20 @@ class ActivityProcessor(object):
|
||||||
# logger.debug(u"PlexPy ActivityProcessor :: Attempting to write to session_history_metadata table...")
|
# logger.debug(u"PlexPy ActivityProcessor :: Attempting to write to session_history_metadata table...")
|
||||||
query = 'INSERT INTO session_history_metadata (id, rating_key, parent_rating_key, ' \
|
query = 'INSERT INTO session_history_metadata (id, rating_key, parent_rating_key, ' \
|
||||||
'grandparent_rating_key, title, parent_title, grandparent_title, full_title, media_index, ' \
|
'grandparent_rating_key, title, parent_title, grandparent_title, full_title, media_index, ' \
|
||||||
'parent_media_index, thumb, parent_thumb, grandparent_thumb, art, media_type, year, ' \
|
'parent_media_index, library_id, thumb, parent_thumb, grandparent_thumb, art, media_type, ' \
|
||||||
'originally_available_at, added_at, updated_at, last_viewed_at, content_rating, summary, ' \
|
'year, originally_available_at, added_at, updated_at, last_viewed_at, content_rating, ' \
|
||||||
'tagline, rating, duration, guid, directors, writers, actors, genres, studio) VALUES ' \
|
'summary, tagline, rating, duration, guid, directors, writers, actors, genres, studio) VALUES ' \
|
||||||
'(last_insert_rowid(), ' \
|
'(last_insert_rowid(), ' \
|
||||||
'?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
|
'?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
|
||||||
|
|
||||||
args = [session['rating_key'], session['parent_rating_key'], session['grandparent_rating_key'],
|
args = [session['rating_key'], session['parent_rating_key'], session['grandparent_rating_key'],
|
||||||
session['title'], session['parent_title'], session['grandparent_title'], full_title,
|
session['title'], session['parent_title'], session['grandparent_title'], full_title,
|
||||||
metadata['index'], metadata['parent_index'], metadata['thumb'], metadata['parent_thumb'],
|
metadata['media_index'], metadata['parent_media_index'], metadata['library_id'], metadata['thumb'],
|
||||||
metadata['grandparent_thumb'], metadata['art'], session['media_type'], metadata['year'],
|
metadata['parent_thumb'], metadata['grandparent_thumb'], metadata['art'], session['media_type'],
|
||||||
metadata['originally_available_at'], metadata['added_at'], metadata['updated_at'],
|
metadata['year'], metadata['originally_available_at'], metadata['added_at'], metadata['updated_at'],
|
||||||
metadata['last_viewed_at'], metadata['content_rating'], metadata['summary'], metadata['tagline'],
|
metadata['last_viewed_at'], metadata['content_rating'], metadata['summary'], metadata['tagline'],
|
||||||
metadata['rating'], metadata['duration'], metadata['guid'], directors, writers, actors, genres, metadata['studio']]
|
metadata['rating'], metadata['duration'], metadata['guid'], directors, writers, actors, genres,
|
||||||
|
metadata['studio']]
|
||||||
|
|
||||||
# logger.debug(u"PlexPy ActivityProcessor :: Writing session_history_metadata transaction...")
|
# logger.debug(u"PlexPy ActivityProcessor :: Writing session_history_metadata transaction...")
|
||||||
self.db.action(query=query, args=args)
|
self.db.action(query=query, args=args)
|
||||||
|
|
|
@ -370,6 +370,7 @@ _CONFIG_DEFINITIONS = {
|
||||||
'TWITTER_ON_EXTUP': (int, 'Twitter', 0),
|
'TWITTER_ON_EXTUP': (int, 'Twitter', 0),
|
||||||
'TWITTER_ON_INTUP': (int, 'Twitter', 0),
|
'TWITTER_ON_INTUP': (int, 'Twitter', 0),
|
||||||
'UPDATE_DB_INTERVAL': (int, 'General', 24),
|
'UPDATE_DB_INTERVAL': (int, 'General', 24),
|
||||||
|
'UPDATE_LIBRARY_IDS': (int, 'General', 1),
|
||||||
'VERIFY_SSL_CERT': (bool_int, 'Advanced', 1),
|
'VERIFY_SSL_CERT': (bool_int, 'Advanced', 1),
|
||||||
'VIDEO_LOGGING_ENABLE': (int, 'Monitoring', 1),
|
'VIDEO_LOGGING_ENABLE': (int, 'Monitoring', 1),
|
||||||
'XBMC_ENABLED': (int, 'XBMC', 0),
|
'XBMC_ENABLED': (int, 'XBMC', 0),
|
||||||
|
|
|
@ -755,8 +755,8 @@ class DataFactory(object):
|
||||||
'parent_title': row['parent_title'],
|
'parent_title': row['parent_title'],
|
||||||
'grandparent_title': row['grandparent_title'],
|
'grandparent_title': row['grandparent_title'],
|
||||||
'thumb': thumb,
|
'thumb': thumb,
|
||||||
'index': row['media_index'],
|
'media_index': row['media_index'],
|
||||||
'parent_index': row['parent_media_index'],
|
'parent_media_index': row['parent_media_index'],
|
||||||
'year': row['year'],
|
'year': row['year'],
|
||||||
'time': row['started'],
|
'time': row['started'],
|
||||||
'user': row['user']
|
'user': row['user']
|
||||||
|
@ -769,12 +769,23 @@ class DataFactory(object):
|
||||||
monitor_db = database.MonitorDatabase()
|
monitor_db = database.MonitorDatabase()
|
||||||
|
|
||||||
if row_id:
|
if row_id:
|
||||||
query = 'SELECT rating_key, parent_rating_key, grandparent_rating_key, title, parent_title, grandparent_title, ' \
|
query = 'SELECT session_history_metadata.rating_key, session_history_metadata.parent_rating_key, ' \
|
||||||
'full_title, media_index, parent_media_index, thumb, parent_thumb, grandparent_thumb, art, media_type, ' \
|
'session_history_metadata.grandparent_rating_key, session_history_metadata.title, ' \
|
||||||
'year, originally_available_at, added_at, updated_at, last_viewed_at, content_rating, summary, tagline, ' \
|
'session_history_metadata.parent_title, session_history_metadata.grandparent_title, ' \
|
||||||
'rating, duration, guid, directors, writers, actors, genres, studio ' \
|
'session_history_metadata.full_title, library_sections.section_name, ' \
|
||||||
|
'session_history_metadata.media_index, session_history_metadata.parent_media_index, ' \
|
||||||
|
'session_history_metadata.library_id, session_history_metadata.thumb, ' \
|
||||||
|
'session_history_metadata.parent_thumb, session_history_metadata.grandparent_thumb, ' \
|
||||||
|
'session_history_metadata.art, session_history_metadata.media_type, session_history_metadata.year, ' \
|
||||||
|
'session_history_metadata.originally_available_at, session_history_metadata.added_at, ' \
|
||||||
|
'session_history_metadata.updated_at, session_history_metadata.last_viewed_at, ' \
|
||||||
|
'session_history_metadata.content_rating, session_history_metadata.summary, ' \
|
||||||
|
'session_history_metadata.tagline, session_history_metadata.rating, session_history_metadata.duration, ' \
|
||||||
|
'session_history_metadata.guid, session_history_metadata.directors, session_history_metadata.writers, ' \
|
||||||
|
'session_history_metadata.actors, session_history_metadata.genres, session_history_metadata.studio ' \
|
||||||
'FROM session_history_metadata ' \
|
'FROM session_history_metadata ' \
|
||||||
'WHERE id = ?'
|
'JOIN library_sections ON session_history_metadata.library_id = library_sections.section_id ' \
|
||||||
|
'WHERE session_history_metadata.id = ?'
|
||||||
result = monitor_db.select(query=query, args=[row_id])
|
result = monitor_db.select(query=query, args=[row_id])
|
||||||
else:
|
else:
|
||||||
result = []
|
result = []
|
||||||
|
@ -791,9 +802,9 @@ class DataFactory(object):
|
||||||
'parent_rating_key': item['parent_rating_key'],
|
'parent_rating_key': item['parent_rating_key'],
|
||||||
'grandparent_rating_key': item['grandparent_rating_key'],
|
'grandparent_rating_key': item['grandparent_rating_key'],
|
||||||
'grandparent_title': item['grandparent_title'],
|
'grandparent_title': item['grandparent_title'],
|
||||||
'parent_index': item['parent_media_index'],
|
'parent_media_index': item['parent_media_index'],
|
||||||
'parent_title': item['parent_title'],
|
'parent_title': item['parent_title'],
|
||||||
'index': item['media_index'],
|
'media_index': item['media_index'],
|
||||||
'studio': item['studio'],
|
'studio': item['studio'],
|
||||||
'title': item['title'],
|
'title': item['title'],
|
||||||
'content_rating': item['content_rating'],
|
'content_rating': item['content_rating'],
|
||||||
|
@ -814,7 +825,9 @@ class DataFactory(object):
|
||||||
'writers': writers,
|
'writers': writers,
|
||||||
'directors': directors,
|
'directors': directors,
|
||||||
'genres': genres,
|
'genres': genres,
|
||||||
'actors': actors
|
'actors': actors,
|
||||||
|
'library_title': item['section_name'],
|
||||||
|
'library_id': item['library_id']
|
||||||
}
|
}
|
||||||
|
|
||||||
return metadata
|
return metadata
|
||||||
|
@ -1051,6 +1064,10 @@ class DataFactory(object):
|
||||||
if mapping:
|
if mapping:
|
||||||
logger.info(u"PlexPy DataFactory :: Updating rating keys in the database.")
|
logger.info(u"PlexPy DataFactory :: Updating rating keys in the database.")
|
||||||
for old_key, new_key in mapping.iteritems():
|
for old_key, new_key in mapping.iteritems():
|
||||||
|
# check library_id (1 table)
|
||||||
|
monitor_db.action('UPDATE session_history_metadata SET library_id = ? WHERE rating_key = ?',
|
||||||
|
[new_key_list['library_id'], old_key])
|
||||||
|
|
||||||
# check rating_key (3 tables)
|
# check rating_key (3 tables)
|
||||||
monitor_db.action('UPDATE session_history SET rating_key = ? WHERE rating_key = ?',
|
monitor_db.action('UPDATE session_history SET rating_key = ? WHERE rating_key = ?',
|
||||||
[new_key, old_key])
|
[new_key, old_key])
|
||||||
|
@ -1135,3 +1152,54 @@ class DataFactory(object):
|
||||||
total_duration = item['total_duration']
|
total_duration = item['total_duration']
|
||||||
|
|
||||||
return total_duration
|
return total_duration
|
||||||
|
|
||||||
|
def update_library_ids(self):
|
||||||
|
from plexpy import pmsconnect
|
||||||
|
|
||||||
|
pms_connect = pmsconnect.PmsConnect()
|
||||||
|
monitor_db = database.MonitorDatabase()
|
||||||
|
|
||||||
|
try:
|
||||||
|
query = 'SELECT id, rating_key FROM session_history_metadata WHERE library_id IS NULL'
|
||||||
|
result = monitor_db.select(query=query)
|
||||||
|
except:
|
||||||
|
logger.warn("Unable to execute database query for update_library_id.")
|
||||||
|
return None
|
||||||
|
|
||||||
|
for item in result:
|
||||||
|
id = item[0]
|
||||||
|
rating_key = item[1]
|
||||||
|
|
||||||
|
result = pms_connect.get_metadata_details(rating_key=rating_key)
|
||||||
|
|
||||||
|
if result:
|
||||||
|
metadata = result['metadata']
|
||||||
|
|
||||||
|
section_keys = {'id': id}
|
||||||
|
section_values = {'library_id': metadata['library_id']}
|
||||||
|
|
||||||
|
monitor_db.upsert('session_history_metadata', key_dict=section_keys, value_dict=section_values)
|
||||||
|
else:
|
||||||
|
continue
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def update_library_sections(self):
|
||||||
|
from plexpy import pmsconnect
|
||||||
|
|
||||||
|
pms_connect = pmsconnect.PmsConnect()
|
||||||
|
library_sections = pms_connect.get_server_children()
|
||||||
|
|
||||||
|
if library_sections:
|
||||||
|
if library_sections['libraries_count'] != '0':
|
||||||
|
monitor_db = database.MonitorDatabase()
|
||||||
|
|
||||||
|
for section in library_sections['libraries_list']:
|
||||||
|
section_keys = {'section_id': section['key']}
|
||||||
|
section_values = {'section_id': section['key'],
|
||||||
|
'section_name': section['title'],
|
||||||
|
'section_type': section['type']}
|
||||||
|
|
||||||
|
monitor_db.upsert('library_sections', key_dict=section_keys, value_dict=section_values)
|
||||||
|
|
||||||
|
return True
|
|
@ -41,6 +41,7 @@ def extract_plexwatch_xml(xml=None):
|
||||||
grandparent_thumb = helpers.get_xml_attr(a, 'grandparentThumb')
|
grandparent_thumb = helpers.get_xml_attr(a, 'grandparentThumb')
|
||||||
grandparent_title = helpers.get_xml_attr(a, 'grandparentTitle')
|
grandparent_title = helpers.get_xml_attr(a, 'grandparentTitle')
|
||||||
guid = helpers.get_xml_attr(a, 'guid')
|
guid = helpers.get_xml_attr(a, 'guid')
|
||||||
|
library_id = helpers.get_xml_attr(a, 'librarySectionID')
|
||||||
media_index = helpers.get_xml_attr(a, 'index')
|
media_index = helpers.get_xml_attr(a, 'index')
|
||||||
originally_available_at = helpers.get_xml_attr(a, 'originallyAvailableAt')
|
originally_available_at = helpers.get_xml_attr(a, 'originallyAvailableAt')
|
||||||
last_viewed_at = helpers.get_xml_attr(a, 'lastViewedAt')
|
last_viewed_at = helpers.get_xml_attr(a, 'lastViewedAt')
|
||||||
|
@ -156,6 +157,7 @@ def extract_plexwatch_xml(xml=None):
|
||||||
'title': title,
|
'title': title,
|
||||||
'tagline': tagline,
|
'tagline': tagline,
|
||||||
'guid': guid,
|
'guid': guid,
|
||||||
|
'library_id': library_id,
|
||||||
'media_index': media_index,
|
'media_index': media_index,
|
||||||
'originally_available_at': originally_available_at,
|
'originally_available_at': originally_available_at,
|
||||||
'last_viewed_at': last_viewed_at,
|
'last_viewed_at': last_viewed_at,
|
||||||
|
@ -352,8 +354,8 @@ def import_from_plexwatch(database=None, table_name=None, import_ignore_interval
|
||||||
'title': row['title'],
|
'title': row['title'],
|
||||||
'parent_title': extracted_xml['parent_title'],
|
'parent_title': extracted_xml['parent_title'],
|
||||||
'grandparent_title': row['grandparent_title'],
|
'grandparent_title': row['grandparent_title'],
|
||||||
'index': extracted_xml['media_index'],
|
'media_index': extracted_xml['media_index'],
|
||||||
'parent_index': extracted_xml['parent_media_index'],
|
'parent_media_index': extracted_xml['parent_media_index'],
|
||||||
'thumb': extracted_xml['thumb'],
|
'thumb': extracted_xml['thumb'],
|
||||||
'parent_thumb': extracted_xml['parent_thumb'],
|
'parent_thumb': extracted_xml['parent_thumb'],
|
||||||
'grandparent_thumb': extracted_xml['grandparent_thumb'],
|
'grandparent_thumb': extracted_xml['grandparent_thumb'],
|
||||||
|
@ -370,6 +372,7 @@ def import_from_plexwatch(database=None, table_name=None, import_ignore_interval
|
||||||
'rating': extracted_xml['rating'],
|
'rating': extracted_xml['rating'],
|
||||||
'duration': extracted_xml['duration'],
|
'duration': extracted_xml['duration'],
|
||||||
'guid': extracted_xml['guid'],
|
'guid': extracted_xml['guid'],
|
||||||
|
'library_id': extracted_xml['library_id'],
|
||||||
'directors': extracted_xml['directors'],
|
'directors': extracted_xml['directors'],
|
||||||
'writers': extracted_xml['writers'],
|
'writers': extracted_xml['writers'],
|
||||||
'actors': extracted_xml['actors'],
|
'actors': extracted_xml['actors'],
|
||||||
|
@ -409,4 +412,3 @@ def import_users():
|
||||||
logger.debug(u"PlexPy Importer :: Users imported.")
|
logger.debug(u"PlexPy Importer :: Users imported.")
|
||||||
except:
|
except:
|
||||||
logger.debug(u"PlexPy Importer :: Failed to import users.")
|
logger.debug(u"PlexPy Importer :: Failed to import users.")
|
||||||
|
|
||||||
|
|
|
@ -398,6 +398,10 @@ class PmsConnect(object):
|
||||||
metadata_type = helpers.get_xml_attr(metadata_main, 'type')
|
metadata_type = helpers.get_xml_attr(metadata_main, 'type')
|
||||||
else:
|
else:
|
||||||
logger.debug(u"Metadata failed")
|
logger.debug(u"Metadata failed")
|
||||||
|
return None
|
||||||
|
|
||||||
|
library_id = helpers.get_xml_attr(a, 'librarySectionID')
|
||||||
|
library_title = helpers.get_xml_attr(a, 'librarySectionTitle')
|
||||||
|
|
||||||
genres = []
|
genres = []
|
||||||
actors = []
|
actors = []
|
||||||
|
@ -420,13 +424,48 @@ class PmsConnect(object):
|
||||||
for director in metadata_main.getElementsByTagName('Director'):
|
for director in metadata_main.getElementsByTagName('Director'):
|
||||||
directors.append(helpers.get_xml_attr(director, 'tag'))
|
directors.append(helpers.get_xml_attr(director, 'tag'))
|
||||||
|
|
||||||
if metadata_type == 'show':
|
if metadata_type == 'movie':
|
||||||
metadata = {'media_type': metadata_type,
|
metadata = {'media_type': metadata_type,
|
||||||
|
'library_id': library_id,
|
||||||
|
'library_title': library_title,
|
||||||
'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
|
'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
|
||||||
'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
|
'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
|
||||||
'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
|
'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
|
||||||
'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
|
'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
|
||||||
'index': helpers.get_xml_attr(metadata_main, 'index'),
|
'media_index': helpers.get_xml_attr(metadata_main, 'index'),
|
||||||
|
'studio': helpers.get_xml_attr(metadata_main, 'studio'),
|
||||||
|
'title': helpers.get_xml_attr(metadata_main, 'title'),
|
||||||
|
'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
|
||||||
|
'summary': helpers.get_xml_attr(metadata_main, 'summary'),
|
||||||
|
'tagline': helpers.get_xml_attr(metadata_main, 'tagline'),
|
||||||
|
'rating': helpers.get_xml_attr(metadata_main, 'rating'),
|
||||||
|
'duration': helpers.get_xml_attr(metadata_main, 'duration'),
|
||||||
|
'year': helpers.get_xml_attr(metadata_main, 'year'),
|
||||||
|
'thumb': helpers.get_xml_attr(metadata_main, 'thumb'),
|
||||||
|
'parent_thumb': helpers.get_xml_attr(metadata_main, 'parentThumb'),
|
||||||
|
'grandparent_thumb': helpers.get_xml_attr(metadata_main, 'grandparentThumb'),
|
||||||
|
'art': helpers.get_xml_attr(metadata_main, 'art'),
|
||||||
|
'originally_available_at': helpers.get_xml_attr(metadata_main, 'originallyAvailableAt'),
|
||||||
|
'added_at': helpers.get_xml_attr(metadata_main, 'addedAt'),
|
||||||
|
'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
|
||||||
|
'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
|
||||||
|
'guid': helpers.get_xml_attr(metadata_main, 'guid'),
|
||||||
|
'genres': genres,
|
||||||
|
'actors': actors,
|
||||||
|
'writers': writers,
|
||||||
|
'directors': directors
|
||||||
|
}
|
||||||
|
metadata_list = {'metadata': metadata}
|
||||||
|
|
||||||
|
elif metadata_type == 'show':
|
||||||
|
metadata = {'media_type': metadata_type,
|
||||||
|
'library_id': library_id,
|
||||||
|
'library_title': library_title,
|
||||||
|
'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
|
||||||
|
'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
|
||||||
|
'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
|
||||||
|
'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
|
||||||
|
'media_index': helpers.get_xml_attr(metadata_main, 'index'),
|
||||||
'studio': helpers.get_xml_attr(metadata_main, 'studio'),
|
'studio': helpers.get_xml_attr(metadata_main, 'studio'),
|
||||||
'title': helpers.get_xml_attr(metadata_main, 'title'),
|
'title': helpers.get_xml_attr(metadata_main, 'title'),
|
||||||
'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
|
'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
|
||||||
|
@ -450,16 +489,19 @@ class PmsConnect(object):
|
||||||
'actors': actors
|
'actors': actors
|
||||||
}
|
}
|
||||||
metadata_list = {'metadata': metadata}
|
metadata_list = {'metadata': metadata}
|
||||||
|
|
||||||
elif metadata_type == 'season':
|
elif metadata_type == 'season':
|
||||||
parent_rating_key = helpers.get_xml_attr(metadata_main, 'parentRatingKey')
|
parent_rating_key = helpers.get_xml_attr(metadata_main, 'parentRatingKey')
|
||||||
show_details = self.get_metadata_details(parent_rating_key)
|
show_details = self.get_metadata_details(parent_rating_key)
|
||||||
metadata = {'media_type': metadata_type,
|
metadata = {'media_type': metadata_type,
|
||||||
|
'library_id': library_id,
|
||||||
|
'library_title': library_title,
|
||||||
'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
|
'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
|
||||||
'parent_rating_key': helpers.get_xml_attr(metadata_main, 'parentRatingKey'),
|
'parent_rating_key': helpers.get_xml_attr(metadata_main, 'parentRatingKey'),
|
||||||
'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
|
'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
|
||||||
'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
|
'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
|
||||||
'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
|
'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
|
||||||
'index': helpers.get_xml_attr(metadata_main, 'index'),
|
'media_index': helpers.get_xml_attr(metadata_main, 'index'),
|
||||||
'studio': show_details['metadata']['studio'],
|
'studio': show_details['metadata']['studio'],
|
||||||
'title': helpers.get_xml_attr(metadata_main, 'title'),
|
'title': helpers.get_xml_attr(metadata_main, 'title'),
|
||||||
'content_rating': show_details['metadata']['content_rating'],
|
'content_rating': show_details['metadata']['content_rating'],
|
||||||
|
@ -483,17 +525,20 @@ class PmsConnect(object):
|
||||||
'directors': show_details['metadata']['directors']
|
'directors': show_details['metadata']['directors']
|
||||||
}
|
}
|
||||||
metadata_list = {'metadata': metadata}
|
metadata_list = {'metadata': metadata}
|
||||||
|
|
||||||
elif metadata_type == 'episode':
|
elif metadata_type == 'episode':
|
||||||
grandparent_rating_key = helpers.get_xml_attr(metadata_main, 'grandparentRatingKey')
|
grandparent_rating_key = helpers.get_xml_attr(metadata_main, 'grandparentRatingKey')
|
||||||
show_details = self.get_metadata_details(grandparent_rating_key)
|
show_details = self.get_metadata_details(grandparent_rating_key)
|
||||||
metadata = {'media_type': metadata_type,
|
metadata = {'media_type': metadata_type,
|
||||||
|
'library_id': library_id,
|
||||||
|
'library_title': library_title,
|
||||||
'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
|
'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
|
||||||
'parent_rating_key': helpers.get_xml_attr(metadata_main, 'parentRatingKey'),
|
'parent_rating_key': helpers.get_xml_attr(metadata_main, 'parentRatingKey'),
|
||||||
'grandparent_rating_key': helpers.get_xml_attr(metadata_main, 'grandparentRatingKey'),
|
'grandparent_rating_key': helpers.get_xml_attr(metadata_main, 'grandparentRatingKey'),
|
||||||
'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
|
'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
|
||||||
'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
|
'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
|
||||||
'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
|
'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
|
||||||
'index': helpers.get_xml_attr(metadata_main, 'index'),
|
'media_index': helpers.get_xml_attr(metadata_main, 'index'),
|
||||||
'studio': show_details['metadata']['studio'],
|
'studio': show_details['metadata']['studio'],
|
||||||
'title': helpers.get_xml_attr(metadata_main, 'title'),
|
'title': helpers.get_xml_attr(metadata_main, 'title'),
|
||||||
'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
|
'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
|
||||||
|
@ -517,43 +562,16 @@ class PmsConnect(object):
|
||||||
'directors': directors
|
'directors': directors
|
||||||
}
|
}
|
||||||
metadata_list = {'metadata': metadata}
|
metadata_list = {'metadata': metadata}
|
||||||
elif metadata_type == 'movie':
|
|
||||||
metadata = {'media_type': metadata_type,
|
|
||||||
'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
|
|
||||||
'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
|
|
||||||
'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
|
|
||||||
'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
|
|
||||||
'index': helpers.get_xml_attr(metadata_main, 'index'),
|
|
||||||
'studio': helpers.get_xml_attr(metadata_main, 'studio'),
|
|
||||||
'title': helpers.get_xml_attr(metadata_main, 'title'),
|
|
||||||
'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
|
|
||||||
'summary': helpers.get_xml_attr(metadata_main, 'summary'),
|
|
||||||
'tagline': helpers.get_xml_attr(metadata_main, 'tagline'),
|
|
||||||
'rating': helpers.get_xml_attr(metadata_main, 'rating'),
|
|
||||||
'duration': helpers.get_xml_attr(metadata_main, 'duration'),
|
|
||||||
'year': helpers.get_xml_attr(metadata_main, 'year'),
|
|
||||||
'thumb': helpers.get_xml_attr(metadata_main, 'thumb'),
|
|
||||||
'parent_thumb': helpers.get_xml_attr(metadata_main, 'parentThumb'),
|
|
||||||
'grandparent_thumb': helpers.get_xml_attr(metadata_main, 'grandparentThumb'),
|
|
||||||
'art': helpers.get_xml_attr(metadata_main, 'art'),
|
|
||||||
'originally_available_at': helpers.get_xml_attr(metadata_main, 'originallyAvailableAt'),
|
|
||||||
'added_at': helpers.get_xml_attr(metadata_main, 'addedAt'),
|
|
||||||
'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
|
|
||||||
'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
|
|
||||||
'guid': helpers.get_xml_attr(metadata_main, 'guid'),
|
|
||||||
'genres': genres,
|
|
||||||
'actors': actors,
|
|
||||||
'writers': writers,
|
|
||||||
'directors': directors
|
|
||||||
}
|
|
||||||
metadata_list = {'metadata': metadata}
|
|
||||||
elif metadata_type == 'artist':
|
elif metadata_type == 'artist':
|
||||||
metadata = {'media_type': metadata_type,
|
metadata = {'media_type': metadata_type,
|
||||||
|
'library_id': library_id,
|
||||||
|
'library_title': library_title,
|
||||||
'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
|
'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
|
||||||
'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
|
'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
|
||||||
'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
|
'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
|
||||||
'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
|
'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
|
||||||
'index': helpers.get_xml_attr(metadata_main, 'index'),
|
'media_index': helpers.get_xml_attr(metadata_main, 'index'),
|
||||||
'studio': helpers.get_xml_attr(metadata_main, 'studio'),
|
'studio': helpers.get_xml_attr(metadata_main, 'studio'),
|
||||||
'title': helpers.get_xml_attr(metadata_main, 'title'),
|
'title': helpers.get_xml_attr(metadata_main, 'title'),
|
||||||
'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
|
'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
|
||||||
|
@ -577,16 +595,19 @@ class PmsConnect(object):
|
||||||
'actors': actors
|
'actors': actors
|
||||||
}
|
}
|
||||||
metadata_list = {'metadata': metadata}
|
metadata_list = {'metadata': metadata}
|
||||||
|
|
||||||
elif metadata_type == 'album':
|
elif metadata_type == 'album':
|
||||||
parent_rating_key = helpers.get_xml_attr(metadata_main, 'parentRatingKey')
|
parent_rating_key = helpers.get_xml_attr(metadata_main, 'parentRatingKey')
|
||||||
artist_details = self.get_metadata_details(parent_rating_key)
|
artist_details = self.get_metadata_details(parent_rating_key)
|
||||||
metadata = {'media_type': metadata_type,
|
metadata = {'media_type': metadata_type,
|
||||||
|
'library_id': library_id,
|
||||||
|
'library_title': library_title,
|
||||||
'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
|
'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
|
||||||
'parent_rating_key': helpers.get_xml_attr(metadata_main, 'parentRatingKey'),
|
'parent_rating_key': helpers.get_xml_attr(metadata_main, 'parentRatingKey'),
|
||||||
'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
|
'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
|
||||||
'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
|
'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
|
||||||
'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
|
'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
|
||||||
'index': helpers.get_xml_attr(metadata_main, 'index'),
|
'media_index': helpers.get_xml_attr(metadata_main, 'index'),
|
||||||
'studio': helpers.get_xml_attr(metadata_main, 'studio'),
|
'studio': helpers.get_xml_attr(metadata_main, 'studio'),
|
||||||
'title': helpers.get_xml_attr(metadata_main, 'title'),
|
'title': helpers.get_xml_attr(metadata_main, 'title'),
|
||||||
'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
|
'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
|
||||||
|
@ -610,17 +631,20 @@ class PmsConnect(object):
|
||||||
'directors': directors
|
'directors': directors
|
||||||
}
|
}
|
||||||
metadata_list = {'metadata': metadata}
|
metadata_list = {'metadata': metadata}
|
||||||
|
|
||||||
elif metadata_type == 'track':
|
elif metadata_type == 'track':
|
||||||
parent_rating_key = helpers.get_xml_attr(metadata_main, 'parentRatingKey')
|
parent_rating_key = helpers.get_xml_attr(metadata_main, 'parentRatingKey')
|
||||||
album_details = self.get_metadata_details(parent_rating_key)
|
album_details = self.get_metadata_details(parent_rating_key)
|
||||||
metadata = {'media_type': metadata_type,
|
metadata = {'media_type': metadata_type,
|
||||||
|
'library_id': library_id,
|
||||||
|
'library_title': library_title,
|
||||||
'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
|
'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
|
||||||
'parent_rating_key': helpers.get_xml_attr(metadata_main, 'parentRatingKey'),
|
'parent_rating_key': helpers.get_xml_attr(metadata_main, 'parentRatingKey'),
|
||||||
'grandparent_rating_key': helpers.get_xml_attr(metadata_main, 'grandparentRatingKey'),
|
'grandparent_rating_key': helpers.get_xml_attr(metadata_main, 'grandparentRatingKey'),
|
||||||
'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
|
'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
|
||||||
'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
|
'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
|
||||||
'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
|
'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
|
||||||
'index': helpers.get_xml_attr(metadata_main, 'index'),
|
'media_index': helpers.get_xml_attr(metadata_main, 'index'),
|
||||||
'studio': helpers.get_xml_attr(metadata_main, 'studio'),
|
'studio': helpers.get_xml_attr(metadata_main, 'studio'),
|
||||||
'title': helpers.get_xml_attr(metadata_main, 'title'),
|
'title': helpers.get_xml_attr(metadata_main, 'title'),
|
||||||
'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
|
'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
|
||||||
|
@ -644,6 +668,7 @@ class PmsConnect(object):
|
||||||
'directors': directors
|
'directors': directors
|
||||||
}
|
}
|
||||||
metadata_list = {'metadata': metadata}
|
metadata_list = {'metadata': metadata}
|
||||||
|
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -663,7 +688,6 @@ class PmsConnect(object):
|
||||||
xml_head = metadata.getElementsByTagName('MediaContainer')
|
xml_head = metadata.getElementsByTagName('MediaContainer')
|
||||||
except:
|
except:
|
||||||
logger.warn("Unable to parse XML for get_metadata_children.")
|
logger.warn("Unable to parse XML for get_metadata_children.")
|
||||||
return []
|
|
||||||
|
|
||||||
metadata_list = []
|
metadata_list = []
|
||||||
|
|
||||||
|
@ -692,6 +716,53 @@ class PmsConnect(object):
|
||||||
output = {'metadata': metadata_list}
|
output = {'metadata': metadata_list}
|
||||||
return output
|
return output
|
||||||
|
|
||||||
|
"""
|
||||||
|
Return processed and validated metadata list for requested library.
|
||||||
|
|
||||||
|
Parameters required: library_id { Plex library key }
|
||||||
|
|
||||||
|
Output: array
|
||||||
|
"""
|
||||||
|
def get_library_metadata_details(self, library_id=''):
|
||||||
|
libraries_data = self.get_libraries_list(output_format='xml')
|
||||||
|
|
||||||
|
try:
|
||||||
|
xml_head = libraries_data.getElementsByTagName('MediaContainer')
|
||||||
|
except:
|
||||||
|
logger.warn("Unable to parse XML for get_library_metadata_details.")
|
||||||
|
return []
|
||||||
|
|
||||||
|
metadata_list = []
|
||||||
|
|
||||||
|
for a in xml_head:
|
||||||
|
if a.getAttribute('size'):
|
||||||
|
if a.getAttribute('size') == '0':
|
||||||
|
metadata_list = {'metadata': None}
|
||||||
|
return metadata_list
|
||||||
|
|
||||||
|
if a.getElementsByTagName('Directory'):
|
||||||
|
result_data = a.getElementsByTagName('Directory')
|
||||||
|
for result in result_data:
|
||||||
|
key = helpers.get_xml_attr(result, 'key')
|
||||||
|
if key == library_id:
|
||||||
|
metadata = {'media_type': 'library',
|
||||||
|
'library_id': helpers.get_xml_attr(result, 'key'),
|
||||||
|
'library': helpers.get_xml_attr(result, 'type'),
|
||||||
|
'title': helpers.get_xml_attr(result, 'title'),
|
||||||
|
'art': helpers.get_xml_attr(result, 'art'),
|
||||||
|
'thumb': helpers.get_xml_attr(result, 'thumb')
|
||||||
|
}
|
||||||
|
if metadata['library'] == 'movie':
|
||||||
|
metadata['section_type'] = 'movie'
|
||||||
|
elif metadata['library'] == 'show':
|
||||||
|
metadata['section_type'] = 'episode'
|
||||||
|
elif metadata['library'] == 'artist':
|
||||||
|
metadata['section_type'] = 'track'
|
||||||
|
|
||||||
|
metadata_list = {'metadata': metadata}
|
||||||
|
|
||||||
|
return metadata_list
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Return processed and validated session list.
|
Return processed and validated session list.
|
||||||
|
|
||||||
|
@ -1215,7 +1286,7 @@ class PmsConnect(object):
|
||||||
if result_data:
|
if result_data:
|
||||||
for result in result_data:
|
for result in result_data:
|
||||||
children_output = {'rating_key': helpers.get_xml_attr(result, 'ratingKey'),
|
children_output = {'rating_key': helpers.get_xml_attr(result, 'ratingKey'),
|
||||||
'index': helpers.get_xml_attr(result, 'index'),
|
'media_index': helpers.get_xml_attr(result, 'index'),
|
||||||
'title': helpers.get_xml_attr(result, 'title'),
|
'title': helpers.get_xml_attr(result, 'title'),
|
||||||
'thumb': helpers.get_xml_attr(result, 'thumb'),
|
'thumb': helpers.get_xml_attr(result, 'thumb'),
|
||||||
'parent_thumb': helpers.get_xml_attr(a, 'thumb'),
|
'parent_thumb': helpers.get_xml_attr(a, 'thumb'),
|
||||||
|
@ -1430,7 +1501,8 @@ class PmsConnect(object):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if library_list['library_count'] != '0':
|
if library_list['library_count'] != '0':
|
||||||
library_stats = {'title': library['title'],
|
library_stats = {'key': library['key'],
|
||||||
|
'title': library['title'],
|
||||||
'thumb': library['thumb'],
|
'thumb': library['thumb'],
|
||||||
'count': library_list['library_count'],
|
'count': library_list['library_count'],
|
||||||
'count_type': library_list['count_type']
|
'count_type': library_list['count_type']
|
||||||
|
@ -1589,12 +1661,17 @@ class PmsConnect(object):
|
||||||
match_type = 'title'
|
match_type = 'title'
|
||||||
else:
|
else:
|
||||||
match_type = 'index'
|
match_type = 'index'
|
||||||
|
|
||||||
|
library_id = None
|
||||||
|
library_title = None
|
||||||
|
|
||||||
# get grandparent rating key
|
# get grandparent rating key
|
||||||
if media_type == 'season' or media_type == 'album':
|
if media_type == 'season' or media_type == 'album':
|
||||||
try:
|
try:
|
||||||
metadata = self.get_metadata_details(rating_key=rating_key)
|
metadata = self.get_metadata_details(rating_key=rating_key)
|
||||||
rating_key = metadata['metadata']['parent_rating_key']
|
rating_key = metadata['metadata']['parent_rating_key']
|
||||||
|
library_id = metadata['metadata']['library_id']
|
||||||
|
library_title = metadata['metadata']['library_title']
|
||||||
except:
|
except:
|
||||||
logger.warn("Unable to get parent_rating_key for get_rating_keys_list.")
|
logger.warn("Unable to get parent_rating_key for get_rating_keys_list.")
|
||||||
return {}
|
return {}
|
||||||
|
@ -1603,6 +1680,8 @@ class PmsConnect(object):
|
||||||
try:
|
try:
|
||||||
metadata = self.get_metadata_details(rating_key=rating_key)
|
metadata = self.get_metadata_details(rating_key=rating_key)
|
||||||
rating_key = metadata['metadata']['grandparent_rating_key']
|
rating_key = metadata['metadata']['grandparent_rating_key']
|
||||||
|
library_id = metadata['metadata']['library_id']
|
||||||
|
library_title = metadata['metadata']['library_title']
|
||||||
except:
|
except:
|
||||||
logger.warn("Unable to get grandparent_rating_key for get_rating_keys_list.")
|
logger.warn("Unable to get grandparent_rating_key for get_rating_keys_list.")
|
||||||
return {}
|
return {}
|
||||||
|
@ -1668,14 +1747,16 @@ class PmsConnect(object):
|
||||||
|
|
||||||
key = int(parent_index) if match_type == 'index' else parent_title
|
key = int(parent_index) if match_type == 'index' else parent_title
|
||||||
parents.update({key:
|
parents.update({key:
|
||||||
{'rating_key': int(parent_rating_key),
|
{'rating_key': int(parent_rating_key),
|
||||||
'children': children}
|
'children': children}
|
||||||
})
|
})
|
||||||
|
|
||||||
key = 0 if match_type == 'index' else title
|
key = 0 if match_type == 'index' else title
|
||||||
key_list = {key:
|
key_list = {key:
|
||||||
{'rating_key': int(rating_key),
|
{'rating_key': int(rating_key),
|
||||||
'children': parents}
|
'children': parents },
|
||||||
|
'library_id': library_id,
|
||||||
|
'library_title': library_title
|
||||||
}
|
}
|
||||||
|
|
||||||
return key_list
|
return key_list
|
||||||
|
|
|
@ -167,6 +167,10 @@ class WebInterface(object):
|
||||||
|
|
||||||
@cherrypy.expose
|
@cherrypy.expose
|
||||||
def history(self):
|
def history(self):
|
||||||
|
# Make sure our library sections are up to date.
|
||||||
|
data_factory = datafactory.DataFactory()
|
||||||
|
data_factory.update_library_sections()
|
||||||
|
|
||||||
return serve_template(templatename="history.html", title="History")
|
return serve_template(templatename="history.html", title="History")
|
||||||
|
|
||||||
@cherrypy.expose
|
@cherrypy.expose
|
||||||
|
@ -623,6 +627,9 @@ class WebInterface(object):
|
||||||
if 'reference_id' in kwargs:
|
if 'reference_id' in kwargs:
|
||||||
reference_id = kwargs.get('reference_id', "")
|
reference_id = kwargs.get('reference_id', "")
|
||||||
custom_where.append(['session_history.reference_id', reference_id])
|
custom_where.append(['session_history.reference_id', reference_id])
|
||||||
|
if 'library_id' in kwargs:
|
||||||
|
library_id = kwargs.get('library_id', "")
|
||||||
|
custom_where.append(['session_history_metadata.library_id', library_id])
|
||||||
if 'media_type' in kwargs:
|
if 'media_type' in kwargs:
|
||||||
media_type = kwargs.get('media_type', "")
|
media_type = kwargs.get('media_type', "")
|
||||||
if media_type != 'all':
|
if media_type != 'all':
|
||||||
|
@ -838,23 +845,27 @@ class WebInterface(object):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@cherrypy.expose
|
@cherrypy.expose
|
||||||
def info(self, item_id=None, source=None, **kwargs):
|
def info(self, library_id=None, item_id=None, source=None, query=None, **kwargs):
|
||||||
|
# Make sure our library sections are up to date.
|
||||||
|
data_factory = datafactory.DataFactory()
|
||||||
|
data_factory.update_library_sections()
|
||||||
|
|
||||||
metadata = None
|
metadata = None
|
||||||
query = None
|
query_string = query
|
||||||
|
|
||||||
config = {
|
config = {
|
||||||
"pms_identifier": plexpy.CONFIG.PMS_IDENTIFIER
|
"pms_identifier": plexpy.CONFIG.PMS_IDENTIFIER,
|
||||||
|
"update_library_ids": plexpy.CONFIG.UPDATE_LIBRARY_IDS
|
||||||
}
|
}
|
||||||
|
|
||||||
if source == 'history':
|
if source == 'history':
|
||||||
data_factory = datafactory.DataFactory()
|
data_factory = datafactory.DataFactory()
|
||||||
metadata = data_factory.get_metadata_details(row_id=item_id)
|
metadata = data_factory.get_metadata_details(row_id=item_id)
|
||||||
elif item_id == 'movie':
|
elif library_id:
|
||||||
metadata = {'media_type': 'library', 'library': 'movie', 'media_type_filter': 'movie', 'title': 'Movies'}
|
pms_connect = pmsconnect.PmsConnect()
|
||||||
elif item_id == 'show':
|
result = pms_connect.get_library_metadata_details(library_id=library_id)
|
||||||
metadata = {'media_type': 'library', 'library': 'show', 'media_type_filter': 'episode', 'title': 'TV Shows'}
|
if result:
|
||||||
elif item_id == 'artist':
|
metadata = result['metadata']
|
||||||
metadata = {'media_type': 'library', 'library': 'artist', 'media_type_filter': 'track', 'title': 'Music'}
|
|
||||||
else:
|
else:
|
||||||
pms_connect = pmsconnect.PmsConnect()
|
pms_connect = pmsconnect.PmsConnect()
|
||||||
result = pms_connect.get_metadata_details(rating_key=item_id)
|
result = pms_connect.get_metadata_details(rating_key=item_id)
|
||||||
|
@ -863,6 +874,8 @@ class WebInterface(object):
|
||||||
else:
|
else:
|
||||||
data_factory = datafactory.DataFactory()
|
data_factory = datafactory.DataFactory()
|
||||||
query = data_factory.get_search_query(rating_key=item_id)
|
query = data_factory.get_search_query(rating_key=item_id)
|
||||||
|
if query_string:
|
||||||
|
query['query_string'] = query_string
|
||||||
|
|
||||||
if metadata:
|
if metadata:
|
||||||
return serve_template(templatename="info.html", data=metadata, title="Info", config=config)
|
return serve_template(templatename="info.html", data=metadata, title="Info", config=config)
|
||||||
|
@ -1527,7 +1540,7 @@ class WebInterface(object):
|
||||||
result['results_list'] = {media_type: result['results_list'][media_type]}
|
result['results_list'] = {media_type: result['results_list'][media_type]}
|
||||||
if media_type == 'season' and season_index:
|
if media_type == 'season' and season_index:
|
||||||
for season in result['results_list']['season']:
|
for season in result['results_list']['season']:
|
||||||
if season['index'] == season_index:
|
if season['media_index'] == season_index:
|
||||||
result['results_list']['season'] = [season]
|
result['results_list']['season'] = [season]
|
||||||
break
|
break
|
||||||
|
|
||||||
|
@ -1616,3 +1629,33 @@ class WebInterface(object):
|
||||||
if servers:
|
if servers:
|
||||||
cherrypy.response.headers['Content-type'] = 'application/json'
|
cherrypy.response.headers['Content-type'] = 'application/json'
|
||||||
return servers
|
return servers
|
||||||
|
|
||||||
|
@cherrypy.expose
|
||||||
|
def update_library_ids(self, **kwargs):
|
||||||
|
|
||||||
|
logger.debug(u"Updating library_id's in database.")
|
||||||
|
data_factory = datafactory.DataFactory()
|
||||||
|
result = data_factory.update_library_ids()
|
||||||
|
|
||||||
|
if result:
|
||||||
|
logger.debug(u"Updated all library_id's in database.")
|
||||||
|
plexpy.CONFIG.UPDATE_LIBRARY_IDS = 0
|
||||||
|
plexpy.CONFIG.write()
|
||||||
|
return "Library ids updated."
|
||||||
|
else:
|
||||||
|
logger.debug(u"Unable to update library_id's in database.")
|
||||||
|
return "Unable to update library ids in database."
|
||||||
|
|
||||||
|
@cherrypy.expose
|
||||||
|
def update_library_sections(self, **kwargs):
|
||||||
|
|
||||||
|
logger.debug(u"Updating library sections in database.")
|
||||||
|
data_factory = datafactory.DataFactory()
|
||||||
|
result = data_factory.update_library_sections()
|
||||||
|
|
||||||
|
if result:
|
||||||
|
logger.debug(u"Updated all library sections in database.")
|
||||||
|
return "Library sections updated."
|
||||||
|
else:
|
||||||
|
logger.debug(u"Unable to update library sections in database.")
|
||||||
|
return "Unable to update library sections in database."
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue