Merge branch 'dev'

This commit is contained in:
Tim 2015-09-07 21:16:30 +02:00
commit 3fcc44aacf
14 changed files with 180 additions and 106 deletions

View file

@ -1,5 +1,16 @@
# Changelog # Changelog
## v1.1.7 (2015-09-07)
* Show tagline in info screens for movies. Thanks @JonnyWong.
* Add play/pause/buffer icon to activity pane. Thanks @JonnyWong.
* Add transcoder info in activity pane info. Thanks @JonnyWong.
* Show transcoder progress on activity progress bar. Thanks @JonnyWong.
* Fix bug where custom notification strings would be ignored if unicode characters were present.
* Fix text overflow issue on home stats cards. Thanks @JonnyWong.
* Fix regression with user friendly name change input in edit screen. Thanks @JonnyWong.
## v1.1.6 (2015-09-06) ## v1.1.6 (2015-09-06)
* Home stats cards are now expandable to show multiple items. Configurable in settings. Thanks @JonnyWong. * Home stats cards are now expandable to show multiple items. Configurable in settings. Thanks @JonnyWong.

View file

@ -683,6 +683,13 @@ a:hover .dashboard-activity-poster {
-webkit-transition: all 0s; -webkit-transition: all 0s;
transition: all 0s; transition: all 0s;
} }
.dashboard-activity-progress .bufferbar {
padding-top: 6px;
background-color: #444;
position: absolute;
height: 6px;
overflow: hidden;
}
.dashboard-activity-progress .bar { .dashboard-activity-progress .bar {
padding-top: 6px; padding-top: 6px;
background-color: #faa732; background-color: #faa732;
@ -693,6 +700,9 @@ a:hover .dashboard-activity-poster {
background-image: linear-gradient(to bottom, #fbb450, #f89406); background-image: linear-gradient(to bottom, #fbb450, #f89406);
background-repeat: repeat-x; background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
position: absolute;
height: 6px;
overflow: hidden;
} }
.dashboard-activity-metadata-wrapper { .dashboard-activity-metadata-wrapper {
position: relative; position: relative;
@ -1541,6 +1551,7 @@ a .season-episodes-card-overlay:hover {
-webkit-box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1); -webkit-box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1);
-moz-box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1); -moz-box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1);
box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1); box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1);
white-space: nowrap;
} }
.home-platforms-instance li { .home-platforms-instance li {
position: relative; position: relative;
@ -1553,7 +1564,6 @@ a .season-episodes-card-overlay:hover {
height: 120px; height: 120px;
} }
.home-platforms-instance-name { .home-platforms-instance-name {
float: left;
color: #fff; color: #fff;
text-overflow: ellipsis; text-overflow: ellipsis;
overflow: hidden; overflow: hidden;
@ -1565,53 +1575,20 @@ a .season-episodes-card-overlay:hover {
padding: 0 0 0 20px; padding: 0 0 0 20px;
} }
.home-platforms-instance-name h4 { .home-platforms-instance-name h4 {
margin: 10px 0 20px 0; margin: 10px 0 4px 0;
}
.home-platforms-instance-name h5 {
font-size: 14px;
line-height: 16px;
margin: 15px 0 2px 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.home-platforms-instance-name2 {
position: absolute;
top: 34px;
left: 215px;
}
.home-platforms-instance-name2 h5 {
font-size: 14px;
line-height: 16px;
margin: 15px 0 2px 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.home-platforms-instance-name2 h3 {
font-size: 30px;
font-weight: bold;
color: #F9AA03;
line-height: 22px;
position: relative;
top: 5px;
margin: 0 5px 0 0;
padding-top: 6px;
float: left;
}
.home-platforms-instance-name2 p {
color: #aaa;
font-size: 12px;
float: left;
position: relative;
top: 21px;
left: 0px;
} }
.home-platforms-instance-playcount { .home-platforms-instance-playcount {
float: left; display: inline-block;
position: relative; position: relative;
padding: 6px 0 0 20px; padding: 6px 0 0 20px;
width: 100%; }
.home-platforms-instance-playcount h4 {
font-size: 14px;
line-height: 16px;
margin: 10px 0 10px 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
} }
.home-platforms-instance-playcount h3 { .home-platforms-instance-playcount h3 {
font-size: 30px; font-size: 30px;
@ -1638,6 +1615,14 @@ a .season-episodes-card-overlay:hover {
padding: 6px 0 0 20px; padding: 6px 0 0 20px;
width: 100%; width: 100%;
} }
.home-platforms-instance-last-user h4 {
font-size: 14px;
line-height: 16px;
margin: 10px 0 10px 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.home-platforms-instance-last-user h5 { .home-platforms-instance-last-user h5 {
font-size: 12px; font-size: 12px;
position: relative; position: relative;
@ -2220,6 +2205,9 @@ a .home-platforms-instance-list-oval:hover,
color: #fff; color: #fff;
cursor: pointer; cursor: pointer;
} }
.edit-user-name > input[type='text'] {
margin: 0;
}
.popover { .popover {
z-index: 2; z-index: 2;
} }

View file

@ -34,6 +34,9 @@ title Returns the name of the episode, movie or music trac
year Returns the year of the episode, movie, or clip. year Returns the year of the episode, movie, or clip.
player Returns the name of the platform used to play the stream. player Returns the name of the platform used to play the stream.
platform Returns the type of platform used to play the stream. platform Returns the type of platform used to play the stream.
throttled Returns true if the transcode session is throttled.
transcode_progress Returns the current transcode progress of the item. 0 to 100.
transcode_speed Returns the current transcode speed of the item.
audio_decision Returns the audio transcode decision. Either 'transcode', 'copy' or 'direct play'. audio_decision Returns the audio transcode decision. Either 'transcode', 'copy' or 'direct play'.
audio_codec Returns the name of the audio codec. audio_codec Returns the name of the audio codec.
audio_channels Returns the number of audio channels. audio_channels Returns the number of audio channels.
@ -68,7 +71,6 @@ DOCUMENTATION :: END
<a href="info?item_id=${a['rating_key']}"> <a href="info?item_id=${a['rating_key']}">
% endif % endif
<div class="dashboard-activity-poster"> <div class="dashboard-activity-poster">
<script>console.log('${a['indexes']}');</script>
% if a['type'] == 'movie' and not a['indexes']: % if a['type'] == 'movie' and not a['indexes']:
<div class="dashboard-activity-poster-face" style="background-image: url(pms_image_proxy?img=${a['art']}&width=500&height=280);"></div> <div class="dashboard-activity-poster-face" style="background-image: url(pms_image_proxy?img=${a['art']}&width=500&height=280);"></div>
% elif a['type'] == 'episode' and not a['indexes']: % elif a['type'] == 'episode' and not a['indexes']:
@ -116,7 +118,12 @@ DOCUMENTATION :: END
% if a['audio_decision'] == 'direct play': % if a['audio_decision'] == 'direct play':
Stream &nbsp;<strong>Direct Play</strong> Stream &nbsp;<strong>Direct Play</strong>
% else: % else:
Stream &nbsp;<strong>Transcoding</strong> Stream &nbsp;<strong>Transcoding
(Speed: ${a['transcode_speed']})
% if a['throttled'] == '1':
(Throttled)
% endif
</strong>
% endif % endif
<br /> <br />
% if a['audio_decision'] == 'direct play': % if a['audio_decision'] == 'direct play':
@ -130,7 +137,12 @@ DOCUMENTATION :: END
% if a['video_decision'] == 'direct play': % if a['video_decision'] == 'direct play':
Stream &nbsp;<strong>Direct Play</strong> Stream &nbsp;<strong>Direct Play</strong>
% else: % else:
Stream &nbsp;<strong>Transcoding</strong> Stream &nbsp;<strong>Transcoding
(Speed: ${a['transcode_speed']})
% if a['throttled'] == '1':
(Throttled)
% endif
</strong>
% endif % endif
<br /> <br />
% if a['video_decision'] == 'direct play': % if a['video_decision'] == 'direct play':
@ -163,6 +175,7 @@ DOCUMENTATION :: END
% endif % endif
<div class="dashboard-activity-progress"> <div class="dashboard-activity-progress">
<div class="dashboard-activity-progress-bar"> <div class="dashboard-activity-progress-bar">
<div class="bufferbar" style="width: ${a['transcode_progress']}%">${a['transcode_progress']}%</div>
<div class="bar" style="width: ${a['progress_percent']}%">${a['progress_percent']}%</div> <div class="bar" style="width: ${a['progress_percent']}%">${a['progress_percent']}%</div>
</div> </div>
</div> </div>
@ -171,6 +184,13 @@ DOCUMENTATION :: END
<div class="dashboard-activity-metadata-user-thumb" style="background-image: url(${a['user_thumb']});"></div> <div class="dashboard-activity-metadata-user-thumb" style="background-image: url(${a['user_thumb']});"></div>
</a> </a>
<div class="dashboard-activity-metadata-title"> <div class="dashboard-activity-metadata-title">
% if a['state'] == 'playing':
<i class="fa fa-play"></i>&nbsp;
% elif a['state'] == 'paused':
<i class="fa fa-pause"></i>&nbsp;
% elif a['state'] == 'buffering':
<i class="fa fa-spinner"></i>&nbsp;
% endif
% if a['type'] == 'episode': % if a['type'] == 'episode':
<a href="info?item_id=${a['rating_key']}">${a['grandparent_title']} - ${a['title']}</a> <a href="info?item_id=${a['rating_key']}">${a['grandparent_title']} - ${a['title']}</a>
% elif a['type'] == 'movie': % elif a['type'] == 'movie':

View file

@ -73,13 +73,13 @@ DOCUMENTATION :: END
<div class="home-platforms-instance-info"> <div class="home-platforms-instance-info">
<div class="home-platforms-instance-name"> <div class="home-platforms-instance-name">
<h4>Most Watched TV</h4> <h4>Most Watched TV</h4>
<h5> </div>
<div class="home-platforms-instance-playcount">
<h4>
<a href="info?item_id=${top_stat['rows'][0]['rating_key']}"> <a href="info?item_id=${top_stat['rows'][0]['rating_key']}">
${top_stat['rows'][0]['title']} ${top_stat['rows'][0]['title']}
</a> </a>
</h5> </h4>
</div>
<div class="home-platforms-instance-playcount">
% if top_stat['stat_type'] == 'total_plays': % if top_stat['stat_type'] == 'total_plays':
<h3>${top_stat['rows'][0]['total_plays']}</h3> <h3>${top_stat['rows'][0]['total_plays']}</h3>
<p> plays</p> <p> plays</p>
@ -153,13 +153,13 @@ DOCUMENTATION :: END
<div class="home-platforms-instance-info"> <div class="home-platforms-instance-info">
<div class="home-platforms-instance-name"> <div class="home-platforms-instance-name">
<h4>Most Popular TV</h4> <h4>Most Popular TV</h4>
<h5> </div>
<div class="home-platforms-instance-playcount">
<h4>
<a href="info?item_id=${top_stat['rows'][0]['rating_key']}"> <a href="info?item_id=${top_stat['rows'][0]['rating_key']}">
${top_stat['rows'][0]['title']} ${top_stat['rows'][0]['title']}
</a> </a>
</h5> </h4>
</div>
<div class="home-platforms-instance-playcount">
<h3>${top_stat['rows'][0]['users_watched']}</h3> <h3>${top_stat['rows'][0]['users_watched']}</h3>
<p> users</p> <p> users</p>
</div> </div>
@ -225,13 +225,13 @@ DOCUMENTATION :: END
<div class="home-platforms-instance-info"> <div class="home-platforms-instance-info">
<div class="home-platforms-instance-name"> <div class="home-platforms-instance-name">
<h4>Most Watched Movie</h4> <h4>Most Watched Movie</h4>
<h5> </div>
<div class="home-platforms-instance-playcount">
<h4>
<a href="info?item_id=${top_stat['rows'][0]['rating_key']}"> <a href="info?item_id=${top_stat['rows'][0]['rating_key']}">
${top_stat['rows'][0]['title']} ${top_stat['rows'][0]['title']}
</a> </a>
</h5> </h4>
</div>
<div class="home-platforms-instance-playcount">
% if top_stat['stat_type'] == 'total_plays': % if top_stat['stat_type'] == 'total_plays':
<h3>${top_stat['rows'][0]['total_plays']}</h3> <h3>${top_stat['rows'][0]['total_plays']}</h3>
<p> plays</p> <p> plays</p>
@ -305,13 +305,13 @@ DOCUMENTATION :: END
<div class="home-platforms-instance-info"> <div class="home-platforms-instance-info">
<div class="home-platforms-instance-name"> <div class="home-platforms-instance-name">
<h4>Most Popular Movie</h4> <h4>Most Popular Movie</h4>
<h5> </div>
<div class="home-platforms-instance-playcount">
<h4>
<a href="info?item_id=${top_stat['rows'][0]['rating_key']}"> <a href="info?item_id=${top_stat['rows'][0]['rating_key']}">
${top_stat['rows'][0]['title']} ${top_stat['rows'][0]['title']}
</a> </a>
</h5> </h4>
</div>
<div class="home-platforms-instance-playcount">
<h3>${top_stat['rows'][0]['users_watched']}</h3> <h3>${top_stat['rows'][0]['users_watched']}</h3>
<p> users</p> <p> users</p>
</div> </div>
@ -377,17 +377,17 @@ DOCUMENTATION :: END
<div class="home-platforms-instance-info"> <div class="home-platforms-instance-info">
<div class="home-platforms-instance-name"> <div class="home-platforms-instance-name">
<h4>Most Active User</h4> <h4>Most Active User</h4>
<h5>
% if top_stat['rows'][0]['user_id']:
<a href="user?user_id=${top_stat['rows'][0]['user_id']}">
% else:
<a href="user?user=${top_stat['rows'][0]['user']}">
% endif
${top_stat['rows'][0]['friendly_name']}
</a>
</h5>
</div> </div>
<div class="home-platforms-instance-playcount"> <div class="home-platforms-instance-playcount">
<h4>
% if top_stat['rows'][0]['user_id']:
<a href="user?user_id=${top_stat['rows'][0]['user_id']}">
% else:
<a href="user?user=${top_stat['rows'][0]['user']}">
% endif
${top_stat['rows'][0]['friendly_name']}
</a>
</h4>
% if top_stat['stat_type'] == 'total_plays': % if top_stat['stat_type'] == 'total_plays':
<h3>${top_stat['rows'][0]['total_plays']}</h3> <h3>${top_stat['rows'][0]['total_plays']}</h3>
<p> plays</p> <p> plays</p>
@ -473,9 +473,9 @@ DOCUMENTATION :: END
<div class="home-platforms-instance-info"> <div class="home-platforms-instance-info">
<div class="home-platforms-instance-name"> <div class="home-platforms-instance-name">
<h4>Most Active Platform</h4> <h4>Most Active Platform</h4>
<h5>${top_stat['rows'][0]['platform_type']}</h5>
</div> </div>
<div class="home-platforms-instance-playcount"> <div class="home-platforms-instance-playcount">
<h4>${top_stat['rows'][0]['platform_type']}</h4>
% if top_stat['stat_type'] == 'total_plays': % if top_stat['stat_type'] == 'total_plays':
<h3>${top_stat['rows'][0]['total_plays']}</h3> <h3>${top_stat['rows'][0]['total_plays']}</h3>
<p> plays</p> <p> plays</p>
@ -535,13 +535,13 @@ DOCUMENTATION :: END
<div class="home-platforms-instance-info"> <div class="home-platforms-instance-info">
<div class="home-platforms-instance-name"> <div class="home-platforms-instance-name">
<h4>Last Watched</h4> <h4>Last Watched</h4>
<h5> </div>
<div class="home-platforms-instance-last-user">
<h4>
<a href="info?source=history&item_id=${top_stat['rows'][0]['row_id']}"> <a href="info?source=history&item_id=${top_stat['rows'][0]['row_id']}">
${top_stat['rows'][0]['title']} ${top_stat['rows'][0]['title']}
</a> </a>
</h5> </h4>
</div>
<div class="home-platforms-instance-last-user">
<h5> <h5>
% if top_stat['rows'][0]['user_id']: % if top_stat['rows'][0]['user_id']:
<a href="user?user_id=${top_stat['rows'][0]['user_id']}"> <a href="user?user_id=${top_stat['rows'][0]['user_id']}">

View file

@ -144,6 +144,11 @@ DOCUMENTATION :: END
% endif % endif
</div> </div>
</div> </div>
% if data['type'] == 'movie' and data['tagline']:
<div class="summary-content-summary">
<p><strong> ${data['tagline']} </strong></p>
</div>
% endif
<div class="summary-content-summary"> <div class="summary-content-summary">
<p> ${data['summary']} </p> <p> ${data['summary']} </p>
</div> </div>

View file

@ -38,21 +38,21 @@ DOCUMENTATION :: END
<div class="home-platforms-instance-info"> <div class="home-platforms-instance-info">
<div class="home-platforms-instance-name"> <div class="home-platforms-instance-name">
<h4>${library['rows']['title']}</h4> <h4>${library['rows']['title']}</h4>
<h5>${library['rows']['count_type']}</h5>
</div> </div>
<div class="home-platforms-instance-playcount"> <div class="home-platforms-instance-playcount">
<h5>${library['rows']['count_type']}</h5>
<h3>${library['rows']['count']}</h3> <h3>${library['rows']['count']}</h3>
<p> items</p> <p> items</p>
</div> </div>
% if library['type'] == 'show': % if library['type'] == 'show':
<div class="home-platforms-instance-name2"> <div class="home-platforms-instance-playcount" style="padding-left: 10px;">
<h5>${library['rows']['episode_count_type']}</h5> <h5>${library['rows']['episode_count_type']}</h5>
<h3>${library['rows']['episode_count']}</h3> <h3>${library['rows']['episode_count']}</h3>
<p> items</p> <p> items</p>
</div> </div>
% endif % endif
% if library['type'] == 'artist': % if library['type'] == 'artist':
<div class="home-platforms-instance-name2"> <div class="home-platforms-instance-playcount" style="padding-left: 10px;">
<h5>${library['rows']['album_count_type']}</h5> <h5>${library['rows']['album_count_type']}</h5>
<h3>${library['rows']['album_count']}</h3> <h3>${library['rows']['album_count']}</h3>
<p> items</p> <p> items</p>

View file

@ -321,7 +321,7 @@ available_notification_agents = notifiers.available_notification_agents()
<div class="checkbox"> <div class="checkbox">
<label> <label>
<input type="checkbox" id="pms_use_bif" name="pms_use_bif" value="1" ${config['pms_use_bif']}> Use BIF thumbs <input type="checkbox" id="pms_use_bif" name="pms_use_bif" value="1" ${config['pms_use_bif']}> Use video preview thumbnails (BIF)
</label> </label>
<p class="help-block">If you have media indexing enabled on your server, use these on the activity pane.</p> <p class="help-block">If you have media indexing enabled on your server, use these on the activity pane.</p>
</div> </div>

View file

@ -16,7 +16,7 @@
<button class="btn btn-danger btn-edit" data-toggle="button" aria-pressed="false" autocomplete="off" id="row-edit-mode"> <button class="btn btn-danger btn-edit" data-toggle="button" aria-pressed="false" autocomplete="off" id="row-edit-mode">
<i class="fa fa-pencil"></i> Edit mode <i class="fa fa-pencil"></i> Edit mode
</button>&nbsp </button>&nbsp
<div class="alert alert-danger alert-edit" role="alert" id="row-edit-mode-alert"><i class="fa fa-exclamation-triangle"></i>&nbspSelect rows to delete. Data is deleted upon exiting delete mode.</div> <div class="alert alert-danger alert-edit" role="alert" id="row-edit-mode-alert"><i class="fa fa-exclamation-triangle"></i>&nbspSelect users to purge. Data is purged upon exiting edit mode.</div>
</div> </div>
</div> </div>
<div class='table-card-back'> <div class='table-card-back'>
@ -119,6 +119,13 @@
$(this).addClass('hidden'); $(this).addClass('hidden');
$('#row-edit-mode-alert').fadeOut(200); $('#row-edit-mode-alert').fadeOut(200);
}); });
$('.edit-user-control > .edit-user-name').each(function () {
a = $(this).children('a');
input = $(this).children('input');
a.text(input.val());
a.removeClass('hidden');
input.addClass('hidden');
});
} else { } else {
users_to_purge = []; users_to_purge = [];
@ -126,6 +133,10 @@
$(this).find('button.btn-danger').toggleClass('btn-warning').toggleClass('btn-danger'); $(this).find('button.btn-danger').toggleClass('btn-warning').toggleClass('btn-danger');
$(this).removeClass('hidden'); $(this).removeClass('hidden');
}); });
$('.edit-user-control > .edit-user-name').each(function () {
$(this).children('a').addClass('hidden');
$(this).children('input').removeClass('hidden');
});
} }
}); });
}); });

