diff --git a/CHANGELOG.md b/CHANGELOG.md index 457cbf1c..75461af4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,15 @@ # Changelog -## v1.0 (2015-08-11) +## v1.1.2 (2015-08-16) -* First release +* Fix bug where user refresh would fail under certain circumstances. -## v1.0.1 (2015-08-13) +## v1.1.1 (2015-08-15) -* Allow SSL certificate check override for certain systems with bad CA stores. -* Fix typo on graphs page causing date selection to break on Safari. +* Added Most watched movie for home stats. Thanks @jroyal. +* Added TV show title to recently added text. Thanks @jroyal. +* Fix bug with buffer warnings where notification would trigger continuously after first trigger. +* Fix bug where custom avatar URL would get reset on every user refresh. ## v1.1.0 (2015-08-15) @@ -24,13 +26,11 @@ * Fix behaviour of close button on update popup, will now stay closed for an hour after clicking close. * Fix some styling niggles. -## v1.1.1 (2015-08-15) +## v1.0.1 (2015-08-13) -* Added Most watched movie for home stats. Thanks @jroyal. -* Added TV show title to recently added text. Thanks @jroyal. -* Fix bug with buffer warnings where notification would trigger continuously after first trigger. -* Fix bug where custom avatar URL would get reset on every user refresh. +* Allow SSL certificate check override for certain systems with bad CA stores. +* Fix typo on graphs page causing date selection to break on Safari. -## v1.1.2 (2015-08-16) +## v1.0 (2015-08-11) -* Fix bug where user refresh would fail under certain circumstances. \ No newline at end of file +* First release \ No newline at end of file diff --git a/README.md b/README.md index 4370d213..e6839cbd 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This project is based on code from Headphones (https://github.com/rembo10/headph * plexPy forum thread: https://forums.plex.tv/discussion/169591/plexpy-another-plex-monitoring-program -If you'd like to buy me a beer, hit the donate button below. +If you'd like to buy me a beer, hit the donate button below. All donations go to the project maintainer (primarily for the procurement of liquid refreshment). [![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=G9HZK9BDJLKT6) @@ -34,6 +34,14 @@ If you'd like to buy me a beer, hit the donate button below. * stream type (direct, transcoded) * video type & resolution * audio type & channel count. + +* Top statistics on home page with configurable duration and measurement metric: + * Most watched TV + * Most popular TV + * Most watched Movie + * Most popular Movie + * Most active user + * Most active platform * Recently added media and how long ago it was added @@ -41,42 +49,49 @@ If you'd like to buy me a beer, hit the donate button below. * date * user * platform - * ip address (if enabled in plexWatch) + * ip address * title * stream information details * start time * paused duration length * stop time * duration length - * percentage completed + * watched progress + * show/hide columns + * delete mode - allows deletion of specific history items * Full user list with general information and comparison stats * Individual user information - - username and gravatar (if available) - - daily, weekly, monthly, all time stats for play count and duration length - - individual platform stats for each user - - public ip address history with last seen date and geo tag location - - recently watched content - - watching history - - synced items + * username and gravatar (if available) + * daily, weekly, monthly, all time stats for play count and duration length + * individual platform stats for each user + * public ip address history with last seen date and geo tag location + * recently watched content + * watching history + * synced items + * assign users custom friendly names within PlexPy + * assign users custom avatar URL within PlexPy + * disable history logging per user + * disable notifications per user + * option to purge all history per user. * Rich analytics presented using Highcharts graphing - - user-selectable time periods of 30, 90 or 365 days - - daily watch count and duration - - totals by day of week and hours of the day - - totals by top 10 platform - - totals by top 10 users - - detailed breakdown by transcode decision - - source and stream resolutions - - transcode decision counts by user and platform - - total monthly counts + * user-selectable time periods of 30, 90 or 365 days + * daily watch count and duration + * totals by day of week and hours of the day + * totals by top 10 platform + * totals by top 10 users + * detailed breakdown by transcode decision + * source and stream resolutions + * transcode decision counts by user and platform + * total monthly counts * Content information pages - - movies (includes watching history) - - tv shows (includes watching history) - - tv seasons - - tv episodes (includes watching history) + * movies (includes watching history) + * tv shows (includes watching history) + * tv seasons + * tv episodes (includes watching history) * Full sync list data on all users syncing items from your library diff --git a/data/interfaces/default/css/dataTables.colVis.css b/data/interfaces/default/css/dataTables.colVis.css index 7998bb4d..10d62649 100644 --- a/data/interfaces/default/css/dataTables.colVis.css +++ b/data/interfaces/default/css/dataTables.colVis.css @@ -75,6 +75,7 @@ ul.ColVis_collection { background-color: #444; overflow: hidden; z-index: 2002; + border-radius: 4px; } ul.ColVis_collection li { diff --git a/data/interfaces/default/css/plexpy.css b/data/interfaces/default/css/plexpy.css index da015f42..4d9bef17 100644 --- a/data/interfaces/default/css/plexpy.css +++ b/data/interfaces/default/css/plexpy.css @@ -253,13 +253,7 @@ fieldset[disabled] .btn-bright.active { .modal-body table { color: #999; } -.modal-body ul { - list-style: none; - -webkit-padding-start: 0px; - margin: 0; -} .modal-body li { - list-style: none; margin-top: 7px; margin-left: 4px; color: #aaa; @@ -270,6 +264,9 @@ fieldset[disabled] .btn-bright.active { .modal-body i { color: #F9AA03; } +.modal-body i.fa { + color: #fff; +} .modal-body strong { color: #F9AA03; } @@ -407,39 +404,31 @@ input[type="color"], } .poster { float: left; - min-height: 232px; - min-width: 155px; + min-height: 225px; + min-width: 150px; + margin-bottom: 8px; position: relative; } -.poster-face img { - bottom: 0; - overflow: hidden; +.poster-face { + background-position: center; + background-size: cover; height: 225px; - width: 153px; + width: 150px; + position: relative; + 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); + box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1); +} +.cover-face { + background-position: center; + background-size: cover; + height: 150px; + width: 150px; position: absolute; - bottom: 5px; - left: 0; - border: 1px solid rgba(128, 128, 128, 0.3); -} -.poster-face img:hover { - webkit-box-shadow: 0 0 0 2px #e9a049; - -moz-box-shadow: 0 0 0 2px #e9a049; - box-shadow: 0 0 0 2px #e9a049; -} -.cover-face img { bottom: 0; - overflow: hidden; - height: 153px; - width: 153px; - border: 1px solid rgba(128, 128, 128, 0.3); - position: absolute; - bottom: 5px; - left: 0; -} -.cover-face img:hover { - webkit-box-shadow: 0 0 0 2px #e9a049; - -moz-box-shadow: 0 0 0 2px #e9a049; - box-shadow: 0 0 0 2px #e9a049; + 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); + box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1); } .users-poster-face img { bottom: 0; @@ -630,6 +619,11 @@ input[type="color"], } .dashboard-recent-media-instance { } +.dashboard-recent-media-instance a:hover .poster-face { + webkit-box-shadow: inset 0 0 0 2px #e9a049; + -moz-box-shadow: inset 0 0 0 2px #e9a049; + box-shadow: inset 0 0 0 2px #e9a049; +} .dashboard-recent-media li { margin-right: 27px; position: relative; @@ -650,13 +644,14 @@ input[type="color"], font-size: 13px; margin: 0; line-height: 15px; - font-weight: bold; + font-weight: normal; width: 153px; white-space: nowrap; text-align: center; clear: both; } -.dashboard-recent-media-metacontainer text-muted { +.dashboard-recent-media-metacontainer .text-muted { + padding-top: 5px; text-overflow: ellipsis; overflow: hidden; position: relative; @@ -1160,7 +1155,7 @@ input[type="color"], position: relative; font-size: 13px; line-height: 15px; - font-weight: bold; + font-weight: normal; width: 140px; margin-left: 10px; } diff --git a/data/interfaces/default/edit_user.html b/data/interfaces/default/edit_user.html index 37aba8bb..cb1a5775 100644 --- a/data/interfaces/default/edit_user.html +++ b/data/interfaces/default/edit_user.html @@ -58,6 +58,12 @@ DOCUMENTATION :: END

