parent
cb32ffae56
commit
08eaf21a17
4 changed files with 64 additions and 43 deletions
|
@ -127,6 +127,8 @@
|
||||||
<string id="30141">Enable Background Image (Requires Restart)</string>
|
<string id="30141">Enable Background Image (Requires Restart)</string>
|
||||||
<string id="30142">Services</string>
|
<string id="30142">Services</string>
|
||||||
|
|
||||||
|
<string id="30143">Always transcode if video bitrate is above</string>
|
||||||
|
|
||||||
<string id="30150">Skin does not support setting views</string>
|
<string id="30150">Skin does not support setting views</string>
|
||||||
<string id="30151">Select item action (Requires Restart)</string>
|
<string id="30151">Select item action (Requires Restart)</string>
|
||||||
|
|
||||||
|
|
|
@ -151,7 +151,8 @@
|
||||||
<string id="30140"> - Themen-Musik in Schleife abspielen</string>
|
<string id="30140"> - Themen-Musik in Schleife abspielen</string>
|
||||||
<string id="30141">Laden im Hintergrund aktivieren (Erfordert Neustart)</string>
|
<string id="30141">Laden im Hintergrund aktivieren (Erfordert Neustart)</string>
|
||||||
<string id="30142">Dienste</string>
|
<string id="30142">Dienste</string>
|
||||||
<string id="30143">Info-Loader aktivieren (Erfordert Neustart)</string>
|
<string id="30143">Immer transkodieren falls Bitrate höher als</string>
|
||||||
|
|
||||||
<string id="30144">Menü-Loader aktivieren (Erfordert Neustart)</string>
|
<string id="30144">Menü-Loader aktivieren (Erfordert Neustart)</string>
|
||||||
<string id="30145">WebSocket Fernbedienung aktivieren (Erfordert Neustart)</string>
|
<string id="30145">WebSocket Fernbedienung aktivieren (Erfordert Neustart)</string>
|
||||||
<string id="30146">'Laufende Medien'-Loader aktivieren (Erfordert Neustart)</string>
|
<string id="30146">'Laufende Medien'-Loader aktivieren (Erfordert Neustart)</string>
|
||||||
|
|
|
@ -59,8 +59,8 @@ class PlayUtils():
|
||||||
playurl = tryEncode(self.API.getTranscodeVideoPath(
|
playurl = tryEncode(self.API.getTranscodeVideoPath(
|
||||||
'Transcode',
|
'Transcode',
|
||||||
quality={
|
quality={
|
||||||
'maxVideoBitrate': self.getBitrate(),
|
'maxVideoBitrate': self.get_bitrate(),
|
||||||
'videoResolution': self.getResolution(),
|
'videoResolution': self.get_resolution(),
|
||||||
'videoQuality': '100'
|
'videoQuality': '100'
|
||||||
}))
|
}))
|
||||||
# Set playmethod property
|
# Set playmethod property
|
||||||
|
@ -157,10 +157,17 @@ class PlayUtils():
|
||||||
- HEVC codec
|
- HEVC codec
|
||||||
- window variable 'plex_forcetranscode' set to 'true'
|
- window variable 'plex_forcetranscode' set to 'true'
|
||||||
(excepting trailers etc.)
|
(excepting trailers etc.)
|
||||||
|
- video bitrate above specified settings bitrate
|
||||||
if the corresponding file settings are set to 'true'
|
if the corresponding file settings are set to 'true'
|
||||||
"""
|
"""
|
||||||
videoCodec = self.API.getVideoCodec()
|
videoCodec = self.API.getVideoCodec()
|
||||||
log.info("videoCodec: %s" % videoCodec)
|
log.info("videoCodec: %s" % videoCodec)
|
||||||
|
if self.API.getType() in ('clip', 'track'):
|
||||||
|
log.info('Plex clip or music track, not transcoding')
|
||||||
|
return False
|
||||||
|
if window('plex_forcetranscode') == 'true':
|
||||||
|
log.info('User chose to force-transcode')
|
||||||
|
return True
|
||||||
if (settings('transcodeHi10P') == 'true' and
|
if (settings('transcodeHi10P') == 'true' and
|
||||||
videoCodec['bitDepth'] == '10'):
|
videoCodec['bitDepth'] == '10'):
|
||||||
log.info('Option to transcode 10bit video content enabled.')
|
log.info('Option to transcode 10bit video content enabled.')
|
||||||
|
@ -173,8 +180,15 @@ class PlayUtils():
|
||||||
# e.g. trailers. Avoids TypeError with "'h265' in codec"
|
# e.g. trailers. Avoids TypeError with "'h265' in codec"
|
||||||
log.info('No codec from PMS, not transcoding.')
|
log.info('No codec from PMS, not transcoding.')
|
||||||
return False
|
return False
|
||||||
if window('plex_forcetranscode') == 'true':
|
try:
|
||||||
log.info('User chose to force-transcode')
|
bitrate = int(videoCodec['bitrate'])
|
||||||
|
except (TypeError, ValueError):
|
||||||
|
log.info('No video bitrate from PMS, not transcoding.')
|
||||||
|
return False
|
||||||
|
if bitrate > self.get_max_bitrate():
|
||||||
|
log.info('Video bitrate of %s is higher than the maximal video'
|
||||||
|
'bitrate of %s that the user chose. Transcoding'
|
||||||
|
% (bitrate, self.get_max_bitrate()))
|
||||||
return True
|
return True
|
||||||
try:
|
try:
|
||||||
resolution = int(videoCodec['resolution'])
|
resolution = int(videoCodec['resolution'])
|
||||||
|
@ -200,32 +214,47 @@ class PlayUtils():
|
||||||
return False
|
return False
|
||||||
if self.mustTranscode():
|
if self.mustTranscode():
|
||||||
return False
|
return False
|
||||||
# Verify the bitrate
|
|
||||||
if not self.isNetworkSufficient():
|
|
||||||
log.info("The network speed is insufficient to direct stream "
|
|
||||||
"file. Transcoding")
|
|
||||||
return False
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def isNetworkSufficient(self):
|
def get_max_bitrate(self):
|
||||||
"""
|
|
||||||
Returns True if the network is sufficient (set in file settings)
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
sourceBitrate = int(self.API.getDataFromPartOrMedia('bitrate'))
|
|
||||||
except:
|
|
||||||
log.info('Could not detect source bitrate. It is assumed to be'
|
|
||||||
'sufficient')
|
|
||||||
return True
|
|
||||||
settings = self.getBitrate()
|
|
||||||
log.info("The add-on settings bitrate is: %s, the video bitrate"
|
|
||||||
"required is: %s" % (settings, sourceBitrate))
|
|
||||||
if settings < sourceBitrate:
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
def getBitrate(self):
|
|
||||||
# get the addon video quality
|
# get the addon video quality
|
||||||
|
videoQuality = settings('maxVideoQualities')
|
||||||
|
bitrate = {
|
||||||
|
'0': 320,
|
||||||
|
'1': 720,
|
||||||
|
'2': 1500,
|
||||||
|
'3': 2000,
|
||||||
|
'4': 3000,
|
||||||
|
'5': 4000,
|
||||||
|
'6': 8000,
|
||||||
|
'7': 10000,
|
||||||
|
'8': 12000,
|
||||||
|
'9': 20000,
|
||||||
|
'10': 40000,
|
||||||
|
'11': 99999999 # deactivated
|
||||||
|
}
|
||||||
|
# max bit rate supported by server (max signed 32bit integer)
|
||||||
|
return bitrate.get(videoQuality, 2147483)
|
||||||
|
|
||||||
|
def getH265(self):
|
||||||
|
"""
|
||||||
|
Returns the user settings for transcoding h265: boundary resolutions
|
||||||
|
of 480, 720 or 1080 as an int
|
||||||
|
|
||||||
|
OR 9999999 (int) if user chose not to transcode
|
||||||
|
"""
|
||||||
|
H265 = {
|
||||||
|
'0': 99999999,
|
||||||
|
'1': 480,
|
||||||
|
'2': 720,
|
||||||
|
'3': 1080
|
||||||
|
}
|
||||||
|
return H265[settings('transcodeH265')]
|
||||||
|
|
||||||
|
def get_bitrate(self):
|
||||||
|
"""
|
||||||
|
Get the desired transcoding bitrate from the settings
|
||||||
|
"""
|
||||||
videoQuality = settings('transcoderVideoQualities')
|
videoQuality = settings('transcoderVideoQualities')
|
||||||
bitrate = {
|
bitrate = {
|
||||||
'0': 320,
|
'0': 320,
|
||||||
|
@ -243,22 +272,10 @@ class PlayUtils():
|
||||||
# max bit rate supported by server (max signed 32bit integer)
|
# max bit rate supported by server (max signed 32bit integer)
|
||||||
return bitrate.get(videoQuality, 2147483)
|
return bitrate.get(videoQuality, 2147483)
|
||||||
|
|
||||||
def getH265(self):
|
def get_resolution(self):
|
||||||
"""
|
"""
|
||||||
Returns the user settings for transcoding h265: boundary resolutions
|
Get the desired transcoding resolutions from the settings
|
||||||
of 480, 720 or 1080 as an int
|
|
||||||
|
|
||||||
OR 9999999 (int) if user chose not to transcode
|
|
||||||
"""
|
"""
|
||||||
H265 = {
|
|
||||||
'0': 9999999,
|
|
||||||
'1': 480,
|
|
||||||
'2': 720,
|
|
||||||
'3': 1080
|
|
||||||
}
|
|
||||||
return H265[settings('transcodeH265')]
|
|
||||||
|
|
||||||
def getResolution(self):
|
|
||||||
chosen = settings('transcoderVideoQualities')
|
chosen = settings('transcoderVideoQualities')
|
||||||
res = {
|
res = {
|
||||||
'0': '420x420',
|
'0': '420x420',
|
||||||
|
|
|
@ -98,7 +98,8 @@
|
||||||
<setting id="resumeJumpBack" type="slider" label="30521" default="10" range="0,1,120" option="int" />
|
<setting id="resumeJumpBack" type="slider" label="30521" default="10" range="0,1,120" option="int" />
|
||||||
<setting type="sep" />
|
<setting type="sep" />
|
||||||
<setting id="playType" type="enum" label="30002" values="Direct Play (default)|Direct Stream|Force Transcode" default="0" />
|
<setting id="playType" type="enum" label="30002" values="Direct Play (default)|Direct Stream|Force Transcode" default="0" />
|
||||||
<setting id="transcoderVideoQualities" type="enum" label="30160" values="420x420, 320Kbps|576x320, 720Kbps|720x480, 1.5Mbps|1024x768, 2Mbps|1280x720, 3Mbps|1280x720, 4Mbps|1920x1080, 8Mbps|1920x1080, 10Mbps|1920x1080, 12Mbps|1920x1080, 20Mbps|1920x1080, 40Mbps" default="10" />
|
<setting id="transcoderVideoQualities" type="enum" label="30160" values="420x420, 320kbps|576x320, 720kbps|720x480, 1.5Mbps|1024x768, 2Mbps|1280x720, 3Mbps|1280x720, 4Mbps|1920x1080, 8Mbps|1920x1080, 10Mbps|1920x1080, 12Mbps|1920x1080, 20Mbps|1920x1080, 40Mbps" default="10" /><!-- Video Quality if Transcoding necessary -->
|
||||||
|
<setting id="maxVideoQualities" type="enum" label="30143" values="320kbps|720kbps|1.5Mbps|2Mbps|3Mbps|4Mbps|8Mbps|10Mbps|12Mbps|20Mbps|40Mbps|deactivated" default="11" /><!-- Always transcode if video bitrate is above -->
|
||||||
<setting id="transcodeH265" type="enum" label="30522" default="0" values="Disabled (default)|480p (and higher)|720p (and higher)|1080p" />
|
<setting id="transcodeH265" type="enum" label="30522" default="0" values="Disabled (default)|480p (and higher)|720p (and higher)|1080p" />
|
||||||
<setting id="transcodeHi10P" type="bool" label="39063" default="false"/>
|
<setting id="transcodeHi10P" type="bool" label="39063" default="false"/>
|
||||||
<setting id="transcodeHEVC" type="bool" label="39065" default="false"/>
|
<setting id="transcodeHEVC" type="bool" label="39065" default="false"/>
|
||||||
|
|
Loading…
Reference in a new issue