Skip to content

Commit

Permalink
reworked settings.
Browse files Browse the repository at this point in the history
TODO: UDID from aTV, some cleanup
  • Loading branch information
iBaa committed May 31, 2013
1 parent c9fb68b commit a10fa99
Show file tree
Hide file tree
Showing 11 changed files with 237 additions and 159 deletions.
2 changes: 2 additions & 0 deletions .gitignore
@@ -1,2 +1,4 @@

*.pyc

ATVSettings.cfg
127 changes: 127 additions & 0 deletions ATVSettings.py
@@ -0,0 +1,127 @@
#!/usr/bin/python

import sys
from os import sep
import ConfigParser

from Debug import * # dprint()



options = { \
'movieview' :('Grid', 'List'), \
'showview' :('List', 'Grid'), \
'seasonview' :('List', 'Coverflow'), \
\
'transcodequality':('9', '1', '5'), \
'forcedirectplay' :('False', 'True'), \
'forcetranscode' :('False', 'True') \
}
# comment on forcedirectplay -> if true, this has higher priority than forcetranscode



class CATVSettings():
def __init__(self):
dprint(__name__, 1, "init class CATVSettings")
self.cfg = None
self.loadSettings()



# load/save config
def loadSettings(self):
dprint(__name__, 1, "load settings")
# options -> default
dflt = {}
for opt in options:
dflt[opt] = options[opt][0]

# load settings
self.cfg = ConfigParser.SafeConfigParser(dflt)
self.cfg.read(self.getSettingsFile())

def saveSettings(self):
dprint(__name__, 1, "save settings")
f = open(self.getSettingsFile(), 'wb')
self.cfg.write(f)
f.close()

def getSettingsFile(self):
return sys.path[0] + sep + "ATVSettings.cfg"

def checkSection(self, UDID):
# check for existing UDID section
sections = self.cfg.sections()
if not UDID in sections:
self.cfg.add_section(UDID)
dprint(__name__, 0, "add section {0}", UDID)



# access/modify AppleTV options
def getSetting(self, UDID, option):
self.checkSection(UDID)
dprint(__name__, 1, "getsetting {0}", self.cfg.get(UDID, option))
return self.cfg.get(UDID, option)

def setSetting(self, UDID, option, val):
self.checkSection(UDID)
opts = options[option]

# check val in list
found = False
for opt in opts:
if opt==val:
found = True

# set - if incorrect val, pick default
if found:
self.cfg.set(UDID, option, val)
else:
self.cfg.set(UDID, option, opts[0])

def toggleSetting(self, UDID, option):
self.checkSection(UDID)
cur = self.cfg.get(UDID, option)
opts = options[option]

# find current in list
for i,opt in enumerate(opts):
if opt==cur:
break

# get next option (circle to first)
i=i+1
if i>=len(opts):
i=0

# set
self.cfg.set(UDID, option, opts[i])



if __name__=="__main__":
ATVSettings = CATVSettings()

UDID = '007'
ATVSettings.checkSection(UDID)

option = 'transcodequality'
print ATVSettings.getSetting(UDID, option)

print "setSetting"
ATVSettings.setSetting(UDID, option, 'True') # error - pick default
print ATVSettings.getSetting(UDID, option)
ATVSettings.setSetting(UDID, option, '9')
print ATVSettings.getSetting(UDID, option)

print "toggleSetting"
ATVSettings.toggleSetting(UDID, option)
print ATVSettings.getSetting(UDID, option)
ATVSettings.toggleSetting(UDID, option)
print ATVSettings.getSetting(UDID, option)
ATVSettings.toggleSetting(UDID, option)
print ATVSettings.getSetting(UDID, option)

del ATVSettings
2 changes: 2 additions & 0 deletions Debug.py
Expand Up @@ -14,6 +14,8 @@
"DNSServer" : 1, \
"WebServer" : 1, \
"XMLConverter" : 0, \
"Settings" : 0, \
"ATVSettings": 0, \
}


Expand Down
50 changes: 1 addition & 49 deletions Settings.py 100644 → 100755
@@ -1,15 +1,9 @@
#!/usr/bin/python
from Debug import * # dprint()

"""
Global Settings...
"""

settingsMovieView = 'Movie_Grid.xml'
settingsShowView = 'Show_List.xml'
settingsSeasonView = 'Season_List.xml'
settingsForceDirectPlay = False
settingsForceTranscode = False

#
# Plex Media Server
def getPlexGDM():
Expand All @@ -27,45 +21,3 @@ def getIP_DNSmaster(): # Router, ISP's DNS, ...

def getHostToIntercept():
return 'trailers.apple.com'

#
# AppleTV
def getForceDirectPlay(): # if true, this has higher priority than transcoding
return settingsForceDirectPlay

def getForceTranscoding():
return settingsForceTranscode

def getMovieViewType():
return settingsMovieView

def getShowViewType():
return settingsShowView

def getSeasonViewType():
return settingsSeasonView

def updateSettings(setting):
global settingsMovieView
global settingsShowView
global settingsSeasonView
global settingsForceDirectPlay
global settingsForceTranscode

parts = setting.split(':')

for i in range(0, len(parts)):
if parts[i] == 'MovieView':
if parts[i+1] == 'Grid': settingsMovieView = 'Movie_Grid.xml'
if parts[i+1] == 'List': settingsMovieView = 'Movie_List.xml'