Uncheck this if you do not want this keep any history on this user's activity.

+ % if data['user_id']: +
+ +

DANGER ZONE! Click the purge button to remove all history logged for this user. This is permanent!

+
+ % endif
+ % if a['stat_type'] == 'total_plays':

${a['rows'][0]['total_plays']}

plays

+ % else: + ${a['rows'][0]['total_duration'] | hd} + % endif
@@ -113,8 +135,37 @@ DOCUMENTATION :: END
+ % if a['stat_type'] == 'total_plays':

${a['rows'][0]['total_plays']}

plays

+ % else: + ${a['rows'][0]['total_duration'] | hd} + % endif +
+ + + % elif a['stat_id'] == 'popular_movies' and a['rows']: +
+
  • + + + % if a['rows'][0]['thumb']: + + % else: + + % endif + + +
    +

    Most Popular Movie

    +
    + ${a['rows'][0]['title']} +
    +
    +
    +

    ${a['rows'][0]['users_watched']}

    +

    users

  • @@ -149,8 +200,12 @@ DOCUMENTATION :: END
    + % if a['stat_type'] == 'total_plays':

    ${a['rows'][0]['total_plays']}

    plays

    + % else: + ${a['rows'][0]['total_duration'] | hd} + % endif
    @@ -165,8 +220,12 @@ DOCUMENTATION :: END
    ${a['rows'][0]['platform_type']}
    + % if a['stat_type'] == 'total_plays':

    ${a['rows'][0]['total_plays']}

    plays

    + % else: + ${a['rows'][0]['total_duration'] | hd} + % endif
    diff --git a/data/interfaces/default/index.html b/data/interfaces/default/index.html index b78bc0cb..5af438ef 100644 --- a/data/interfaces/default/index.html +++ b/data/interfaces/default/index.html @@ -45,12 +45,12 @@ diff --git a/data/interfaces/default/info.html b/data/interfaces/default/info.html index 79798f3f..1f45fe4d 100644 --- a/data/interfaces/default/info.html +++ b/data/interfaces/default/info.html @@ -173,6 +173,7 @@ DOCUMENTATION :: END + @@ -182,7 +183,7 @@ DOCUMENTATION :: END - + @@ -254,9 +255,8 @@ DOCUMENTATION :: END } } history_table = $('#history_table').DataTable(history_table_options); - history_table.column(4).visible(false); - var colvis = new $.fn.dataTable.ColVis(history_table, { buttonText: 'Select columns', buttonClass: 'btn btn-dark' }); + var colvis = new $.fn.dataTable.ColVis(history_table, { buttonText: ' Select columns', buttonClass: 'btn btn-dark', exclude: [0, 10] }); $(colvis.button()).appendTo('div.colvis-button-bar'); }); @@ -274,7 +274,7 @@ DOCUMENTATION :: END } } history_table = $('#history_table').DataTable(history_table_options); - var colvis = new $.fn.dataTable.ColVis(history_table, { buttonText: 'Select columns', buttonClass: 'btn btn-dark' }); + var colvis = new $.fn.dataTable.ColVis(history_table, { buttonText: ' Select columns', buttonClass: 'btn btn-dark', exclude: [0, 10] }); $(colvis.button()).appendTo('div.colvis-button-bar'); }); diff --git a/data/interfaces/default/ip_address_modal.html b/data/interfaces/default/ip_address_modal.html index 4c4bc22e..d05eec64 100644 --- a/data/interfaces/default/ip_address_modal.html +++ b/data/interfaces/default/ip_address_modal.html @@ -15,7 +15,7 @@
    Delete Time User PlatformPaused Stopped DurationWatched
    - @@ -156,13 +154,17 @@ from plexpy import helpers ${data['friendly_name']} -
    + @@ -172,7 +174,7 @@ from plexpy import helpers - + @@ -222,6 +224,8 @@ from plexpy import helpers + @@ -289,9 +293,9 @@ from plexpy import helpers } } history_table = $('#history_table').DataTable(history_table_options); - history_table.column(1).visible(false); + history_table.column(2).visible(false); - var colvis = new $.fn.dataTable.ColVis(history_table, { buttonText: 'Select columns', buttonClass: 'btn btn-dark' }); + var colvis = new $.fn.dataTable.ColVis(history_table, { buttonText: ' Select columns', buttonClass: 'btn btn-dark', exclude: [0, 10] }); $(colvis.button()).appendTo('#button-bar-history'); }); @@ -322,7 +326,7 @@ from plexpy import helpers sync_table = $('#sync_table').DataTable(sync_table_options); history_table.column(1).visible(false); - var colvis_sync = new $.fn.dataTable.ColVis( sync_table, { buttonText: 'Select columns', buttonClass: 'btn btn-dark' } ); + var colvis_sync = new $.fn.dataTable.ColVis( sync_table, { buttonText: ' Select columns', buttonClass: 'btn btn-dark' } ); $( colvis_sync.button() ).appendTo('#button-bar-sync'); }); @@ -339,6 +343,19 @@ from plexpy import helpers } }); }); + + // Delete mode button + $('#row-edit-mode').click(function() { + if ($(this).hasClass('active')) { + $('.delete-control').each(function() { + $(this).addClass('hidden'); + }); + } else { + $('.delete-control').each(function() { + $(this).removeClass('hidden'); + }); + } + }); }); diff --git a/data/interfaces/default/user_recently_watched.html b/data/interfaces/default/user_recently_watched.html index b3107557..2cf7b57c 100644 --- a/data/interfaces/default/user_recently_watched.html +++ b/data/interfaces/default/user_recently_watched.html @@ -18,6 +18,7 @@ time Returns the last watched time of the media. title Returns the name of the movie or episode. == Only if 'type' is 'episode == +parent_title Returns the name of the TV Show a season belongs too. parent_index Returns the season number. index Returns the episode number. @@ -33,21 +34,22 @@ DOCUMENTATION :: END % for item in data:
  • -
  • Delete Time User PlatformPaused Stopped DurationWatched