124 lines
4.3 KiB
Python
124 lines
4.3 KiB
Python
import subprocess, settings, tempfile, os, urllib, re
|
|
|
|
import xbmcgui, xbmc, xbmcplugin
|
|
|
|
import brlog
|
|
|
|
|
|
class MakeMkvInteraction:
|
|
def __init__(self):
|
|
self.settings = settings.BluRaySettings()
|
|
self.log = brlog.BrLog('makemkvinteraction')
|
|
|
|
def discList(self):
|
|
# First stop any old one
|
|
self.killMkv()
|
|
tmpf = tempfile.NamedTemporaryFile(delete=False)
|
|
self.log.info('temporary file with disc info: %s' % tmpf.name)
|
|
sp = os.system(r'%s -r --cache=1 --messages=%s info disc:10'
|
|
% (self.settings.mkvLocation, tmpf.name))
|
|
self.log.info('Return code for disc info generation: %s' % str(sp))
|
|
if not os.path.isfile(tmpf.name):
|
|
self.log.error('Is no file: %s' % tmpf.name)
|
|
|
|
tmpf = open(tmpf.name)
|
|
content = tmpf.read()
|
|
tmpf.close()
|
|
disclist = [x for x in content.splitlines() if x.startswith('DRV:')]
|
|
readableDiscs = list()
|
|
for item in disclist:
|
|
info = [x.replace('"','') for x in item[4:].split(',')]
|
|
if len(info[5]) > 0:
|
|
readableDiscs.append( (info[0],info[5]))
|
|
return readableDiscs
|
|
|
|
def startStream(self, disc):
|
|
self.log.info("Starting stream on disc %s with local url %s" %(disc, self.settings.rootURL))
|
|
# Then fork the makemkv process
|
|
return self.__runandregistershutdown('%s -r --cache=128 stream disc:%s' %(self.settings.mkvLocation, disc))
|
|
|
|
def startFileStream(self, choice):
|
|
type = ''
|
|
if re.search("BDMV.index.bdmv", choice) :
|
|
# Treat as file
|
|
type = 'file'
|
|
choice = choice[:-15]
|
|
elif re.search("BDMV.MovieObject.bdmv", choice) :
|
|
# Treat as file
|
|
type = 'file'
|
|
choice = choice[:-21]
|
|
else:
|
|
# Treat as iso
|
|
type = 'iso'
|
|
|
|
# Check if the file is reachable through the filesystem, to prevent errors with smb:// shares etc.
|
|
if not os.path.exists(choice) :
|
|
dialog = xbmcgui.Dialog()
|
|
dialog.ok("Info", _(50073))
|
|
return False
|
|
|
|
return self.__runandregistershutdown('"%s" -r --cache=128 stream \'%s:%s\'' %(self.settings.mkvLocation, type, choice))
|
|
|
|
|
|
def __runandregistershutdown(self, mkvStart):
|
|
result = self.__runmkvstream(mkvStart)
|
|
if result >= 0:
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
|
|
def __runmkvstream(self, mkvStart):
|
|
self.log.info('Starting %s' %(mkvStart))
|
|
# First stop any old one
|
|
self.killMkv()
|
|
timeSlept = 0
|
|
proc = subprocess.Popen(mkvStart, shell=True)
|
|
# Then wait for the stream to come up
|
|
while True:
|
|
try:
|
|
urllib.urlretrieve(self.settings.rootURL)
|
|
return proc.pid
|
|
except IOError:
|
|
pass
|
|
if proc.poll() :
|
|
if proc.returncode != 0 :
|
|
self.log.error("makemkvcon error'd out! May require update. (Return Code: %s)" % proc.returncode)
|
|
return -1
|
|
xbmc.sleep(1000)
|
|
timeSlept = timeSlept + 1
|
|
if timeSlept > self.settings.waitTimeOut :
|
|
return -1
|
|
|
|
|
|
def killMkv(self):
|
|
# Linux
|
|
if os.name == 'posix':
|
|
try :
|
|
self.log.info('attempting linux kill of makemkvcon')
|
|
subprocess.call('killall -9 makemkvcon', shell=True)
|
|
self.log.info('Linux call successful')
|
|
except:
|
|
pass
|
|
|
|
#Windows.
|
|
if os.name == 'nt':
|
|
try :
|
|
self.log.info('attempting windows kill of makemkvcon')
|
|
subprocess.call('taskkill /F /IM makemkvcon.exe', shell=True)
|
|
self.log.info('Windows call successful')
|
|
except:
|
|
pass
|
|
|
|
def makeMkvExists(self):
|
|
(fin, fout) = os.popen4('%s -r' %(self.settings.mkvLocation))
|
|
result = fout.read()
|
|
self.log.info('Make mkv check returned %s' % (result.splitlines()[0]))
|
|
if result.splitlines()[0].startswith('Use: makemkvcon [switches] Command [Parameters]'):
|
|
self.log.info("MakeMkvCon found!")
|
|
return True
|
|
else:
|
|
self.log.info('MakeMkvcon seems not to be configured properly : %s'
|
|
% (self.settings.mkvLocation))
|
|
return False
|
|
|