if parts[i] == 'ShowView':
if parts[i+1] == 'Grid': settingsShowView = 'Show_Grid.xml'
if parts[i+1] == 'List': settingsShowView = 'Show_List.xml'
if parts[i+1] == 'Bookcase': settingsShowView = 'Show_Bookcase.xml'

if parts[i] == 'SeasonView':
if parts[i+1] == 'List': settingsSeasonView = 'Season_List.xml'
if parts[i+1] == 'Coverflow': settingsSeasonView = 'Season_Coverflow.xml'

return
13 changes: 6 additions & 7 deletions WebServer.py
Expand Up @@ -19,7 +19,7 @@
except ImportError:
import xml.etree.ElementTree as etree

import Settings
import Settings, ATVSettings
from Debug import * # dprint()
import XMLConverter # XML_PMS2aTV, XML_PlayVideo

Expand Down Expand Up @@ -49,12 +49,7 @@ def do_GET(self):
msg = msg[1:len(msg)-10]
dprint('ATVLogger', 0, msg)
return

# get settings from atv
if self.path.find('&settings:') > -1:
Settings.updateSettings(self.path)
return


# serve "application.js" to aTV
# disregard the path - it is different for different iOS versions
if self.path.endswith("application.js"):
Expand Down Expand Up @@ -159,6 +154,8 @@ def Run(cmdQueue, param):
dprint(__name__, 0, "***")

XMLConverter.setParams(param)
cfg = ATVSettings.CATVSettings()
XMLConverter.setATVSettings(cfg)

try:
while True:
Expand All @@ -179,6 +176,8 @@ def Run(cmdQueue, param):
dprint(__name__, 0,"^C received.")
finally:
dprint(__name__, 0, "Shutting down.")
cfg.saveSettings()
del cfg
server.socket.close()


Expand Down
39 changes: 30 additions & 9 deletions XMLConverter.py
Expand Up @@ -36,7 +36,7 @@
from urlparse import urlparse
from urllib import quote_plus

import Settings
import Settings, ATVSettings
from Debug import * # dprint()


Expand All @@ -46,6 +46,13 @@ def setParams(param):
global g_param
g_param = param

g_ATVSettings = None
def setATVSettings(cfg):
global g_ATVSettings
g_ATVSettings = cfg

UDID = '007' # todo: aTV: send UDID, PlexConnect: grab UDID



# links to CMD class for module wide usage
Expand Down Expand Up @@ -220,26 +227,36 @@ def XML_PMS2aTV(address, path):

elif cmd=='Search':
XMLtemplate = 'Search_Results.xml'

elif cmd=='Settings':
XMLtemplate = 'Settings.xml'

elif cmd.startswith('SettingsToggle:'):
XMLtemplate = 'Settings.xml'

opt = cmd[len('SettingsToggle:'):] # cut command:
g_ATVSettings.toggleSetting(UDID, opt.lower())
dprint(__name__, 2, "ATVSettings->Toggle: {0}", opt)

elif PMSroot.get('viewGroup') is None or \
PMSroot.get('viewGroup')=='secondary':
XMLtemplate = 'Directory.xml'

elif PMSroot.get('viewGroup')=='show':
# TV Show grid view
XMLtemplate = Settings.getShowViewType()
XMLtemplate = 'Show_'+g_ATVSettings.getSetting(UDID, 'showview')+'.xml'

elif PMSroot.get('viewGroup')=='season':
# TV Season view
XMLtemplate = Settings.getSeasonViewType()
XMLtemplate = 'Season_'+g_ATVSettings.getSetting(UDID, 'seasonview')+'.xml'

elif PMSroot.get('viewGroup')=='movie':
if PMSroot.get('title2')=='By Folder':
# By Folder View
XMLtemplate = 'ByFolder.xml'
else:
# Movie listing
XMLtemplate = Settings.getMovieViewType()
XMLtemplate = 'Movie_'+g_ATVSettings.getSetting(UDID, 'movieview')+'.xml'

elif PMSroot.get('viewGroup')=='episode':
if PMSroot.get('title2')=='On Deck' or \
Expand Down Expand Up @@ -669,6 +686,10 @@ def ATTRIB_EVAL(self, src, srcXML, param):
key = self.applyMath(key, math, frmt)
return key

def ATTRIB_SETTING(self, src, srcXML, param):
opt, leftover = self.getParam(src, param)
return g_ATVSettings.getSetting(UDID, opt)

def ATTRIB_ADDPATH(self, src, srcXML, param):
addpath, leftover, dfltd = self.getKey(src, srcXML, param)
if addpath.startswith('/'):
Expand Down Expand Up @@ -719,11 +740,11 @@ def ATTRIB_MEDIAURL(self, src, srcXML, param):

# check "Media" element and get key
if el!=None: # Media
if Settings.getForceDirectPlay()==True or \
Settings.getForceTranscoding()==False and \
el.get('container','') in ("mov", "mp4", "mpegts") and \
el.get('videoCodec','') in ("mpeg4", "h264", "drmi") and \
el.get('audioCodec','') in ("aac", "ac3", "drms"):
if g_ATVSettings.getSetting(UDID, 'forcedirectplay')=='True' or \
g_ATVSettings.getSetting(UDID, 'forcetranscoding')!='True' and \
el.get('container','') in ("mov", "mp4", "mpegts") and \
el.get('videoCodec','') in ("mpeg4", "h264", "drmi") and \
el.get('audioCodec','') in ("aac", "ac3", "drms"):
# native aTV media
res = el.find('Part').get('key','')
else:
Expand Down

0 comments on commit a10fa99

Please sign in to comment.