Compare commits
4 Commits
v2.1.30-be
...
v2.1.31-be
Author | SHA1 | Date | |
---|---|---|---|
![]() |
3b22b6a3f7 | ||
![]() |
e4be5a716f | ||
![]() |
13579b8140 | ||
![]() |
b11437b86b |
@@ -1,5 +1,14 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## v2.1.31-beta (2019-06-13)
|
||||||
|
|
||||||
|
* Monitoring:
|
||||||
|
* Fix: Synced content showing incorrect stream info.
|
||||||
|
* Other:
|
||||||
|
* Fix: Unable to view database status when authentication is enabled.
|
||||||
|
* Change: Default database synchronous mode changed to prevent database corruption. Database response may be slower.
|
||||||
|
|
||||||
|
|
||||||
## v2.1.30-beta (2019-05-11)
|
## v2.1.30-beta (2019-05-11)
|
||||||
|
|
||||||
* Monitoring:
|
* Monitoring:
|
||||||
|
@@ -218,7 +218,7 @@ DOCUMENTATION :: END
|
|||||||
% if data['stream_container_decision'] == 'transcode':
|
% if data['stream_container_decision'] == 'transcode':
|
||||||
Transcode (${data['container'].upper()} <i class="fa fa-long-arrow-right"></i> ${data['stream_container'].upper()})
|
Transcode (${data['container'].upper()} <i class="fa fa-long-arrow-right"></i> ${data['stream_container'].upper()})
|
||||||
% else:
|
% else:
|
||||||
Direct Play (${data['container'].upper()})
|
Direct Play (${data['stream_container'].upper()})
|
||||||
% endif
|
% endif
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
@@ -236,7 +236,7 @@ DOCUMENTATION :: END
|
|||||||
% elif data['stream_video_decision'] == 'copy':
|
% elif data['stream_video_decision'] == 'copy':
|
||||||
Direct Stream (${data['stream_video_codec'].upper()} ${VIDEO_RESOLUTION_OVERRIDES.get(data['stream_video_resolution'], data['stream_video_resolution'])})
|
Direct Stream (${data['stream_video_codec'].upper()} ${VIDEO_RESOLUTION_OVERRIDES.get(data['stream_video_resolution'], data['stream_video_resolution'])})
|
||||||
% else:
|
% else:
|
||||||
Direct Play (${data['video_codec'].upper()} ${VIDEO_RESOLUTION_OVERRIDES.get(data['video_resolution'], data['video_resolution'])})
|
Direct Play (${data['stream_video_codec'].upper()} ${VIDEO_RESOLUTION_OVERRIDES.get(data['stream_video_resolution'], data['stream_video_resolution'])})
|
||||||
% endif
|
% endif
|
||||||
% elif data['media_type'] == 'photo':
|
% elif data['media_type'] == 'photo':
|
||||||
Direct Play (${data['width']}x${data['height']})
|
Direct Play (${data['width']}x${data['height']})
|
||||||
@@ -253,7 +253,7 @@ DOCUMENTATION :: END
|
|||||||
% elif data['stream_audio_decision'] == 'copy':
|
% elif data['stream_audio_decision'] == 'copy':
|
||||||
Direct Stream (${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
|
Direct Stream (${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
|
||||||
% else:
|
% else:
|
||||||
Direct Play (${AUDIO_CODEC_OVERRIDES.get(data['audio_codec'], data['audio_codec'].upper())} ${data['audio_channel_layout'].split('(')[0].capitalize()})
|
Direct Play (${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
|
||||||
% endif
|
% endif
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
@@ -270,7 +270,7 @@ DOCUMENTATION :: END
|
|||||||
% elif data['stream_subtitle_decision'] == 'burn':
|
% elif data['stream_subtitle_decision'] == 'burn':
|
||||||
Burn (${data['subtitle_codec'].upper()})
|
Burn (${data['subtitle_codec'].upper()})
|
||||||
% else:
|
% else:
|
||||||
Direct Play (${data['stream_subtitle_codec'].upper() if data['synced_version'] else data['subtitle_codec'].upper()})
|
Direct Play (${data['subtitle_codec'].upper() if data['synced_version'] else data['stream_subtitle_codec'].upper()})
|
||||||
% endif
|
% endif
|
||||||
% else:
|
% else:
|
||||||
None
|
None
|
||||||
|
@@ -430,7 +430,7 @@
|
|||||||
if (s.stream_container_decision === 'transcode') {
|
if (s.stream_container_decision === 'transcode') {
|
||||||
transcode_container = 'Transcode (' + s.container.toUpperCase() + ' <i class="fa fa-long-arrow-right"></i> ' + s.stream_container.toUpperCase() + ')';
|
transcode_container = 'Transcode (' + s.container.toUpperCase() + ' <i class="fa fa-long-arrow-right"></i> ' + s.stream_container.toUpperCase() + ')';
|
||||||
} else {
|
} else {
|
||||||
transcode_container = 'Direct Play (' + s.container.toUpperCase() + ')';
|
transcode_container = 'Direct Play (' + s.stream_container.toUpperCase() + ')';
|
||||||
}
|
}
|
||||||
$('#transcode_container-' + key).html(transcode_container);
|
$('#transcode_container-' + key).html(transcode_container);
|
||||||
|
|
||||||
@@ -465,7 +465,7 @@
|
|||||||
} else if (s.stream_video_decision === 'copy') {
|
} else if (s.stream_video_decision === 'copy') {
|
||||||
video_decision = 'Direct Stream (' + s.stream_video_codec.toUpperCase() + ' ' + sv_res + ')';
|
video_decision = 'Direct Stream (' + s.stream_video_codec.toUpperCase() + ' ' + sv_res + ')';
|
||||||
} else {
|
} else {
|
||||||
video_decision = 'Direct Play (' + s.video_codec.toUpperCase() + ' ' + v_res + ')';
|
video_decision = 'Direct Play (' + s.stream_video_codec.toUpperCase() + ' ' + sv_res + ')';
|
||||||
}
|
}
|
||||||
} else if (s.media_type === 'photo') {
|
} else if (s.media_type === 'photo') {
|
||||||
video_decision = 'Direct Play (' + s.width + 'x' + s.height + ')';
|
video_decision = 'Direct Play (' + s.width + 'x' + s.height + ')';
|
||||||
@@ -481,7 +481,7 @@
|
|||||||
} else if (s.stream_audio_decision === 'copy') {
|
} else if (s.stream_audio_decision === 'copy') {
|
||||||
audio_decision = 'Direct Stream (' + sa_codec + ' ' + capitalizeFirstLetter(s.stream_audio_channel_layout.split('(')[0]) + ')';
|
audio_decision = 'Direct Stream (' + sa_codec + ' ' + capitalizeFirstLetter(s.stream_audio_channel_layout.split('(')[0]) + ')';
|
||||||
} else {
|
} else {
|
||||||
audio_decision = 'Direct Play (' + a_codec + ' ' + capitalizeFirstLetter(s.audio_channel_layout.split('(')[0]) + ')';
|
audio_decision = 'Direct Play (' + sa_codec + ' ' + capitalizeFirstLetter(s.stream_audio_channel_layout.split('(')[0]) + ')';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$('#audio_decision-' + key).html(audio_decision);
|
$('#audio_decision-' + key).html(audio_decision);
|
||||||
@@ -495,7 +495,7 @@
|
|||||||
} else if (s.stream_subtitle_decision === 'burn') {
|
} else if (s.stream_subtitle_decision === 'burn') {
|
||||||
subtitle_decision = 'Burn (' + s.subtitle_codec.toUpperCase() + ')';
|
subtitle_decision = 'Burn (' + s.subtitle_codec.toUpperCase() + ')';
|
||||||
} else {
|
} else {
|
||||||
subtitle_decision = 'Direct Play (' + ((s.synced_version === '1') ? s.stream_subtitle_codec.toUpperCase() : s.subtitle_codec.toUpperCase()) + ')';
|
subtitle_decision = 'Direct Play (' + ((s.synced_version === '1') ? s.subtitle_codec.toUpperCase() : s.stream_subtitle_codec.toUpperCase()) + ')';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$('#subtitle_decision-' + key).html(subtitle_decision);
|
$('#subtitle_decision-' + key).html(subtitle_decision);
|
||||||
|
@@ -100,6 +100,7 @@ UMASK = None
|
|||||||
|
|
||||||
HTTP_PORT = None
|
HTTP_PORT = None
|
||||||
HTTP_ROOT = None
|
HTTP_ROOT = None
|
||||||
|
AUTH_ENABLED = None
|
||||||
|
|
||||||
DEV = False
|
DEV = False
|
||||||
|
|
||||||
@@ -114,6 +115,7 @@ WIN_SYS_TRAY_ICON = None
|
|||||||
SYS_TIMEZONE = None
|
SYS_TIMEZONE = None
|
||||||
SYS_UTC_OFFSET = None
|
SYS_UTC_OFFSET = None
|
||||||
|
|
||||||
|
|
||||||
def initialize(config_file):
|
def initialize(config_file):
|
||||||
with INIT_LOCK:
|
with INIT_LOCK:
|
||||||
|
|
||||||
|
@@ -284,7 +284,7 @@ _CONFIG_DEFINITIONS = {
|
|||||||
'JOIN_ON_PMSUPDATE': (int, 'Join', 0),
|
'JOIN_ON_PMSUPDATE': (int, 'Join', 0),
|
||||||
'JOIN_ON_CONCURRENT': (int, 'Join', 0),
|
'JOIN_ON_CONCURRENT': (int, 'Join', 0),
|
||||||
'JOIN_ON_NEWDEVICE': (int, 'Join', 0),
|
'JOIN_ON_NEWDEVICE': (int, 'Join', 0),
|
||||||
'JOURNAL_MODE': (str, 'Advanced', 'wal'),
|
'JOURNAL_MODE': (str, 'Advanced', 'WAL'),
|
||||||
'LAUNCH_BROWSER': (int, 'General', 1),
|
'LAUNCH_BROWSER': (int, 'General', 1),
|
||||||
'LOG_BLACKLIST': (int, 'General', 1),
|
'LOG_BLACKLIST': (int, 'General', 1),
|
||||||
'LOG_DIR': (str, 'General', ''),
|
'LOG_DIR': (str, 'General', ''),
|
||||||
@@ -541,6 +541,7 @@ _CONFIG_DEFINITIONS = {
|
|||||||
'SCRIPTS_ON_PMSUPDATE_SCRIPT': (unicode, 'Scripts', ''),
|
'SCRIPTS_ON_PMSUPDATE_SCRIPT': (unicode, 'Scripts', ''),
|
||||||
'SCRIPTS_ON_CONCURRENT_SCRIPT': (unicode, 'Scripts', ''),
|
'SCRIPTS_ON_CONCURRENT_SCRIPT': (unicode, 'Scripts', ''),
|
||||||
'SCRIPTS_ON_NEWDEVICE_SCRIPT': (unicode, 'Scripts', ''),
|
'SCRIPTS_ON_NEWDEVICE_SCRIPT': (unicode, 'Scripts', ''),
|
||||||
|
'SYNCHRONOUS_MODE': (str, 'Advanced', 'NORMAL'),
|
||||||
'TELEGRAM_BOT_TOKEN': (str, 'Telegram', ''),
|
'TELEGRAM_BOT_TOKEN': (str, 'Telegram', ''),
|
||||||
'TELEGRAM_ENABLED': (int, 'Telegram', 0),
|
'TELEGRAM_ENABLED': (int, 'Telegram', 0),
|
||||||
'TELEGRAM_CHAT_ID': (str, 'Telegram', ''),
|
'TELEGRAM_CHAT_ID': (str, 'Telegram', ''),
|
||||||
|
@@ -126,11 +126,11 @@ class MonitorDatabase(object):
|
|||||||
def __init__(self, filename=FILENAME):
|
def __init__(self, filename=FILENAME):
|
||||||
self.filename = filename
|
self.filename = filename
|
||||||
self.connection = sqlite3.connect(db_filename(filename), timeout=20)
|
self.connection = sqlite3.connect(db_filename(filename), timeout=20)
|
||||||
# Don't wait for the disk to finish writing
|
# Set database synchronous mode (default NORMAL)
|
||||||
self.connection.execute("PRAGMA synchronous = OFF")
|
self.connection.execute("PRAGMA synchronous = %s" % plexpy.CONFIG.SYNCHRONOUS_MODE)
|
||||||
# Journal disabled since we never do rollbacks
|
# Set database journal mode (default WAL)
|
||||||
self.connection.execute("PRAGMA journal_mode = %s" % plexpy.CONFIG.JOURNAL_MODE)
|
self.connection.execute("PRAGMA journal_mode = %s" % plexpy.CONFIG.JOURNAL_MODE)
|
||||||
# 64mb of cache memory, probably need to make it user configurable
|
# Set database cache size (default 32MB)
|
||||||
self.connection.execute("PRAGMA cache_size = -%s" % (get_cache_size() * 1024))
|
self.connection.execute("PRAGMA cache_size = -%s" % (get_cache_size() * 1024))
|
||||||
self.connection.row_factory = dict_factory
|
self.connection.row_factory = dict_factory
|
||||||
|
|
||||||
|
@@ -1646,10 +1646,10 @@ class PmsConnect(object):
|
|||||||
if helpers.get_xml_attr(stream, 'streamType') == '1':
|
if helpers.get_xml_attr(stream, 'streamType') == '1':
|
||||||
video_stream_info = stream
|
video_stream_info = stream
|
||||||
|
|
||||||
elif helpers.get_xml_attr(stream, 'streamType') == '2':
|
elif helpers.get_xml_attr(stream, 'streamType') == '2' and helpers.get_xml_attr(stream, 'selected') == '1':
|
||||||
audio_stream_info = stream
|
audio_stream_info = stream
|
||||||
|
|
||||||
elif helpers.get_xml_attr(stream, 'streamType') == '3':
|
elif helpers.get_xml_attr(stream, 'streamType') == '3' and helpers.get_xml_attr(stream, 'selected') == '1':
|
||||||
subtitle_stream_info = stream
|
subtitle_stream_info = stream
|
||||||
|
|
||||||
video_id = audio_id = subtitle_id = None
|
video_id = audio_id = subtitle_id = None
|
||||||
|
@@ -1,2 +1,2 @@
|
|||||||
PLEXPY_BRANCH = "beta"
|
PLEXPY_BRANCH = "beta"
|
||||||
PLEXPY_RELEASE_VERSION = "v2.1.30-beta"
|
PLEXPY_RELEASE_VERSION = "v2.1.31-beta"
|
||||||
|
@@ -5884,7 +5884,7 @@ class WebInterface(object):
|
|||||||
status = {'result': 'success', 'message': 'Ok'}
|
status = {'result': 'success', 'message': 'Ok'}
|
||||||
|
|
||||||
if args or kwargs:
|
if args or kwargs:
|
||||||
if not cherrypy.request.path_info == '/api/v2':
|
if not cherrypy.request.path_info == '/api/v2' and plexpy.AUTH_ENABLED:
|
||||||
cherrypy.request.config['auth.require'] = []
|
cherrypy.request.config['auth.require'] = []
|
||||||
check_auth()
|
check_auth()
|
||||||
|
|
||||||
|
@@ -80,14 +80,15 @@ def initialize(options):
|
|||||||
logger.info(u"Tautulli WebStart :: Web server authentication is enabled: %s.", ' and '.join(login_allowed))
|
logger.info(u"Tautulli WebStart :: Web server authentication is enabled: %s.", ' and '.join(login_allowed))
|
||||||
|
|
||||||
if options['http_basic_auth']:
|
if options['http_basic_auth']:
|
||||||
auth_enabled = False
|
plexpy.AUTH_ENABLED = False
|
||||||
basic_auth_enabled = True
|
basic_auth_enabled = True
|
||||||
else:
|
else:
|
||||||
auth_enabled = True
|
plexpy.AUTH_ENABLED = True
|
||||||
basic_auth_enabled = False
|
basic_auth_enabled = False
|
||||||
cherrypy.tools.auth = cherrypy.Tool('before_handler', webauth.check_auth, priority=2)
|
cherrypy.tools.auth = cherrypy.Tool('before_handler', webauth.check_auth, priority=2)
|
||||||
else:
|
else:
|
||||||
auth_enabled = basic_auth_enabled = False
|
plexpy.AUTH_ENABLED = False
|
||||||
|
basic_auth_enabled = False
|
||||||
|
|
||||||
if options['http_root'].strip('/'):
|
if options['http_root'].strip('/'):
|
||||||
plexpy.HTTP_ROOT = options['http_root'] = '/' + options['http_root'].strip('/') + '/'
|
plexpy.HTTP_ROOT = options['http_root'] = '/' + options['http_root'].strip('/') + '/'
|
||||||
@@ -104,7 +105,7 @@ def initialize(options):
|
|||||||
'tools.gzip.mime_types': ['text/html', 'text/plain', 'text/css',
|
'tools.gzip.mime_types': ['text/html', 'text/plain', 'text/css',
|
||||||
'text/javascript', 'application/json',
|
'text/javascript', 'application/json',
|
||||||
'application/javascript'],
|
'application/javascript'],
|
||||||
'tools.auth.on': auth_enabled,
|
'tools.auth.on': plexpy.AUTH_ENABLED,
|
||||||
'tools.auth_basic.on': basic_auth_enabled,
|
'tools.auth_basic.on': basic_auth_enabled,
|
||||||
'tools.auth_basic.realm': 'Tautulli web server',
|
'tools.auth_basic.realm': 'Tautulli web server',
|
||||||
'tools.auth_basic.checkpassword': cherrypy.lib.auth_basic.checkpassword_dict({
|
'tools.auth_basic.checkpassword': cherrypy.lib.auth_basic.checkpassword_dict({
|
||||||
|
Reference in New Issue
Block a user