The branch, dharma has been updated
via 838545c483ab91ff9cbb3c000aacd74251b1b51b (commit)
from 0f84f72ea2d7f9807bd31de44b3bfde2cd5d47e7 (commit)
- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/scripts;a=commit;h=838545c483ab91ff9cbb3c000aacd74251b1b51b
commit 838545c483ab91ff9cbb3c000aacd74251b1b51b
Author: amet <amet.nospam@...>
Date: Mon Jun 27 17:52:19 2011 +0400
[script.pseudotv] -v 1.2.1
1.2.1
Now ask the user to enable the webserver if it isn't on.
Fix to use the proper webserver port.
Update to the Night skin (thanks Steveb).
Added the Simplicity skin (thanks Zepfan).
Several small performance improvements.
Shift 30 seconds forward or backward by using the left and right arrow keys.
Many random fixes.
diff --git a/script.pseudotv/addon.xml b/script.pseudotv/addon.xml
index 1e2a561..985de40 100644
--- a/script.pseudotv/addon.xml
+++ b/script.pseudotv/addon.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon
id="script.pseudotv"
- version="1.2.0"
+ version="1.2.1"
name="PseudoTV"
provider-name="Jason Anderson">
diff --git a/script.pseudotv/changelog.txt b/script.pseudotv/changelog.txt
index 88d8831..78f9d41 100644
--- a/script.pseudotv/changelog.txt
+++ b/script.pseudotv/changelog.txt
@@ -1,6 +1,16 @@
Changelog
+1.2.1
+ Now ask the user to enable the webserver if it isn't on.
+ Fix to use the proper webserver port.
+ Update to the Night skin (thanks Steveb).
+ Added the Simplicity skin (thanks Zepfan).
+ Several small performance improvements.
+ Shift 30 seconds forward or backward by using the left and right arrow keys.
+ Many random fixes.
+
+
1.2.0
The user can now specify how channels start: resume, follow the EPG (real-
time), or random.
diff --git a/script.pseudotv/default.py b/script.pseudotv/default.py
index 80cd55b..6860a54 100644
--- a/script.pseudotv/default.py
+++ b/script.pseudotv/default.py
@@ -18,7 +18,7 @@
import sys
import os
-import xbmc
+import xbmc, xbmcgui
import xbmcaddon
from resources.lib.Globals import *
@@ -38,5 +38,26 @@ __cwd__ = __settings__.getAddonInfo('path')
import resources.lib.Overlay as Overlay
-MyOverlayWindow = Overlay.TVOverlay("script.pseudotv.TVOverlay.xml", __cwd__, "default")
-del MyOverlayWindow
+shouldrestart = False
+
+if xbmc.executehttpapi("GetGuiSetting(1, services.webserver)")[4:] == "False":
+ try:
+ forcedserver = REAL_SETTINGS.getSetting("ForcedWebServer") == "True"
+ except:
+ forcedserver = False
+
+ if forcedserver == False:
+ dlg = xbmcgui.Dialog()
+ retval = dlg.yesno('PseudoTV', 'PseudoTV will run more efficiently with the web', 'server enabled. Would you like to turn it on?')
+ REAL_SETTINGS.setSetting("ForcedWebServer", "True")
+
+ if retval:
+ xbmc.executehttpapi("SetGUISetting(3, services.webserverport, 8152)")
+ xbmc.executehttpapi("SetGUISetting(1, services.webserver, true)")
+ dlg.ok('PseudoTV', 'XBMC needs to shutdown in order to apply the', 'changes.')
+ xbmc.executebuiltin("RestartApp()")
+ shouldrestart = True
+
+if shouldrestart == False:
+ MyOverlayWindow = Overlay.TVOverlay("script.pseudotv.TVOverlay.xml", __cwd__, "default")
+ del MyOverlayWindow
diff --git a/script.pseudotv/resources/lib/ChannelList.py b/script.pseudotv/resources/lib/ChannelList.py
index 27dfe9a..a32b073 100644
--- a/script.pseudotv/resources/lib/ChannelList.py
+++ b/script.pseudotv/resources/lib/ChannelList.py
@@ -32,6 +32,7 @@ from Playlist import Playlist
from Globals import *
from Channel import Channel
from VideoParser import VideoParser
+from FileLock import FileLock
@@ -44,6 +45,7 @@ class ChannelList:
self.movieGenreList = []
self.showList = []
self.videoParser = VideoParser()
+ self.fileLock = FileLock()
self.httpJSON = True
self.sleepTime = 0
self.exitThread = False
@@ -75,7 +77,7 @@ class ChannelList:
# Go through all channels, create their arrays, and setup the new playlist
for i in range(self.maxChannels):
- self.updateDialog.update(i * 100 // self.maxChannels, "Updating channel " + str(i + 1))
+ self.updateDialog.update(i * 100 // self.maxChannels, "Updating channel " + str(i + 1), "waiting for file lock")
self.channels.append(Channel())
# If the user pressed cancel, stop everything and exit
@@ -84,6 +86,9 @@ class ChannelList:
self.updateDialog.close()
return None
+ # Block until the file is unlocked
+ # This also has the affect of removing any stray locks (given, after 15 seconds).
+ self.fileLock.isFileLocked(CHANNELS_LOC + 'channel_' + str(i + 1) + '.m3u', True)
self.setupChannel(i + 1)
REAL_SETTINGS.setSetting('ForceChannelReset', 'false')
@@ -155,7 +160,6 @@ class ChannelList:
plname = dom.getElementsByTagName('webserver')
self.httpJSON = (plname[0].childNodes[0].nodeValue.lower() == 'true')
self.log('determineWebServer is ' + str(self.httpJSON))
-
if self.httpJSON == True:
plname = dom.getElementsByTagName('webserverport')
self.webPort = int(plname[0].childNodes[0].nodeValue)
@@ -187,8 +191,6 @@ class ChannelList:
userpass = base64.encodestring('%s:%s' % (self.webUsername, self.webPassword))[:-1]
headers['Authorization'] = 'Basic %s' % userpass
- self.webPort = 8080
-
try:
conn = httplib.HTTPConnection('127.0.0.1', self.webPort)
conn.request('POST', '/jsonrpc', payload, headers)
@@ -272,6 +274,9 @@ class ChannelList:
pass
if createlist or needsreset:
+ self.fileLock.lockFile(CHANNELS_LOC + 'channel_' + str(channel) + '.m3u', True)
+ self.updateDialog.update((channel - 1) * 100 // self.maxChannels, "Updating channel " + str(channel), "adding videos")
+
if self.makeChannelList(channel, chtype, chsetting1, chsetting2) == True:
if self.channels[channel - 1].setPlaylist(CHANNELS_LOC + 'channel_' + str(channel) + '.m3u') == True:
self.channels[channel - 1].totalTimePlayed = 0
@@ -281,6 +286,9 @@ class ChannelList:
ADDON_SETTINGS.setSetting('Channel_' + str(channel) + '_time', '0')
ADDON_SETTINGS.setSetting('Channel_' + str(channel) + '_changed', 'False')
+ self.fileLock.unlockFile(CHANNELS_LOC + 'channel_' + str(channel) + '.m3u')
+
+ self.updateDialog.update((channel - 1) * 100 // self.maxChannels, "Updating channel " + str(channel), "clearing history")
self.clearPlaylistHistory(channel)
if chtype == 6:
@@ -333,11 +341,12 @@ class ChannelList:
return
# if we actually need to clear anything
- if self.channels[channel - 1].totalTimePlayed > 60 * 60 * 24:
+ if (self.channels[channel - 1].totalTimePlayed > 60 * 60 * 24) and self.fileLock.lockFile(CHANNELS_LOC + 'channel_' + str(channel) + '.m3u'):
try:
fle = open(CHANNELS_LOC + 'channel_' + str(channel) + '.m3u', 'w')
except:
self.log("clearPlaylistHistory Unable to open the smart playlist", xbmc.LOGERROR)
+ self.fileLock.unlockFile(CHANNELS_LOC + 'channel_' + str(channel) + '.m3u')
return
fle.write("#EXTM3U\n")
@@ -363,7 +372,7 @@ class ChannelList:
self.channels[channel - 1].setPlaylist(CHANNELS_LOC + 'channel_' + str(channel) + '.m3u')
self.channels[channel - 1].totalTimePlayed -= timeremoved
-
+ self.fileLock.unlockFile(CHANNELS_LOC + 'channel_' + str(channel) + '.m3u')
def getChannelName(self, chtype, setting1):
@@ -691,7 +700,7 @@ class ChannelList:
del self.networkList[:]
del self.showList[:]
del self.showGenreList[:]
- break
+ return
match = re.search('"studio" *: *"(.*?)",', f)
network = ''
@@ -701,6 +710,12 @@ class ChannelList:
network = match.group(1).strip()
for item in self.networkList:
+ if self.threadPause() == False:
+ del self.networkList[:]
+ del self.showList[:]
+ del self.showGenreList[:]
+ return
+
if item.lower() == network.lower():
found = True
break
@@ -724,6 +739,12 @@ class ChannelList:
curgenre = genre.lower().strip()
for g in self.showGenreList:
+ if self.threadPause() == False:
+ del self.networkList[:]
+ del self.showList[:]
+ del self.showGenreList[:]
+ return
+
if curgenre == g.lower():
found = True
break
diff --git a/script.pseudotv/resources/lib/ChannelListThread.py b/script.pseudotv/resources/lib/ChannelListThread.py
index 5e8d8d1..3f41f3d 100644
--- a/script.pseudotv/resources/lib/ChannelListThread.py
+++ b/script.pseudotv/resources/lib/ChannelListThread.py
@@ -36,6 +36,7 @@ class ChannelListThread(threading.Thread):
sys.setcheckinterval(25)
self.chanlist = ChannelList()
self.chanlist.sleepTime = 0.1
+ self.paused = False
def log(self, msg, level = xbmc.LOGDEBUG):
@@ -65,11 +66,17 @@ class ChannelListThread(threading.Thread):
curtotal = self.myOverlay.channels[i].getTotalDuration()
self.chanlist.appendChannel(i + 1)
- if self.shouldExit == True:
- self.log("Closing thread")
- return
+ # A do-while loop for the paused state
+ while True:
+ if self.shouldExit == True:
+ self.log("Closing thread")
+ return
+
+ time.sleep(2)
+
+ if self.paused == False:
+ break
- time.sleep(2)
self.myOverlay.channels[i].setPlaylist(CHANNELS_LOC + "channel_" + str(i + 1) + ".m3u")
if self.myOverlay.channels[i].getTotalDuration() > curtotal:
@@ -77,3 +84,10 @@ class ChannelListThread(threading.Thread):
self.log("All channels up to date. Exiting thread.")
+
+ def pause(self):
+ self.paused = True
+
+
+ def unpause(self):
+ self.paused = False
diff --git a/script.pseudotv/resources/lib/EPGWindow.py b/script.pseudotv/resources/lib/EPGWindow.py
index 99836a2..cc76eb9 100644
--- a/script.pseudotv/resources/lib/EPGWindow.py
+++ b/script.pseudotv/resources/lib/EPGWindow.py
@@ -353,7 +353,12 @@ class EPGWindow(xbmcgui.WindowXMLDialog):
lastaction = time.time() - self.lastActionTime
if lastaction >= 2:
- selectedbutton = self.getControl(controlid)
+ try:
+ selectedbutton = self.getControl(controlid)
+ except:
+ self.actionSemaphore.release()
+ self.log('onClick unknown controlid ' + str(controlid))
+ return
for i in range(self.rowCount):
for x in range(len(self.channelButtons[i])):
@@ -540,6 +545,11 @@ class EPGWindow(xbmcgui.WindowXMLDialog):
pos = self.MyOverlayWindow.channels[newchan - 1].fixPlaylistIndex(pos + 1)
showoffset = 0
+ if self.MyOverlayWindow.currentChannel == newchan:
+ if plpos == xbmc.PlayList(xbmc.PLAYLIST_MUSIC).getposition():
+ self.log('selectShow return current show')
+ return
+
if pos != plpos:
self.MyOverlayWindow.channels[newchan - 1].setShowPosition(plpos)
self.MyOverlayWindow.channels[newchan - 1].setShowTime(0)
diff --git a/script.pseudotv/resources/lib/Globals.py b/script.pseudotv/resources/lib/Globals.py
index c07e858..d52d6cd 100644
--- a/script.pseudotv/resources/lib/Globals.py
+++ b/script.pseudotv/resources/lib/Globals.py
@@ -110,7 +110,7 @@ ADDON_SETTINGS = Settings.Settings()
REAL_SETTINGS = xbmcaddon.Addon(id=ADDON_ID)
ADDON_INFO = REAL_SETTINGS.getAddonInfo('path')
-VERSION = "1.2.0"
+VERSION = "1.2.1"
TIMEOUT = 15 * 1000
TOTAL_FILL_CHANNELS = 20
diff --git a/script.pseudotv/resources/lib/Overlay.py b/script.pseudotv/resources/lib/Overlay.py
index 59f49f5..4a32f0e 100644
--- a/script.pseudotv/resources/lib/Overlay.py
+++ b/script.pseudotv/resources/lib/Overlay.py
@@ -50,7 +50,7 @@ class MyPlayer(xbmc.Player):
if self.overlay.sleepTimeValue == 0:
self.overlay.sleepTimer = threading.Timer(1, self.overlay.sleepAction)
-
+
self.overlay.sleepTimeValue = 1
self.overlay.startSleepTimer()
self.stopped = True
@@ -159,7 +159,10 @@ class TVOverlay(xbmcgui.WindowXMLDialog):
self.timeStarted = time.time()
self.background.setVisible(False)
self.startSleepTimer()
- self.channelThread.start()
+
+ if self.channelResetSetting == "0":
+ self.channelThread.start()
+
self.actionSemaphore.release()
self.log('onInit return')
@@ -176,6 +179,8 @@ class TVOverlay(xbmcgui.WindowXMLDialog):
self.showChannelBug = REAL_SETTINGS.getSetting("ShowChannelBug") == "true"
self.log('Show channel bug - ' + str(self.showChannelBug))
self.forceReset = REAL_SETTINGS.getSetting('ForceChannelReset') == "true"
+ self.channelResetSetting = REAL_SETTINGS.getSetting('ChannelResetSetting')
+ self.log("Channel reset setting - " + str(self.channelResetSetting))
self.channelLogos = xbmc.translatePath(REAL_SETTINGS.getSetting('ChannelLogoFolder'))
if os.path.exists(self.channelLogos) == False:
@@ -287,7 +292,7 @@ class TVOverlay(xbmcgui.WindowXMLDialog):
self.log('Random on. Disabling.')
xbmc.PlayList(xbmc.PLAYLIST_MUSIC).unshuffle()
- xbmc.executebuiltin("self.PlayerControl(repeatall)")
+ xbmc.executebuiltin("PlayerControl(repeatall)")
timedif += (time.time() - self.channels[self.currentChannel - 1].lastAccessTime)
@@ -517,6 +522,9 @@ class TVOverlay(xbmcgui.WindowXMLDialog):
self.inputChannel = -1
else:
# Otherwise, show the EPG
+ if self.channelThread.isAlive():
+ self.channelThread.pause()
+
if self.sleepTimeValue > 0:
if self.sleepTimer.isAlive():
self.sleepTimer.cancel()
@@ -526,6 +534,9 @@ class TVOverlay(xbmcgui.WindowXMLDialog):
self.newChannel = 0
self.myEPG.doModal()
+ if self.channelThread.isAlive():
+ self.channelThread.unpause()
+
if self.newChannel != 0:
self.background.setVisible(True)
self.setChannel(self.newChannel)
@@ -538,10 +549,14 @@ class TVOverlay(xbmcgui.WindowXMLDialog):
if self.showingInfo:
self.infoOffset -= 1
self.showInfo(10.0)
+ else:
+ xbmc.executebuiltin("PlayerControl(SmallSkipBackward)")
elif action == ACTION_MOVE_RIGHT:
if self.showingInfo:
self.infoOffset += 1
self.showInfo(10.0)
+ else:
+ xbmc.executebuiltin("PlayerControl(SmallSkipForward)")
elif action == ACTION_PREVIOUS_MENU:
if self.showingInfo:
self.hideInfo()
@@ -606,6 +621,13 @@ class TVOverlay(xbmcgui.WindowXMLDialog):
# cleanup and end
def end(self):
self.log('end')
+ self.background.setVisible(True)
+ xbmc.executebuiltin("PlayerControl(repeatoff)")
+
+ if self.Player.isPlaying():
+ # Prevent the player from setting the sleep timer
+ self.Player.stopped = True
+ self.Player.stop()
try:
if self.channelLabelTimer.isAlive():
@@ -631,11 +653,6 @@ class TVOverlay(xbmcgui.WindowXMLDialog):
self.channelThread.chanlist.exitThread = True
self.channelThread.join()
- xbmc.executebuiltin("self.PlayerControl(repeatoff)")
-
- if self.Player.isPlaying():
- self.Player.stop()
-
if self.timeStarted > 0:
for i in range(self.maxChannels):
if self.channels[i].isValid:
diff --git a/script.pseudotv/resources/lib/VideoParser.py b/script.pseudotv/resources/lib/VideoParser.py
index c79b598..f8382a8 100644
--- a/script.pseudotv/resources/lib/VideoParser.py
+++ b/script.pseudotv/resources/lib/VideoParser.py
@@ -86,18 +86,24 @@ class VideoParser:
def handleSMB(self, filename):
self.log("handleSMB")
# On Windows, replace smb:// with \\ so that python can access it
- if os.name.lower() == 'nt':
- filename = '\\\\' + filename[6:]
- elif os.name.lower() == 'posix':
- newfilename = '//' + filename[6:]
- return self.mountPosixSMB(newfilename)
+ try:
+ if os.name.lower() == 'nt':
+ filename = '\\\\' + filename[6:]
+ elif os.name.lower() == 'posix':
+ newfilename = '//' + filename[6:]
+ return self.mountPosixSMB(newfilename)
+ except:
+ self.log("Exception in handleSMB")
return filename
def mountPosixSMB(self, filename):
+ self.log("mountPosixSMB " + str(filename))
if not os.path.exists(xbmc.translatePath('special://profile/addon_data/script.pseudotv/mountpnt/')):
+ self.log("mountPosixSMB creating directory")
os.makedirs(xbmc.translatePath('special://profile/addon_data/script.pseudotv/mountpnt/'))
+ self.log("mountPosixSMB directory created")
if self.mountedFS == True:
newfilename = xbmc.translatePath('special://profile/addon_data/script.pseudotv/mountpnt/') + os.path.split(filename)[1]
@@ -105,6 +111,7 @@ class VideoParser:
if os.path.exists(newfilename):
return newfilename
+ self.log("mountPosixSMB unmounting FS")
pipe = os.popen("umount \"" + xbmc.translatePath('special://profile/addon_data/script.pseudotv/mountpnt') + "\"")
self.mountedFS = False
@@ -124,24 +131,33 @@ class VideoParser:
def mountFs(self, filename, fstype):
+ self.log("mountFs " + filename + ", " + fstype)
dirpart, filename = os.path.split(filename)
+ self.log("mountFs mount 1")
pipe = os.popen("mount -t " + fstype + " \"" + dirpart + "\" \"" + xbmc.translatePath('special://profile/addon_data/script.pseudotv/mountpnt') + "\"")
newfilename = xbmc.translatePath('special://profile/addon_data/script.pseudotv/mountpnt/') + filename
if os.path.exists(newfilename):
+ self.log("mountFs return")
return newfilename
# Only try adding "Guest" if there is no username already there
if dirpart.find('@') == -1:
+ self.log("mountFs adding guest")
dirpart = "//Guest:@" + dirpart[2:]
+ self.log("mountFs mount 2")
pipe = os.popen("mount -t " + fstype + " \"" + dirpart + "\" \"" + xbmc.translatePath('special://profile/addon_data/script.pseudotv/mountpnt') + "\"")
if os.path.exists(newfilename):
+ self.log("mountFs return")
return newfilename
+ self.log("mountFs seperating")
# Seperate the username and password and try that
username = dirpart[2:dirpart.find(':')]
password = dirpart[dirpart.find(':') + 1:dirpart.find('@')]
dirpart = '//' + dirpart[dirpart.find('@') + 1:]
+ self.log("mountFs mount 3")
pipe = os.popen("mount -t cifs \"" + dirpart + "\" \"" + xbmc.translatePath('special://profile/addon_data/script.pseudotv/mountpnt') + "\" -o username=" + username + ",password=" + password)
+ self.log("mountFs return")
return newfilename
diff --git a/script.pseudotv/resources/lib/parsers/AVIParser.py b/script.pseudotv/resources/lib/parsers/AVIParser.py
index 9a517f4..36d5a21 100644
--- a/script.pseudotv/resources/lib/parsers/AVIParser.py
+++ b/script.pseudotv/resources/lib/parsers/AVIParser.py
@@ -37,15 +37,16 @@ class AVIChunk:
data = thefile.read(4)
try:
- self.size = struct.unpack('i', data)[0]
+ self.size = struct.unpack('<i', data)[0]
except:
self.size = 0
# Putting an upper limit on the chunk size, in case the file is corrupt
- if self.size < 10000:
+ if self.size > 0 and self.size < 10000:
self.chunk = thefile.read(self.size)
else:
self.chunk = ''
+ self.size = 0
@@ -64,7 +65,7 @@ class AVIList:
data = thefile.read(4)
try:
- self.size = struct.unpack('i', data)[0]
+ self.size = struct.unpack('<i', data)[0]
except:
self.size = 0
@@ -131,7 +132,7 @@ class AVIParser:
self.File = open(filename, "rb")
except:
self.log("Unable to open the file")
- return
+ return 0
dur = self.readHeader()
self.File.close()
@@ -169,11 +170,15 @@ class AVIParser:
# Stream list
data = self.getChunkOrList()
+ if self.Header.dwStreams > 10:
+ self.Header.dwStreams = 10
+
for i in range(self.Header.dwStreams):
if data.datatype != 2:
self.log("Unable to find streams")
return 0
+ listsize = data.size
# Stream chunk number 1, the stream header
data = self.getChunkOrList()
@@ -190,8 +195,13 @@ class AVIParser:
# If this isn't the video header, skip through the rest of these
# stream chunks
- while data.datatype == 1:
+ try:
+ if listsize - data.size - 12 > 0:
+ self.File.seek(listsize - data.size - 12, 1)
+
data = self.getChunkOrList()
+ except:
+ self.log("Unable to seek")
self.log("Video stream not found")
return 0
diff --git a/script.pseudotv/resources/lib/parsers/MKVParser.py b/script.pseudotv/resources/lib/parsers/MKVParser.py
index c22ebd9..ac4c834 100644
--- a/script.pseudotv/resources/lib/parsers/MKVParser.py
+++ b/script.pseudotv/resources/lib/parsers/MKVParser.py
@@ -96,7 +96,13 @@ class MKVParser:
def findHeader(self):
+ self.log("findHeader")
filesize = self.getFileSize()
+
+ if filesize == 0:
+ self.log("Empty file")
+ return 0
+
data = self.getEBMLId()
# Check for 1A 45 DF A3
@@ -150,10 +156,16 @@ class MKVParser:
def getFileSize(self):
- pos = self.File.tell()
- self.File.seek(0, 2)
- size = self.File.tell()
- self.File.seek(pos, 0)
+ size = 0
+
+ try:
+ pos = self.File.tell()
+ self.File.seek(0, 2)
+ size = self.File.tell()
+ self.File.seek(pos, 0)
+ except:
+ pass
+
return size
@@ -164,7 +176,7 @@ class MKVParser:
def getDataSize(self):
data = self.File.read(1)
-
+
try:
firstbyte = struct.unpack('>B', data)[0]
datasize = firstbyte
@@ -174,7 +186,7 @@ class MKVParser:
if datasize >> (7 - i) == 1:
mask = mask ^ (1 << (7 - i))
break
-
+
datasize = datasize & mask
if firstbyte >> 7 != 1:
@@ -191,7 +203,7 @@ class MKVParser:
def getEBMLId(self):
data = self.File.read(1)
-
+
try:
firstbyte = struct.unpack('>B', data)[0]
ID = firstbyte
diff --git a/script.pseudotv/resources/skins/skin.night/720p/script.pseudotv.EPG.xml b/script.pseudotv/resources/skins/skin.night/720p/script.pseudotv.EPG.xml
index 1cb00b0..4eb2f82 100644
--- a/script.pseudotv/resources/skins/skin.night/720p/script.pseudotv.EPG.xml
+++ b/script.pseudotv/resources/skins/skin.night/720p/script.pseudotv.EPG.xml
@@ -503,7 +503,7 @@
<posy>530</posy>
<width>260</width>
<height>150</height>
- <aspectratio>scale</aspectratio>
+ <aspectratio>keep</aspectratio>
<align>center</align>
</control>
diff --git a/script.pseudotv/resources/skins/skin.night/720p/script.pseudotv.TVOverlay.xml b/script.pseudotv/resources/skins/skin.night/720p/script.pseudotv.TVOverlay.xml
index 2db2efe..38340fe 100644
--- a/script.pseudotv/resources/skins/skin.night/720p/script.pseudotv.TVOverlay.xml
+++ b/script.pseudotv/resources/skins/skin.night/720p/script.pseudotv.TVOverlay.xml
@@ -85,7 +85,7 @@
<posy>530</posy>
<width>260</width>
<height>150</height>
- <aspectratio>scale</aspectratio>
+ <aspectratio>keep</aspectratio>
</control>
<control type="image">
<description>Navigation Flag</description>
-----------------------------------------------------------------------
Summary of changes:
script.pseudotv/addon.xml | 2 +-
script.pseudotv/changelog.txt | 10 +
script.pseudotv/default.py | 27 +-
script.pseudotv/resources/lib/ChannelList.py | 35 +-
script.pseudotv/resources/lib/ChannelListThread.py | 22 +-
script.pseudotv/resources/lib/EPGWindow.py | 12 +-
script.pseudotv/resources/lib/FileLock.py | 94 +++
script.pseudotv/resources/lib/Globals.py | 2 +-
script.pseudotv/resources/lib/Overlay.py | 33 +-
script.pseudotv/resources/lib/VideoParser.py | 26 +-
script.pseudotv/resources/lib/parsers/AVIParser.py | 20 +-
script.pseudotv/resources/lib/parsers/MKVParser.py | 26 +-
.../720p/script.pseudotv.ChannelConfig.xml | 684 ++++++++++++++++++++
.../720p/script.pseudotv.EPG.xml | 248 +++----
.../skin.jx720/720p/script.pseudotv.TVOverlay.xml | 62 ++
.../skins/skin.jx720/media/pstvButtonFocus.png | Bin 4407 -> 5003 bytes
.../media/pstvButtonNoFocus.png | Bin 3163 -> 3163 bytes
.../media/pstvHeader.png | Bin 3172 -> 3172 bytes
.../media/pstvTimeBar.png | Bin 2930 -> 3110 bytes
.../skins/{skin.night => skin.jx720}/skin.xml | 4 +-
.../skins/skin.night/720p/script.pseudotv.EPG.xml | 2 +-
.../skin.night/720p/script.pseudotv.TVOverlay.xml | 2 +-
.../720p/script.pseudotv.EPG.xml | 154 +++---
.../720p/script.pseudotv.TVOverlay.xml | 66 +-
.../skins/skin.simplicity/media/Background.png | Bin 0 -> 559806 bytes
.../media/EpgLogo.png | Bin 30414 -> 30414 bytes
.../skins/skin.simplicity/media/infoback.png | Bin 0 -> 191990 bytes
.../skins/skin.simplicity/media/lowback.png | Bin 0 -> 26243 bytes
.../skin.simplicity/media/pstvButtonFocus.png | Bin 0 -> 1802 bytes
.../skin.simplicity/media/pstvButtonNoFocus.png | Bin 0 -> 1070 bytes
.../skins/skin.simplicity/media/pstvHeader.png | Bin 0 -> 3997 bytes
.../skins/skin.simplicity/media/pstvHeader2.png | Bin 0 -> 1227 bytes
.../media/pstvTimeBar.png | Bin 3550 -> 3550 bytes
.../resources/skins/skin.simplicity/media/time.png | Bin 0 -> 3997 bytes
.../skin.xml | 2 +-
.../skin.transparency/720p/script.pseudotv.EPG.xml | 493 --------------
.../skins/skin.transparency/media/back.png | Bin 5468 -> 0 bytes
.../skin.transparency/media/pstvButtonFocus.png | Bin 2955 -> 0 bytes
.../skin.transparency/media/pstvButtonNoFocus.png | Bin 4128 -> 0 bytes
.../skin.transparency/media/pstvButtonNoFocus2.png | Bin 4128 -> 0 bytes
.../skins/skin.transparency/media/pstvHeader.png | Bin 4127 -> 0 bytes
.../skin.transparency/media/pstvInfoWindow.png | Bin 5038 -> 0 bytes
.../skins/skin.transparency/media/pstvSolid.png | Bin 208 -> 0 bytes
.../skin.transparency/media/pstvTimeBarBack.png | Bin 2969 -> 0 bytes
44 files changed, 1241 insertions(+), 785 deletions(-)
create mode 100644 script.pseudotv/resources/lib/FileLock.py
create mode 100644 script.pseudotv/resources/skins/skin.jx720/720p/script.pseudotv.ChannelConfig.xml
copy script.pseudotv/resources/skins/{skin.night => skin.jx720}/720p/script.pseudotv.EPG.xml (71%)
create mode 100644 script.pseudotv/resources/skins/skin.jx720/720p/script.pseudotv.TVOverlay.xml
copy script.mpdc/resources/skins/Confluence/media/ConsumeOffNF.png => script.pseudotv/resources/skins/skin.jx720/media/pstvButtonFocus.png (53%)
copy script.pseudotv/resources/skins/{skin.night => skin.jx720}/media/pstvButtonNoFocus.png (100%)
copy script.pseudotv/resources/skins/{skin.night => skin.jx720}/media/pstvHeader.png (100%)
rename script.pseudotv/resources/skins/{skin.transparency => skin.jx720}/media/pstvTimeBar.png (86%)
copy script.pseudotv/resources/skins/{skin.night => skin.jx720}/skin.xml (86%)
copy script.pseudotv/resources/skins/{skin.neon => skin.simplicity}/720p/script.pseudotv.EPG.xml (83%)
rename script.pseudotv/resources/skins/{skin.transparency => skin.simplicity}/720p/script.pseudotv.TVOverlay.xml (76%)
create mode 100644 script.pseudotv/resources/skins/skin.simplicity/media/Background.png
copy script.pseudotv/resources/skins/{skin.cirrus.extended => skin.simplicity}/media/EpgLogo.png (100%)
create mode 100644 script.pseudotv/resources/skins/skin.simplicity/media/infoback.png
create mode 100644 script.pseudotv/resources/skins/skin.simplicity/media/lowback.png
create mode 100644 script.pseudotv/resources/skins/skin.simplicity/media/pstvButtonFocus.png
create mode 100644 script.pseudotv/resources/skins/skin.simplicity/media/pstvButtonNoFocus.png
create mode 100644 script.pseudotv/resources/skins/skin.simplicity/media/pstvHeader.png
create mode 100644 script.pseudotv/resources/skins/skin.simplicity/media/pstvHeader2.png
copy script.pseudotv/resources/skins/{skin.refocus => skin.simplicity}/media/pstvTimeBar.png (100%)
create mode 100644 script.pseudotv/resources/skins/skin.simplicity/media/time.png
rename script.pseudotv/resources/skins/{skin.transparency => skin.simplicity}/skin.xml (87%)
delete mode 100644 script.pseudotv/resources/skins/skin.transparency/720p/script.pseudotv.EPG.xml
delete mode 100644 script.pseudotv/resources/skins/skin.transparency/media/back.png
delete mode 100644 script.pseudotv/resources/skins/skin.transparency/media/pstvButtonFocus.png
delete mode 100644 script.pseudotv/resources/skins/skin.transparency/media/pstvButtonNoFocus.png
delete mode 100644 script.pseudotv/resources/skins/skin.transparency/media/pstvButtonNoFocus2.png
delete mode 100644 script.pseudotv/resources/skins/skin.transparency/media/pstvHeader.png
delete mode 100644 script.pseudotv/resources/skins/skin.transparency/media/pstvInfoWindow.png
delete mode 100644 script.pseudotv/resources/skins/skin.transparency/media/pstvSolid.png
delete mode 100644 script.pseudotv/resources/skins/skin.transparency/media/pstvTimeBarBack.png
hooks/post-receive
--
Scripts
|