83 lines
2.6 KiB
Python
83 lines
2.6 KiB
Python
|
import http
|
||
|
import mediadecisionengine
|
||
|
import util
|
||
|
|
||
|
|
||
|
class AudioObjectClass(object):
|
||
|
def __init__(self, item):
|
||
|
self.containerFormats = {
|
||
|
'aac': "es.aac-adts"
|
||
|
}
|
||
|
|
||
|
self.item = item
|
||
|
self.choice = mediadecisionengine.MediaDecisionEngine().chooseMedia(item)
|
||
|
if self.choice:
|
||
|
self.media = self.choice.media
|
||
|
self.lyrics = None # createLyrics(item, self.media)
|
||
|
|
||
|
def build(self, directPlay=None):
|
||
|
directPlay = directPlay or self.choice.isDirectPlayable
|
||
|
|
||
|
obj = util.AttributeDict()
|
||
|
|
||
|
# TODO(schuyler): Do we want/need to add anything generic here? Title? Duration?
|
||
|
|
||
|
if directPlay:
|
||
|
obj = self.buildDirectPlay(obj)
|
||
|
else:
|
||
|
obj = self.buildTranscode(obj)
|
||
|
|
||
|
self.metadata = obj
|
||
|
|
||
|
util.LOG("Constructed audio item for playback: {0}".format(obj))
|
||
|
|
||
|
return self.metadata
|
||
|
|
||
|
def buildTranscode(self, obj):
|
||
|
transcodeServer = self.item.getTranscodeServer(True, "audio")
|
||
|
if not transcodeServer:
|
||
|
return None
|
||
|
|
||
|
obj.streamFormat = "mp3"
|
||
|
obj.isTranscoded = True
|
||
|
obj.transcodeServer = transcodeServer
|
||
|
|
||
|
builder = http.HttpRequest(transcodeServer.buildUrl("/music/:/transcode/universal/start.m3u8", True))
|
||
|
builder.addParam("protocol", "http")
|
||
|
builder.addParam("path", self.item.getAbsolutePath("key"))
|
||
|
builder.addParam("session", self.item.getGlobal("clientIdentifier"))
|
||
|
builder.addParam("directPlay", "0")
|
||
|
builder.addParam("directStream", "0")
|
||
|
|
||
|
obj.url = builder.getUrl()
|
||
|
|
||
|
return obj
|
||
|
|
||
|
def buildDirectPlay(self, obj):
|
||
|
if self.choice.part:
|
||
|
obj.url = self.item.getServer().buildUrl(self.choice.part.getAbsolutePath("key"), True)
|
||
|
|
||
|
# Set and override the stream format if applicable
|
||
|
obj.streamFormat = self.choice.media.container or 'mp3'
|
||
|
if self.containerFormats.get(obj.streamFormat):
|
||
|
obj.streamFormat = self.containerFormats[obj.streamFormat]
|
||
|
|
||
|
# If we're direct playing a FLAC, bitrate can be required, and supposedly
|
||
|
# this is the only way to do it. plexinc/roku-client#48
|
||
|
#
|
||
|
bitrate = self.choice.media.getInt("bitrate")
|
||
|
if bitrate > 0:
|
||
|
obj.streams = [{'url': obj.url, 'bitrate': bitrate}]
|
||
|
|
||
|
return obj
|
||
|
|
||
|
# We may as well fallback to transcoding if we could not direct play
|
||
|
return self.buildTranscode(obj)
|
||
|
|
||
|
def getLyrics(self):
|
||
|
return self.lyrics
|
||
|
|
||
|
def hasLyrics(self):
|
||
|
return False
|
||
|
# return self.lyrics.isAvailable()
|