View file

@ -1,4 +1,4 @@
# This file is part of PlexPy. # This file is part of PlexPy.
# #
# PlexPy is free software: you can redistribute it and/or modify # PlexPy is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -377,7 +377,7 @@ def dbcheck():
'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, thumb TEXT, parent_thumb TEXT, grandparent_thumb TEXT, art TEXT, media_type TEXT, '
'year INTEGER, originally_available_at TEXT, added_at INTEGER, updated_at INTEGER, last_viewed_at INTEGER, ' 'year INTEGER, originally_available_at TEXT, added_at INTEGER, updated_at INTEGER, last_viewed_at INTEGER, '
'content_rating TEXT, summary TEXT, rating TEXT, duration INTEGER DEFAULT 0, guid TEXT, ' 'content_rating TEXT, summary TEXT, tagline TEXT, rating TEXT, duration INTEGER DEFAULT 0, guid TEXT, '
'directors TEXT, writers TEXT, actors TEXT, genres TEXT, studio TEXT)' 'directors TEXT, writers TEXT, actors TEXT, genres TEXT, studio TEXT)'
'' ''
) )
@ -517,15 +517,24 @@ def dbcheck():
'ALTER TABLE sessions ADD COLUMN transcode_height INTEGER' 'ALTER TABLE sessions ADD COLUMN transcode_height INTEGER'
) )
# Upgrade sessions 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')
except sqlite3.OperationalError: except sqlite3.OperationalError:
logger.debug(u"Altering database. Updating database table sessions.") logger.debug(u"Altering database. Updating database table session_history_metadata.")
c_db.execute( c_db.execute(
'ALTER TABLE session_history_metadata ADD COLUMN full_title TEXT' 'ALTER TABLE session_history_metadata ADD COLUMN full_title TEXT'
) )
# Upgrade session_history_metadata table from earlier versions
try:
c_db.execute('SELECT tagline from session_history_metadata')
except sqlite3.OperationalError:
logger.debug(u"Altering database. Updating database table session_history_metadata.")
c_db.execute(
'ALTER TABLE session_history_metadata ADD COLUMN tagline TEXT'
)
# notify_log table :: This is a table which logs notifications sent # notify_log table :: This is a table which logs notifications sent
c_db.execute( c_db.execute(
'CREATE TABLE IF NOT EXISTS notify_log (id INTEGER PRIMARY KEY AUTOINCREMENT, ' 'CREATE TABLE IF NOT EXISTS notify_log (id INTEGER PRIMARY KEY AUTOINCREMENT, '

View file

@ -578,8 +578,8 @@ class DataFactory(object):
if row_id: if row_id:
query = 'SELECT rating_key, parent_rating_key, grandparent_rating_key, title, parent_title, grandparent_title, ' \ query = 'SELECT rating_key, parent_rating_key, grandparent_rating_key, title, parent_title, grandparent_title, ' \
'full_title, media_index, parent_media_index, thumb, parent_thumb, grandparent_thumb, art, media_type, ' \ 'full_title, media_index, parent_media_index, thumb, parent_thumb, grandparent_thumb, art, media_type, ' \
'year, originally_available_at, added_at, updated_at, last_viewed_at, content_rating, summary, rating, ' \ 'year, originally_available_at, added_at, updated_at, last_viewed_at, content_rating, summary, tagline, ' \
'duration, guid, directors, writers, actors, genres, studio ' \ 'rating, duration, guid, directors, writers, actors, genres, studio ' \
'FROM session_history_metadata ' \ 'FROM session_history_metadata ' \
'WHERE id = ?' 'WHERE id = ?'
result = monitor_db.select(query=query, args=[row_id]) result = monitor_db.select(query=query, args=[row_id])
@ -605,6 +605,7 @@ class DataFactory(object):
'title': item['title'], 'title': item['title'],
'content_rating': item['content_rating'], 'content_rating': item['content_rating'],
'summary': item['summary'], 'summary': item['summary'],
'tagline': item['tagline'],
'rating': item['rating'], 'rating': item['rating'],
'duration': item['duration'], 'duration': item['duration'],
'year': item['year'], 'year': item['year'],

View file

@ -1,4 +1,4 @@
# This file is part of PlexPy. # This file is part of PlexPy.
# #
# PlexPy is free software: you can redistribute it and/or modify # PlexPy is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -343,17 +343,17 @@ class MonitorProcessing(object):
'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, thumb, parent_thumb, grandparent_thumb, art, media_type, year, ' \
'originally_available_at, added_at, updated_at, last_viewed_at, content_rating, summary, ' \ 'originally_available_at, added_at, updated_at, last_viewed_at, content_rating, summary, ' \
'rating, duration, guid, directors, writers, actors, genres, studio) VALUES ' \ '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['index'], metadata['parent_index'], metadata['thumb'], metadata['parent_thumb'],
metadata['grandparent_thumb'], metadata['art'], session['media_type'], metadata['year'], metadata['grandparent_thumb'], metadata['art'], session['media_type'], metadata['year'],
metadata['originally_available_at'], metadata['added_at'], metadata['updated_at'], metadata['originally_available_at'], metadata['added_at'], metadata['updated_at'],
metadata['last_viewed_at'], metadata['content_rating'], metadata['summary'], metadata['rating'], metadata['last_viewed_at'], metadata['content_rating'], metadata['summary'], metadata['tagline'],
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 Monitor :: Writing session_history_metadata transaction...") # logger.debug(u"PlexPy Monitor :: Writing session_history_metadata transaction...")
self.db.action(query=query, args=args) self.db.action(query=query, args=args)

View file

@ -349,14 +349,14 @@ def build_notify_text(session, state):
if on_start_subject and on_start_body: if on_start_subject and on_start_body:
try: try:
subject_text = on_start_subject.format(**available_params) subject_text = unicode(on_start_subject).format(**available_params)
except LookupError, e: except LookupError, e:
logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification subject. Using fallback." % e) logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification subject. Using fallback." % e)
except: except:
logger.error(u"PlexPy Notifier :: Unable to parse custom notification subject. Using fallback.") logger.error(u"PlexPy Notifier :: Unable to parse custom notification subject. Using fallback.")
try: try:
body_text = on_start_body.format(**available_params) body_text = unicode(on_start_body).format(**available_params)
except LookupError, e: except LookupError, e:
logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification body. Using fallback." % e) logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification body. Using fallback." % e)
except: except:
@ -373,14 +373,14 @@ def build_notify_text(session, state):
if on_stop_subject and on_stop_body: if on_stop_subject and on_stop_body:
try: try:
subject_text = on_stop_subject.format(**available_params) subject_text = unicode(on_stop_subject).format(**available_params)
except LookupError, e: except LookupError, e:
logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification subject. Using fallback." % e) logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification subject. Using fallback." % e)
except: except:
logger.error(u"PlexPy Notifier :: Unable to parse custom notification subject. Using fallback.") logger.error(u"PlexPy Notifier :: Unable to parse custom notification subject. Using fallback.")
try: try:
body_text = on_stop_body.format(**available_params) body_text = unicode(on_stop_body).format(**available_params)
except LookupError, e: except LookupError, e:
logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification body. Using fallback." % e) logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification body. Using fallback." % e)
except: except:
@ -397,14 +397,14 @@ def build_notify_text(session, state):
if on_pause_subject and on_pause_body: if on_pause_subject and on_pause_body:
try: try:
subject_text = on_pause_subject.format(**available_params) subject_text = unicode(on_pause_subject).format(**available_params)
except LookupError, e: except LookupError, e:
logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification subject. Using fallback." % e) logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification subject. Using fallback." % e)
except: except:
logger.error(u"PlexPy Notifier :: Unable to parse custom notification subject. Using fallback.") logger.error(u"PlexPy Notifier :: Unable to parse custom notification subject. Using fallback.")
try: try:
body_text = on_pause_body.format(**available_params) body_text = unicode(on_pause_body).format(**available_params)
except LookupError, e: except LookupError, e:
logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification body. Using fallback." % e) logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification body. Using fallback." % e)
except: except:
@ -421,14 +421,14 @@ def build_notify_text(session, state):
if on_resume_subject and on_resume_body: if on_resume_subject and on_resume_body:
try: try:
subject_text = on_resume_subject.format(**available_params) subject_text = unicode(on_resume_subject).format(**available_params)
except LookupError, e: except LookupError, e:
logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification subject. Using fallback." % e) logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification subject. Using fallback." % e)
except: except:
logger.error(u"PlexPy Notifier :: Unable to parse custom notification subject. Using fallback.") logger.error(u"PlexPy Notifier :: Unable to parse custom notification subject. Using fallback.")
try: try:
body_text = on_resume_body.format(**available_params) body_text = unicode(on_resume_body).format(**available_params)
except LookupError, e: except LookupError, e:
logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification body. Using fallback." % e) logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification body. Using fallback." % e)
except: except:
@ -445,14 +445,14 @@ def build_notify_text(session, state):
if on_buffer_subject and on_buffer_body: if on_buffer_subject and on_buffer_body:
try: try:
subject_text = on_buffer_subject.format(**available_params) subject_text = unicode(on_buffer_subject).format(**available_params)
except LookupError, e: except LookupError, e:
logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification subject. Using fallback." % e) logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification subject. Using fallback." % e)
except: except:
logger.error(u"PlexPy Notifier :: Unable to parse custom notification subject. Using fallback.") logger.error(u"PlexPy Notifier :: Unable to parse custom notification subject. Using fallback.")
try: try:
body_text = on_buffer_body.format(**available_params) body_text = unicode(on_buffer_body).format(**available_params)
except LookupError, e: except LookupError, e:
logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification body. Using fallback." % e) logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification body. Using fallback." % e)
except: except:
@ -469,14 +469,14 @@ def build_notify_text(session, state):
if on_watched_subject and on_watched_body: if on_watched_subject and on_watched_body:
try: try:
subject_text = on_watched_subject.format(**available_params) subject_text = unicode(on_watched_subject).format(**available_params)
except LookupError, e: except LookupError, e:
logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification subject. Using fallback." % e) logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification subject. Using fallback." % e)
except: except:
logger.error(u"PlexPy Notifier :: Unable to parse custom notification subject. Using fallback.") logger.error(u"PlexPy Notifier :: Unable to parse custom notification subject. Using fallback.")
try: try:
body_text = on_watched_body.format(**available_params) body_text = unicode(on_watched_body).format(**available_params)
except LookupError, e: except LookupError, e:
logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification body. Using fallback." % e) logger.error(u"PlexPy Notifier :: Unable to parse field %s in notification body. Using fallback." % e)
except: except:

