from Plugins.Plugin import PluginDescriptor
import os
from enigma import eTimer
from Screens.Screen import Screen
from Screens.MessageBox import MessageBox
from Components.Button import Button
from Components.Label import Label
from Components.ConfigList import ConfigListScreen
from Components.Sources.StaticText import StaticText
from Components.ActionMap import NumberActionMap, ActionMap
from Components.config import config, ConfigSelection, getConfigListEntry, ConfigText, ConfigDirectory, ConfigYesNo, ConfigSubsection
from Components.FileList import FileList
from Tools.Directories import resolveFilename, SCOPE_PLUGINS
config.plugins.dlnaserver = ConfigSubsection()
config.plugins.dlnaserver.autostart = ConfigYesNo(default = False)
runcherBin = resolveFilename(SCOPE_PLUGINS, "Extensions/DLNAServer/dlnaserver")
def isRunning():
ps_str = os.popen('ps -ef | grep minidlna | grep -v grep').read()
if ps_str.strip() != '':
return True
return False
class SelectDirectoryWindow(Screen):
skin = """
"""
def __init__(self, session, currentDir):
Screen.__init__(self, session)
inhibitDirs = ["/bin", "/boot", "/dev", "/etc", "/lib", "/proc", "/sbin", "/sys", "/usr", "/var"]
self["filelist"] = FileList(currentDir, showDirectories = True, showFiles = False, inhibitMounts=[], inhibitDirs=inhibitDirs)
self["actions"] = ActionMap(["WizardActions", "DirectionActions", "ColorActions", "EPGSelectActions"], {
"back" : self.cancel,
"left" : self.left,
"right" : self.right,
"up" : self.up,
"down" : self.down,
"ok" : self.ok,
"green" : self.green,
"red" : self.cancel
}, -1)
self["currentDir"] = Label()
self["key_green"] = StaticText(_("OK"))
self["key_red"] = StaticText(_("Cancel"))
self.onLayoutFinish.append(self.layoutFinished)
def layoutFinished(self):
self.updateCurrentDirectory()
def cancel(self):
self.close(None)
def green(self):
self.close(self["filelist"].getSelection()[0])
def up(self):
self["filelist"].up()
self.updateCurrentDirectory()
def down(self):
self["filelist"].down()
self.updateCurrentDirectory()
def left(self):
self["filelist"].pageUp()
self.updateCurrentDirectory()
def right(self):
self["filelist"].pageDown()
self.updateCurrentDirectory()
def ok(self):
if self["filelist"].canDescent():
self["filelist"].descent()
self.updateCurrentDirectory()
def updateCurrentDirectory(self):
currentDir = self["filelist"].getSelection()[0]
if currentDir is None or currentDir.strip() == '':
currentDir = "Invalid Location"
self["currentDir"].setText(currentDir)
class DLNAServer(ConfigListScreen, Screen):
skin= """
"""
def __init__(self, session):
self.session = session
Screen.__init__(self, session)
self.oldConfig = {}
self.menulist = []
ConfigListScreen.__init__(self, self.menulist)
self.configFileName = "/etc/minidlna.conf"
self["actions"] = ActionMap(["OkCancelActions", "ShortcutActions", "WizardActions", "ColorActions", "SetupActions", ], {
"red" : self.keyExit,
"green" : self.keyGreen,
"blue" : self.keyBlue,
"yellow" : self.keyYellow,
"cancel" : self.keyExit,
"ok" : self.keyOK
}, -2)
self["key_red"] = StaticText(_("Exit"))
self["key_green"] = StaticText(_("Start"))
self["key_yellow"] = StaticText(_("Save"))
self["key_blue"] = StaticText(_("Reset"))
self["information"] = Label()
self.makeMenuEntry()
self.onLayoutFinish.append(self.layoutFinished)
self.updateGreenTimer = eTimer()
self.updateGreenTimer.timeout.get().append(self.cbGreenTimer)
def layoutFinished(self):
green_btm_str = 'Start'
if isRunning():
green_btm_str = 'Stop'
self["key_green"].setText(green_btm_str)
#self["information"].setText(' ')
def cbGreenTimer(self):
self.updateGreenTimer.stop()
self["information"].setText("")
self.layoutFinished()
def keyExit(self):
config.plugins.dlnaserver.autostart.save()
self.close()
def keyOK(self):
currentItem = self.getCurrentItem()
if currentItem is not None:
self.session.openWithCallback(self.cbChangeDirectory, SelectDirectoryWindow, currentItem.value)
def keyGreen(self):
args = '-e'
if self["key_green"].getText().strip() == 'Start':
args = '-s'
self.saveConfigFile()
rc = os.popen('%s %s'%(runcherBin, args)).read()
self["information"].setText(rc)
self.updateGreenTimer.start(1000)
def keyYellow(self):
self.saveConfigFile()
self["information"].setText('finished saving!!')
def keyBlue(self):
self.menuItemServerName.value = self.oldConfig.get('friendly_name')
self.menuItemVideoDir.value = self.oldConfig.get('media_dirV')
self.menuItemMusicDir.value = self.oldConfig.get('media_dirA')
self.menuItemPictureDir.value = self.oldConfig.get('media_dirP')
log_level_list = self.oldConfig.get('log_level').split('=')
enable_log = False
log_level = log_level_list[1]
if log_level != 'off':
enable_log = True
if log_level not in ('off', 'error', 'warn', 'debug'):
log_level = 'error'
self.menuItemEnableLog.value = enable_log
self.menuItemLogLevel.value = log_level
self.menuItemLogDir.value = self.oldConfig.get('log_dir')
config.plugins.dlnaserver.autostart.value = False
self.resetMenuList()
def keyRed(self):
self.keyExit()
def keyLeft(self):
ConfigListScreen.keyLeft(self)
self.resetMenuList()
def keyRight(self):
ConfigListScreen.keyRight(self)
self.resetMenuList()
def saveConfigFile(self):
serverName = self.menuItemServerName.value
videoDir = self.menuItemVideoDir.value
auditDir = self.menuItemMusicDir.value
pictureDir = self.menuItemPictureDir.value
logDir = self.menuItemLogDir.value
logLevel = self.menuItemLogLevel.value
if not self.menuItemEnableLog.value:
logDir,logLevel = None, None
self.writeConfigFile(serverName=serverName, videoDir=videoDir, auditDir=auditDir, pictureDir=pictureDir, logDir=logDir, logLevel=logLevel)
def getCurrentItem(self):
currentEntry = self["config"].getCurrent()
if currentEntry == self.menuEntryVideoDir:
return self.menuItemVideoDir
elif currentEntry == self.menuEntryMusicDir:
return self.menuItemMusicDir
elif currentEntry == self.menuEntryPictureDir:
return self.menuItemPictureDir
elif currentEntry == self.menuEntryLogDir:
return self.menuItemLogDir
return None
def cbChangeDirectory(self, pathStr):
if pathStr is None or pathStr.strip() == '':
return
currentItem = self.getCurrentItem()
if currentItem is not None:
currentItem.value = pathStr
def makeMenuEntry(self):
self.readConfigFile()
if not os.path.exists('/media/dlna'):
os.system('mkdir -p /media/dlna/.minidlna/')
os.system('mkdir -p /media/dlna/Videos/')
os.system('mkdir -p /media/dlna/Musics/')
os.system('mkdir -p /media/dlna/Pictures/')
self.menuItemServerName = ConfigText(default=self.oldConfig.get('friendly_name'))
self.menuItemVideoDir = ConfigDirectory(default = self.oldConfig.get('media_dirV'))
self.menuItemMusicDir = ConfigDirectory(default = self.oldConfig.get('media_dirA'))
self.menuItemPictureDir = ConfigDirectory(default = self.oldConfig.get('media_dirP'))
log_level_list = self.oldConfig.get('log_level').split('=')
enable_log = False
log_level = log_level_list[1]
if log_level != 'off':
enable_log = True
if log_level not in ('off', 'error', 'warn', 'debug'):
log_level = 'error'
self.menuItemEnableLog = ConfigYesNo(default = enable_log)
self.menuItemLogLevel = ConfigSelection(default = log_level, choices = [("off", _("off")), ("error", _("error")), ("warn", _("warn")), ("debug", _("debug"))])
self.menuItemLogDir = ConfigDirectory(default = self.oldConfig.get('log_dir'))
self.menuEntryServerName = getConfigListEntry(_("Server Name"), self.menuItemServerName)
self.menuEntryVideoDir = getConfigListEntry(_("Video Directory"), self.menuItemVideoDir)
self.menuEntryMusicDir = getConfigListEntry(_("Music Directory"), self.menuItemMusicDir)
self.menuEntryPictureDir = getConfigListEntry(_("Picture Directory"), self.menuItemPictureDir)
self.menuEntryEnableLog = getConfigListEntry(_("Enable Logging"), self.menuItemEnableLog)
self.menuEntryLogLevel = getConfigListEntry(_(" - Log Level"), self.menuItemLogLevel)
self.menuEntryLogDir = getConfigListEntry(_(" - Log Directory"), self.menuItemLogDir)
self.menuEntryAutoStart = getConfigListEntry(_("Enable Autostart for DLNA Server"), config.plugins.dlnaserver.autostart)
self.resetMenuList()
def resetMenuList(self):
self.menulist = []
self.menulist.append(self.menuEntryServerName)
self.menulist.append(self.menuEntryVideoDir)
self.menulist.append(self.menuEntryMusicDir)
self.menulist.append(self.menuEntryPictureDir)
self.menulist.append(self.menuEntryEnableLog)
if self.menuItemEnableLog.value:
self.menulist.append(self.menuEntryLogLevel)
self.menulist.append(self.menuEntryLogDir)
self.menulist.append(self.menuEntryAutoStart)
self["config"].list = self.menulist
self["config"].l.setList(self.menulist)
def writeConfigFile(self, serverName=None, videoDir=None, auditDir=None, pictureDir=None, logDir=None, logLevel='error'):
configString = ""
def configDataAppend(origin, key, value):
if key.strip() != '' and value.strip() != '':
origin += "%s=%s\n" % (key,value)
return origin
configString = configDataAppend(configString, "friendly_name", serverName)
if videoDir is not None and videoDir.strip() != '':
configString = configDataAppend(configString, "media_dir", "V,%s"%(videoDir))
if auditDir is not None and auditDir.strip() != '':
configString = configDataAppend(configString, "media_dir", "A,%s"%(auditDir))
if pictureDir is not None and pictureDir.strip() != '':
configString = configDataAppend(configString, "media_dir", "P,%s"%(pictureDir))
if logDir is not None and logDir.strip() != '':
configString = configDataAppend(configString, "log_dir", logDir)
configString = configDataAppend(configString, "log_level", "general,artwork,database,inotify,scanner,metadata,http,ssdp,tivo=%s"%(logLevel))
configString = configDataAppend(configString, "port", self.oldConfig.get('port'))
configString = configDataAppend(configString, "db_dir", self.oldConfig.get('db_dir'))
configString = configDataAppend(configString, "album_art_names", self.oldConfig.get('album_art_names'))
configString = configDataAppend(configString, "inotify", self.oldConfig.get('inotify'))
configString = configDataAppend(configString, "enable_tivo", self.oldConfig.get('enable_tivo'))
configString = configDataAppend(configString, "strict_dlna", self.oldConfig.get('strict_dlna'))
configString = configDataAppend(configString, "notify_interval", self.oldConfig.get('notify_interval'))
configString = configDataAppend(configString, "serial", self.oldConfig.get('serial'))
configString = configDataAppend(configString, "model_number", self.oldConfig.get('model_number'))
print configString
confFile = file(self.configFileName, 'w')
confFile.write(configString)
confFile.close()
def readConfigFile(self):
if not os.path.exists(self.configFileName):
return
self.oldConfig = {}
for line in file(self.configFileName).readlines():
line = line.strip()
if line == '' or line[0] == '#':
continue
try:
i = line.find('=')
k,v = line[:i],line[i+1:]
if k == 'media_dir':
k += v[0]
v = v[2:]
self.oldConfig[k] = v
except : pass
def setDefault(key, default):
try:
value = self.oldConfig.get(key)
if value == None or value.strip() == '':
self.oldConfig[key] = default
except: self.oldConfig[key] = default
try:
model = os.popen('cat /proc/stb/info/vumodel').read().strip()
except: model = 'My'
setDefault('friendly_name', '%s DLNA Server'%(model.upper()))
setDefault('media_dirV', '/media/dlna/Videos')
setDefault('media_dirA', '/media/dlna/Musics')
setDefault('media_dirP', '/media/dlna/Pictures')
setDefault('log_dir', '/media/dlna/.minidlnalog')
setDefault('log_level', 'general,artwork,database,inotify,scanner,metadata,http,ssdp,tivo=error')
setDefault('port', '8200')
setDefault('db_dir', '/var/cache/minidlna')
setDefault('album_art_names', 'Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg/AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg/Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg')
setDefault('inotify', 'yes')
setDefault('enable_tivo', 'no')
setDefault('strict_dlna', 'no')
setDefault('notify_interval', '900')
setDefault('serial', '12345678')
setDefault('model_number', '1')
print "Current Config : ", self.oldConfig
def main(session, **kwargs):
session.open(DLNAServer)
def autostart(reason, **kwargs):
if reason == 0:
if isRunning():
args = " -e"
is_running = True
else:
args = " -s"
is_running = False
cmd = runcherBin + args
if config.plugins.dlnaserver.autostart.value:
if is_running:
print "[DLNAServer] already started"
else:
print "[DLNAServer] starting ..."
os.system(cmd)
elif config.plugins.dlnaserver.autostart.value == False and is_running == True:
print "[DLNAServer] stopping ..."
os.system(cmd)
def Plugins(**kwargs):
return [PluginDescriptor(name="DLNA Server", description="This is dlna server using minidlna.", where = PluginDescriptor.WHERE_PLUGINMENU, needsRestart = False, fnc=main),
PluginDescriptor(where = [PluginDescriptor.WHERE_AUTOSTART], fnc = autostart)]