Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Bower components Debian packages RPM packages NuGet packages

dream-alpha / enigma2-plugin-skincomponents-extaudioinfo   deb

Repository URL to install this package:

Version: 2.0-r0 

/ usr / lib / enigma2 / python / Components / Converter / Extaudioinfo.py

from enigma import iPlayableService, iAudioType_ENUMS as iAt
from Components.Converter.Converter import Converter
from Components.Element import cached
from Components.Converter.Poll import Poll
import re

AUDIO_FORMATS = {
       iAt.atDTSHD:  ("DTS-HD",_("DTS-HD"),1),
       iAt.atDTS:    ("DTS",   _("DTS"),   2),
       iAt.atAACHE:  ("AACHE", _("HE-AAC"),3),
       iAt.atAAC:    ("AAC",   _("AAC"),   4),
       iAt.atDDP:    ("DDP",   _("AC3+"),  5),
       iAt.atAC3:    ("AC3",   _("AC3"),   6),
       iAt.atMPEG:   ("MPEG",  _("MPEG"),  7),
       iAt.atMP3:    ("MP3",   _("MP3"),   8),
       iAt.atLPCM:   ("LPCM",  _("LPCM"),  9),
       iAt.atPCM:    ("PCM",   _("PCM"),  10),
       iAt.atWMA:    ("WMA",   _("WMA"),  11),
       iAt.atFLAC:   ("FLAC",  _("FLAC"), -1),
       iAt.atOGG:    ("OGG",   _("OGG"),  -1),
       iAt.atUnknown:("unknown",_("<unknown>"), -1),
}

try:
	AUDIO_FORMATS.update({iAt.atTRUEHD:("TRUEHD",_("TRUEHD"), -1),})
except:
	pass

class Extaudioinfo(Poll, Converter, object):
	GET_AUDIO_ICON = 0
	GET_AUDIO_CODEC = 1

	def __init__(self, type):  # @ReservedAssignment
		Converter.__init__(self, type)
		Poll.__init__(self)
		self.type = type
		self.poll_interval = 1000
		self.poll_enabled = True
		self.codecs = {
					"01_dolbydigitalplus" : ("digital+", "digitalplus", "ac3+", "e-ac-3"),
					"02_dolbydigital": ("ac3", "ac-3", "dolbydigital"),
					"03_mp3": ("mp3",),
					"04_wma": ("wma",),
					"05_flac": ("flac",),
					"06_he-aac": ("he-aac",),
					"07_aac": ("aac",),
					"08_lpcm": ("lpcm",),
					"09_dts-hd": ("dts-hd",),
					"10_dts": ("dts",),
					"11_pcm": ("pcm",),
					"12_mpeg": ("mpeg",),
					"13_dolbytruehd": ("truehd",),
			}
		self.codec_info = { "dolbydigitalplus" : ("51", "20", "71"),
					"dolbydigital" : ("51", "20", "10", "71"),
					"wma" : ("8", "9"),
			}
		self.type, self.interesting_events = {
					"AudioIcon": (self.GET_AUDIO_ICON, (iPlayableService.evUpdatedInfo,)),
					"AudioCodec": (self.GET_AUDIO_CODEC, (iPlayableService.evUpdatedInfo,)),
			}[type]

	def getAudio(self):
		service = self.source.service
		audio = service.audioTracks()
		if audio:
			self.current_track = audio.getCurrentTrack()
			self.number_of_tracks = audio.getNumberOfTracks()
			if self.number_of_tracks > 0 and self.current_track > -1:
				self.audio_info = audio.getTrackInfo(self.current_track)
				return True
		return False

	def getAudioCodec(self, info):
		description_str = _("<unknown>")
		if self.getAudio():
			type = AUDIO_FORMATS[self.audio_info.getType()][1];
			if type == _("<unknown>"):
				description = self.audio_info.getDescription();
				if "MPEG-4 AAC" in description:
					description_str = "HE-AAC"
				elif "MPEG-2 AAC" in description:
					description_str = "AAC"
				elif "Free Lossless Audio Codec" in description:
					description_str = "FLAC"
				elif "Opus" in description:
					description_str = "OPUS"
				elif "Dolby TrueHD" in description:
					description_str = "TRUEHD"
				elif "E-AC-3 audio" in description:
					description_str = "AC3+"
				elif "LPCM" in description:
					description_str = "LPCM"
				elif "PCM" in description:
					description_str = "PCM"					
			else:
				description_str = type
				channels = self.audio_info.getDescription();
				channels_str = re.search("([0-9\.]+)", channels)
				if channels_str:
					description_str = description_str + " " + channels_str.group(1)
		return description_str

	def getAudioIcon(self, info):
		description_str = self.get_short(self.getAudioCodec(info).translate(None, ' .').lower())
		return description_str

	def get_short(self, audioName):
		for return_codec, codecs in sorted(self.codecs.iteritems()):
			for codec in codecs:
				if codec in audioName:
					codec = return_codec.split('_')[1]
					if codec in self.codec_info:
						for ex_codec in self.codec_info[codec]:
							if ex_codec in audioName:
								codec += ex_codec
								break
					return codec
		return audioName

	@cached
	def getText(self):
		service = self.source.service
		if service:
			info = service and service.info()
			if info:
				if self.type == self.GET_AUDIO_CODEC:
					return self.getAudioCodec(info)
				if self.type == self.GET_AUDIO_ICON:
					return self.getAudioIcon(info)
		return _("invalid type")

	text = property(getText)

	def changed(self, what):
		if what[0] != self.CHANGED_SPECIFIC or what[1] in self.interesting_events:
			Converter.changed(self, what)