View file

@ -362,6 +362,7 @@ class PmsConnect(object):
'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'),
'summary': helpers.get_xml_attr(metadata_main, 'summary'), 'summary': helpers.get_xml_attr(metadata_main, 'summary'),
'tagline': helpers.get_xml_attr(metadata_main, 'tagline'),
'rating': helpers.get_xml_attr(metadata_main, 'rating'), 'rating': helpers.get_xml_attr(metadata_main, 'rating'),
'duration': helpers.get_xml_attr(metadata_main, 'duration'), 'duration': helpers.get_xml_attr(metadata_main, 'duration'),
'year': helpers.get_xml_attr(metadata_main, 'year'), 'year': helpers.get_xml_attr(metadata_main, 'year'),
@ -393,6 +394,7 @@ class PmsConnect(object):
'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'),
'summary': helpers.get_xml_attr(metadata_main, 'summary'), 'summary': helpers.get_xml_attr(metadata_main, 'summary'),
'tagline': helpers.get_xml_attr(metadata_main, 'tagline'),
'rating': helpers.get_xml_attr(metadata_main, 'rating'), 'rating': helpers.get_xml_attr(metadata_main, 'rating'),
'duration': helpers.get_xml_attr(metadata_main, 'duration'), 'duration': helpers.get_xml_attr(metadata_main, 'duration'),
'year': helpers.get_xml_attr(metadata_main, 'year'), 'year': helpers.get_xml_attr(metadata_main, 'year'),
@ -422,6 +424,7 @@ class PmsConnect(object):
'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'),
'summary': helpers.get_xml_attr(metadata_main, 'summary'), 'summary': helpers.get_xml_attr(metadata_main, 'summary'),
'tagline': helpers.get_xml_attr(metadata_main, 'tagline'),
'rating': helpers.get_xml_attr(metadata_main, 'rating'), 'rating': helpers.get_xml_attr(metadata_main, 'rating'),
'duration': helpers.get_xml_attr(metadata_main, 'duration'), 'duration': helpers.get_xml_attr(metadata_main, 'duration'),
'year': helpers.get_xml_attr(metadata_main, 'year'), 'year': helpers.get_xml_attr(metadata_main, 'year'),
@ -454,6 +457,7 @@ class PmsConnect(object):
'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'),
'summary': show_details['metadata']['summary'], 'summary': show_details['metadata']['summary'],
'tagline': helpers.get_xml_attr(metadata_main, 'tagline'),
'rating': helpers.get_xml_attr(metadata_main, 'rating'), 'rating': helpers.get_xml_attr(metadata_main, 'rating'),
'duration': show_details['metadata']['duration'], 'duration': show_details['metadata']['duration'],
'year': helpers.get_xml_attr(metadata_main, 'year'), 'year': helpers.get_xml_attr(metadata_main, 'year'),
@ -483,6 +487,7 @@ class PmsConnect(object):
'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'),
'summary': helpers.get_xml_attr(metadata_main, 'summary'), 'summary': helpers.get_xml_attr(metadata_main, 'summary'),
'tagline': helpers.get_xml_attr(metadata_main, 'tagline'),
'rating': helpers.get_xml_attr(metadata_main, 'rating'), 'rating': helpers.get_xml_attr(metadata_main, 'rating'),
'duration': helpers.get_xml_attr(metadata_main, 'duration'), 'duration': helpers.get_xml_attr(metadata_main, 'duration'),
'year': helpers.get_xml_attr(metadata_main, 'year'), 'year': helpers.get_xml_attr(metadata_main, 'year'),
@ -573,6 +578,9 @@ class PmsConnect(object):
if session.getElementsByTagName('TranscodeSession'): if session.getElementsByTagName('TranscodeSession'):
transcode_session = session.getElementsByTagName('TranscodeSession')[0] transcode_session = session.getElementsByTagName('TranscodeSession')[0]
throttled = helpers.get_xml_attr(transcode_session, 'throttled')
transcode_progress = helpers.get_xml_attr(transcode_session, 'progress')
transcode_speed = helpers.get_xml_attr(transcode_session, 'speed')
audio_decision = helpers.get_xml_attr(transcode_session, 'audioDecision') audio_decision = helpers.get_xml_attr(transcode_session, 'audioDecision')
transcode_audio_channels = helpers.get_xml_attr(transcode_session, 'audioChannels') transcode_audio_channels = helpers.get_xml_attr(transcode_session, 'audioChannels')
transcode_audio_codec = helpers.get_xml_attr(transcode_session, 'audioCodec') transcode_audio_codec = helpers.get_xml_attr(transcode_session, 'audioCodec')
@ -580,6 +588,9 @@ class PmsConnect(object):
transcode_protocol = helpers.get_xml_attr(transcode_session, 'protocol') transcode_protocol = helpers.get_xml_attr(transcode_session, 'protocol')
duration = helpers.get_xml_attr(transcode_session, 'duration') duration = helpers.get_xml_attr(transcode_session, 'duration')
else: else:
throttled = '0'
transcode_progress = '0'
transcode_speed = ''
transcode_audio_channels = '' transcode_audio_channels = ''
transcode_audio_codec = '' transcode_audio_codec = ''
transcode_container = '' transcode_container = ''
@ -615,6 +626,9 @@ class PmsConnect(object):
'rating_key': helpers.get_xml_attr(session, 'ratingKey'), 'rating_key': helpers.get_xml_attr(session, 'ratingKey'),
'parent_rating_key': helpers.get_xml_attr(session, 'parentRatingKey'), 'parent_rating_key': helpers.get_xml_attr(session, 'parentRatingKey'),
'grandparent_rating_key': helpers.get_xml_attr(session, 'grandparentRatingKey'), 'grandparent_rating_key': helpers.get_xml_attr(session, 'grandparentRatingKey'),
'throttled': throttled,
'transcode_progress': transcode_progress,
'transcode_speed': str(round(helpers.cast_to_float(transcode_speed), 1)),
'audio_decision': audio_decision, 'audio_decision': audio_decision,
'audio_channels': audio_channels, 'audio_channels': audio_channels,
'audio_codec': audio_codec, 'audio_codec': audio_codec,
@ -659,6 +673,9 @@ class PmsConnect(object):
if session.getElementsByTagName('TranscodeSession'): if session.getElementsByTagName('TranscodeSession'):
transcode_session = session.getElementsByTagName('TranscodeSession')[0] transcode_session = session.getElementsByTagName('TranscodeSession')[0]
throttled = helpers.get_xml_attr(transcode_session, 'throttled')
transcode_progress = helpers.get_xml_attr(transcode_session, 'progress')
transcode_speed = helpers.get_xml_attr(transcode_session, 'speed')
audio_decision = helpers.get_xml_attr(transcode_session, 'audioDecision') audio_decision = helpers.get_xml_attr(transcode_session, 'audioDecision')
transcode_audio_channels = helpers.get_xml_attr(transcode_session, 'audioChannels') transcode_audio_channels = helpers.get_xml_attr(transcode_session, 'audioChannels')
transcode_audio_codec = helpers.get_xml_attr(transcode_session, 'audioCodec') transcode_audio_codec = helpers.get_xml_attr(transcode_session, 'audioCodec')
@ -669,6 +686,9 @@ class PmsConnect(object):
transcode_container = helpers.get_xml_attr(transcode_session, 'container') transcode_container = helpers.get_xml_attr(transcode_session, 'container')
transcode_protocol = helpers.get_xml_attr(transcode_session, 'protocol') transcode_protocol = helpers.get_xml_attr(transcode_session, 'protocol')
else: else:
throttled = '0'
transcode_progress = '0'
transcode_speed = ''
transcode_audio_channels = '' transcode_audio_channels = ''
transcode_audio_codec = '' transcode_audio_codec = ''
transcode_video_codec = '' transcode_video_codec = ''
@ -726,6 +746,9 @@ class PmsConnect(object):
'rating_key': helpers.get_xml_attr(session, 'ratingKey'), 'rating_key': helpers.get_xml_attr(session, 'ratingKey'),
'parent_rating_key': helpers.get_xml_attr(session, 'parentRatingKey'), 'parent_rating_key': helpers.get_xml_attr(session, 'parentRatingKey'),
'grandparent_rating_key': helpers.get_xml_attr(session, 'grandparentRatingKey'), 'grandparent_rating_key': helpers.get_xml_attr(session, 'grandparentRatingKey'),
'throttled': throttled,
'transcode_progress': transcode_progress,
'transcode_speed': str(round(helpers.cast_to_float(transcode_speed), 1)),
'audio_decision': audio_decision, 'audio_decision': audio_decision,
'audio_channels': audio_channels, 'audio_channels': audio_channels,
'audio_codec': audio_codec, 'audio_codec': audio_codec,
@ -779,6 +802,9 @@ class PmsConnect(object):
'rating_key': helpers.get_xml_attr(session, 'ratingKey'), 'rating_key': helpers.get_xml_attr(session, 'ratingKey'),
'parent_rating_key': helpers.get_xml_attr(session, 'parentRatingKey'), 'parent_rating_key': helpers.get_xml_attr(session, 'parentRatingKey'),
'grandparent_rating_key': helpers.get_xml_attr(session, 'grandparentRatingKey'), 'grandparent_rating_key': helpers.get_xml_attr(session, 'grandparentRatingKey'),
'throttled': throttled,
'transcode_progress': transcode_progress,
'transcode_speed': str(round(helpers.cast_to_float(transcode_speed), 1)),
'audio_decision': audio_decision, 'audio_decision': audio_decision,
'audio_channels': audio_channels, 'audio_channels': audio_channels,
'audio_codec': audio_codec, 'audio_codec': audio_codec,
@ -832,6 +858,9 @@ class PmsConnect(object):
'rating_key': helpers.get_xml_attr(session, 'ratingKey'), 'rating_key': helpers.get_xml_attr(session, 'ratingKey'),
'parent_rating_key': helpers.get_xml_attr(session, 'parentRatingKey'), 'parent_rating_key': helpers.get_xml_attr(session, 'parentRatingKey'),
'grandparent_rating_key': helpers.get_xml_attr(session, 'grandparentRatingKey'), 'grandparent_rating_key': helpers.get_xml_attr(session, 'grandparentRatingKey'),
'throttled': throttled,
'transcode_progress': transcode_progress,
'transcode_speed': str(round(helpers.cast_to_float(transcode_speed), 1)),
'audio_decision': audio_decision, 'audio_decision': audio_decision,
'audio_channels': audio_channels, 'audio_channels': audio_channels,
'audio_codec': audio_codec, 'audio_codec': audio_codec,

View file

@ -1,2 +1,2 @@
PLEXPY_VERSION = "master" PLEXPY_VERSION = "master"
PLEXPY_RELEASE_VERSION = "1.1.6" PLEXPY_RELEASE_VERSION = "1.1.7"