mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-08-22 06:13:25 -07:00
Merge branch 'nightly' of https://github.com/Tautulli/Tautulli
This commit is contained in:
commit
b536593fc1
12 changed files with 133 additions and 64 deletions
14
CHANGELOG.md
14
CHANGELOG.md
|
@ -1,5 +1,19 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## v2.13.2 (2023-10-26)
|
||||||
|
* History:
|
||||||
|
* New: Added quarter values icons for history watch status. (#2179, #2156) (Thanks @herby2212)
|
||||||
|
* Graphs:
|
||||||
|
* New: Added concurrent streams per day graph. (#2046) (Thanks @herby2212)
|
||||||
|
* Exporter:
|
||||||
|
* New: Added metadata directory to exporter fields.
|
||||||
|
* Removed: Banner exporter fields for tv shows.
|
||||||
|
* UI:
|
||||||
|
* New: Added last triggered time to notification agents and newsletter agent lists.
|
||||||
|
* Other:
|
||||||
|
* New: Added X-Plex-Language header override to config file.
|
||||||
|
|
||||||
|
|
||||||
## v2.13.1 (2023-08-25)
|
## v2.13.1 (2023-08-25)
|
||||||
* Notes:
|
* Notes:
|
||||||
* Support for Python 3.7 has been dropped. The minimum Python version is now 3.8.
|
* Support for Python 3.7 has been dropped. The minimum Python version is now 3.8.
|
||||||
|
|
|
@ -11,6 +11,7 @@ DOCUMENTATION :: END
|
||||||
|
|
||||||
<%!
|
<%!
|
||||||
import os
|
import os
|
||||||
|
import sqlite3
|
||||||
import sys
|
import sys
|
||||||
import plexpy
|
import plexpy
|
||||||
from plexpy import common, logger
|
from plexpy import common, logger
|
||||||
|
@ -71,10 +72,18 @@ DOCUMENTATION :: END
|
||||||
<td>System Timezone:</td>
|
<td>System Timezone:</td>
|
||||||
<td>${str(plexpy.SYS_TIMEZONE)} (${'UTC{}'.format(plexpy.SYS_UTC_OFFSET)})
|
<td>${str(plexpy.SYS_TIMEZONE)} (${'UTC{}'.format(plexpy.SYS_UTC_OFFSET)})
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>System Language:</td>
|
||||||
|
<td>${plexpy.SYS_LANGUAGE + (' (override {})'.format(plexpy.CONFIG.PMS_LANGUAGE) if plexpy.CONFIG.PMS_LANGUAGE else '')}</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Python Version:</td>
|
<td>Python Version:</td>
|
||||||
<td>${sys.version}</td>
|
<td>${sys.version}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>SQLite Version:</td>
|
||||||
|
<td>${sqlite3.sqlite_version}</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="top-line">Resources:</td>
|
<td class="top-line">Resources:</td>
|
||||||
<td class="top-line">
|
<td class="top-line">
|
||||||
|
|
|
@ -2854,6 +2854,30 @@ a .home-platforms-list-cover-face:hover
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
max-width: 350px;
|
max-width: 350px;
|
||||||
}
|
}
|
||||||
|
.circle {
|
||||||
|
width: 1.55rem;
|
||||||
|
height: 1.55rem;
|
||||||
|
border-radius: 50%;
|
||||||
|
border: 0.2rem solid #eeeeee;
|
||||||
|
}
|
||||||
|
.circle-quarter {
|
||||||
|
background-image:
|
||||||
|
linear-gradient(00deg, #2b2b2b 50%, transparent 50%),
|
||||||
|
linear-gradient(270deg, #eeeeee 50%, transparent 50%);
|
||||||
|
}
|
||||||
|
.circle-half {
|
||||||
|
background-image:
|
||||||
|
linear-gradient(90deg, #2b2b2b 50%, transparent 50%),
|
||||||
|
linear-gradient(-90deg, #eeeeee 50%, transparent 50%);
|
||||||
|
}
|
||||||
|
.circle-three-quarter {
|
||||||
|
background-image:
|
||||||
|
linear-gradient(180deg, transparent 50%, #eeeeee 50%),
|
||||||
|
linear-gradient(-90deg, #eeeeee 50%, transparent 50%);
|
||||||
|
}
|
||||||
|
.circle-full {
|
||||||
|
background: #eeeeee;
|
||||||
|
}
|
||||||
#graph-tabs {
|
#graph-tabs {
|
||||||
padding-bottom: 10px;
|
padding-bottom: 10px;
|
||||||
float: none;
|
float: none;
|
||||||
|
|
|
@ -137,7 +137,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row" id="concurrent-graph">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<h4><i class="fa fa-video-camera"></i> Daily concurrent stream count</span> by stream type <small>Last <span class="days">30</span> days</small></h4>
|
<h4><i class="fa fa-video-camera"></i> Daily concurrent stream count</span> by stream type <small>Last <span class="days">30</span> days</small></h4>
|
||||||
<p class="help-block">
|
<p class="help-block">
|
||||||
|
@ -372,6 +372,10 @@
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (window.location.hash === '#concurrent-graph') {
|
||||||
|
current_tab = '#tabs-stream';
|
||||||
|
}
|
||||||
|
|
||||||
$('#yaxis-' + yaxis).prop('checked', true);
|
$('#yaxis-' + yaxis).prop('checked', true);
|
||||||
$('#yaxis-' + yaxis).closest('label').addClass('active');
|
$('#yaxis-' + yaxis).closest('label').addClass('active');
|
||||||
$('#graph-days').val(current_day_range);
|
$('#graph-days').val(current_day_range);
|
||||||
|
@ -639,7 +643,7 @@
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#nav-tabs-2').tab('show');
|
$('#nav-tabs-stream').tab('show');
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadGraphsTab3(time_range, yaxis) {
|
function loadGraphsTab3(time_range, yaxis) {
|
||||||
|
|
|
@ -177,7 +177,9 @@ DOCUMENTATION :: END
|
||||||
% elif stat_id == 'top_platforms':
|
% elif stat_id == 'top_platforms':
|
||||||
${row['platform']}
|
${row['platform']}
|
||||||
% elif stat_id == 'most_concurrent':
|
% elif stat_id == 'most_concurrent':
|
||||||
|
<a href="graphs#concurrent-graph" title="${row['title']}">
|
||||||
${row['title']}
|
${row['title']}
|
||||||
|
</a>
|
||||||
% endif
|
% endif
|
||||||
</div>
|
</div>
|
||||||
<div class="sub-count">
|
<div class="sub-count">
|
||||||
|
|
|
@ -263,13 +263,17 @@ history_table_options = {
|
||||||
"targets": [12],
|
"targets": [12],
|
||||||
"data": "watched_status",
|
"data": "watched_status",
|
||||||
"createdCell": function (td, cellData, rowData, row, col) {
|
"createdCell": function (td, cellData, rowData, row, col) {
|
||||||
|
var circleValue = "";
|
||||||
if (cellData == 1) {
|
if (cellData == 1) {
|
||||||
$(td).html('<span class="watched-tooltip" data-toggle="tooltip" title="' + rowData['percent_complete'] + '%"><i class="fa fa-lg fa-circle"></i></span>');
|
circleValue = " circle-full";
|
||||||
|
} else if (cellData == 0.75) {
|
||||||
|
circleValue = " circle-three-quarter";
|
||||||
} else if (cellData == 0.5) {
|
} else if (cellData == 0.5) {
|
||||||
$(td).html('<span class="watched-tooltip" data-toggle="tooltip" title="' + rowData['percent_complete'] + '%"><i class="fa fa-lg fa-adjust fa-rotate-180"></i></span>');
|
circleValue = " circle-half";
|
||||||
} else {
|
} else if (cellData == 0.25) {
|
||||||
$(td).html('<span class="watched-tooltip" data-toggle="tooltip" title="' + rowData['percent_complete'] + '%"><i class="fa fa-lg fa-circle-o"></i></span>');
|
circleValue = " circle-quarter";
|
||||||
}
|
}
|
||||||
|
$(td).html('<span class="watched-tooltip" data-toggle="tooltip" title="' + rowData['percent_complete'] + '%"><div class="circle' + circleValue + '" /></span>');
|
||||||
},
|
},
|
||||||
"searchable": false,
|
"searchable": false,
|
||||||
"orderable": false,
|
"orderable": false,
|
||||||
|
|
|
@ -236,6 +236,9 @@ def initialize(config_file):
|
||||||
logger.info("{} (UTC{})".format(
|
logger.info("{} (UTC{})".format(
|
||||||
str(SYS_TIMEZONE), SYS_UTC_OFFSET
|
str(SYS_TIMEZONE), SYS_UTC_OFFSET
|
||||||
))
|
))
|
||||||
|
logger.info("Language {}{} / Encoding {}".format(
|
||||||
|
SYS_LANGUAGE, f' (override {CONFIG.PMS_LANGUAGE})' if CONFIG.PMS_LANGUAGE else '', SYS_ENCODING
|
||||||
|
))
|
||||||
logger.info("Python {}".format(
|
logger.info("Python {}".format(
|
||||||
sys.version.replace('\n', '')
|
sys.version.replace('\n', '')
|
||||||
))
|
))
|
||||||
|
|
|
@ -311,7 +311,9 @@ class ActivityHandler(object):
|
||||||
last_state = self.db_session['state']
|
last_state = self.db_session['state']
|
||||||
last_rating_key = str(self.db_session['rating_key'])
|
last_rating_key = str(self.db_session['rating_key'])
|
||||||
last_live_uuid = self.db_session['live_uuid']
|
last_live_uuid = self.db_session['live_uuid']
|
||||||
last_transcode_key = self.db_session['transcode_key'].split('/')[-1]
|
last_transcode_key = self.db_session['transcode_key']
|
||||||
|
if isinstance(last_transcode_key, str):
|
||||||
|
last_transcode_key = last_transcode_key.split('/')[-1]
|
||||||
last_paused = self.db_session['last_paused']
|
last_paused = self.db_session['last_paused']
|
||||||
last_rating_key_websocket = self.db_session['rating_key_websocket']
|
last_rating_key_websocket = self.db_session['rating_key_websocket']
|
||||||
last_guid = self.db_session['guid']
|
last_guid = self.db_session['guid']
|
||||||
|
|
|
@ -55,6 +55,7 @@ _CONFIG_DEFINITIONS = {
|
||||||
'PMS_IP': (str, 'PMS', '127.0.0.1'),
|
'PMS_IP': (str, 'PMS', '127.0.0.1'),
|
||||||
'PMS_IS_CLOUD': (int, 'PMS', 0),
|
'PMS_IS_CLOUD': (int, 'PMS', 0),
|
||||||
'PMS_IS_REMOTE': (int, 'PMS', 0),
|
'PMS_IS_REMOTE': (int, 'PMS', 0),
|
||||||
|
'PMS_LANGUAGE': (str, 'PMS', ''),
|
||||||
'PMS_LOGS_FOLDER': (str, 'PMS', ''),
|
'PMS_LOGS_FOLDER': (str, 'PMS', ''),
|
||||||
'PMS_LOGS_LINE_CAP': (int, 'PMS', 1000),
|
'PMS_LOGS_LINE_CAP': (int, 'PMS', 1000),
|
||||||
'PMS_NAME': (str, 'PMS', ''),
|
'PMS_NAME': (str, 'PMS', ''),
|
||||||
|
|
|
@ -283,13 +283,19 @@ class DataFactory(object):
|
||||||
if item['live']:
|
if item['live']:
|
||||||
item['percent_complete'] = 100
|
item['percent_complete'] = 100
|
||||||
|
|
||||||
|
base_watched_value = watched_percent[item['media_type']] / 4.0
|
||||||
|
|
||||||
if helpers.check_watched(
|
if helpers.check_watched(
|
||||||
item['media_type'], item['view_offset'], item['duration'],
|
item['media_type'], item['view_offset'], item['duration'],
|
||||||
item['marker_credits_first'], item['marker_credits_final']
|
item['marker_credits_first'], item['marker_credits_final']
|
||||||
):
|
):
|
||||||
watched_status = 1
|
watched_status = 1
|
||||||
elif item['percent_complete'] >= watched_percent[item['media_type']] / 2.0:
|
elif item['percent_complete'] >= base_watched_value * 3.0:
|
||||||
watched_status = 0.5
|
watched_status = 0.75
|
||||||
|
elif item['percent_complete'] >= base_watched_value * 2.0:
|
||||||
|
watched_status = 0.50
|
||||||
|
elif item['percent_complete'] >= base_watched_value:
|
||||||
|
watched_status = 0.25
|
||||||
else:
|
else:
|
||||||
watched_status = 0
|
watched_status = 0
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ class HTTPHandler(object):
|
||||||
plexpy.common.PLATFORM_RELEASE),
|
plexpy.common.PLATFORM_RELEASE),
|
||||||
'X-Plex-Device-Name': '{} ({})'.format(plexpy.common.PLATFORM_DEVICE_NAME,
|
'X-Plex-Device-Name': '{} ({})'.format(plexpy.common.PLATFORM_DEVICE_NAME,
|
||||||
plexpy.common.PRODUCT),
|
plexpy.common.PRODUCT),
|
||||||
'Accept-Language': plexpy.SYS_LANGUAGE
|
'X-Plex-Language': plexpy.CONFIG.PMS_LANGUAGE or plexpy.SYS_LANGUAGE
|
||||||
}
|
}
|
||||||
|
|
||||||
self.token = token
|
self.token = token
|
||||||
|
|
|
@ -18,4 +18,4 @@
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
PLEXPY_BRANCH = "master"
|
PLEXPY_BRANCH = "master"
|
||||||
PLEXPY_RELEASE_VERSION = "v2.13.1"
|
PLEXPY_RELEASE_VERSION = "v2.13.2"
|
Loading…
Add table
Add a link
Reference in a new issue