Files
repository.olipassey/service.lowerthird/standalone.py
Oli db2cdd6737 [Broken Dev WIP] RealTime Notifications
Take text from JSON API Call 'notitxt' and then write that text onto a pre-defined background image 'sample-in.jpg' and write it out to 'sample-out.jpg'
Copypasta of another def later in the code to display just that sample-out file.
It's a mess, won't work but its a starting point
2018-01-20 16:07:09 +00:00

234 lines
8.2 KiB
Python

# ============================================================
# LowerThird Notifications - Forked by Oli Passey from:
# KODI Banners - Version 1.9 by D. Lanik (2016)
# ------------------------------------------------------------
# Display banners when playing any video
# ------------------------------------------------------------
# License: GPL (http://www.gnu.org/licenses/gpl-3.0.html)
# ============================================================
import xbmc
import xbmcaddon
import xbmcgui
import xbmcvfs
import urlparse
import os
import sys
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw
from xml.dom import minidom
# ============================================================
# Create lowerthird banners from API sent text
# Won't work yet...
# ============================================================
def CreateLowerThird
# define the font path as local fonts dir in prj root
fonts_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'fonts')
font = ImageFont.truetype(os.path.join(fonts_path, 'sans_serif.ttf'), 24)
# font = ImageFont.truetype(<font-file>, <font-size>)
# font-file should be present in provided path.
font = ImageFont.truetype("sans-serif.ttf", 16)
img = Image.open("sample_in.jpg")
draw = ImageDraw.Draw(img)
# font = ImageFont.truetype(<font-file>, <font-size>)
font = ImageFont.truetype("sans-serif.ttf", 16)
# draw.text((x, y),"Sample Text",(r,g,b))
draw.text((0, 0),notitxt,(255,255,255),font=font)
img.save('sample-out.jpg')
# ============================================================
# Define Overlay Class
# ============================================================
class OverlayText(object):
def __init__(self, windowid):
self.showing = False
self.window = xbmcgui.Window(windowid)
viewport_w, viewport_h = self._get_skin_resolution()
pos = "20,20".split(",")
pos_x = (viewport_w + int(pos[0]), int(pos[0]))[int(pos[0]) > 0]
pos_y = (viewport_h + int(pos[1]), int(pos[1]))[int(pos[1]) > 0]
self.imageTop = xbmcgui.ControlImage(pos_x, pos_y, 1240, 120, os.path.join("media", "banners", "generic_01.jpg"), aspectRatio=0)
pw = int((viewport_w - 1240) / 2)
ph = int((viewport_h - 60) / 2)
pp = "%3d,%3d" % (pw, ph)
pos = pp.split(",")
pos_x = (viewport_w + int(pos[0]), int(pos[0]))[int(pos[0]) > 0]
pos_y = (viewport_h + int(pos[1]), int(pos[1]))[int(pos[1]) > 0]
self.imageCenter = xbmcgui.ControlImage(pos_x, pos_y, 1240, 120, os.path.join("media", "banners", "generic_01.jpg"), aspectRatio=0)
pos = "20,-140".split(",")
pos_x = (viewport_w + int(pos[0]), int(pos[0]))[int(pos[0]) > 0]
pos_y = (viewport_h + int(pos[1]), int(pos[1]))[int(pos[1]) > 0]
self.imageBottom = xbmcgui.ControlImage(pos_x, pos_y, 1240, 120, os.path.join("media", "banners", "generic_01.jpg"), aspectRatio=0)
def scaleimage(self, width, height, yoffset):
viewport_w, viewport_h = self._get_skin_resolution()
if width > viewport_w:
if yoffset > 0:
width = viewport_w - (yoffset * 2)
xpos = yoffset
else:
width = viewport_w
xpos = 0
else:
xpos = (viewport_w - width) / 2
self.imageBottom.setHeight(height)
self.imageBottom.setWidth(width)
self.imageBottom.setPosition(xpos, viewport_h - height - yoffset)
self.imageCenter.setHeight(height)
self.imageCenter.setWidth(width)
self.imageCenter.setPosition(xpos, (viewport_h - height) / 2 )
self.imageTop.setHeight(height)
self.imageTop.setWidth(width)
self.imageTop.setPosition(xpos, yoffset)
def show(self):
self.showing = True
self.window.addControl(self.imageBottom)
self.window.addControl(self.imageCenter)
self.window.addControl(self.imageTop)
def hide(self):
self.showing = False
self.window.removeControl(self.imageBottom)
self.window.removeControl(self.imageCenter)
self.window.removeControl(self.imageTop)
def _close(self):
if self.showing:
self.hide()
else:
pass
try:
self.window.clearProperties()
except Exception:
pass
# ============================================================
# Get resolution
# ============================================================
def _get_skin_resolution(self):
xmlFile = os.path.join(xbmc.translatePath("special://skin/"), "addon.xml")
xmldoc = minidom.parse(xmlFile)
res = xmldoc.getElementsByTagName("res")
xval = int(res[0].attributes["width"].value)
yval = int(res[0].attributes["height"].value)
return(xval, yval)
# ============================================================
# Display banner
# ============================================================
def displayBanner(imageloc, displaytime, position):
global myWidget
global intYOffset
global __addon__
__addon__ = xbmcaddon.Addon(id='service.lowerthird')
ActWin = xbmcgui.getCurrentWindowId()
myWidget = OverlayText(ActWin)
myWidget.show()
if position == 'top':
myWidget.imageBottom.setImage("")
myWidget.imageCenter.setImage("")
myWidget.imageTop.setImage(imageloc)
elif position == 'bottom':
myWidget.imageBottom.setImage(imageloc)
myWidget.imageCenter.setImage("")
myWidget.imageTop.setImage("")
else:
myWidget.imageBottom.setImage("")
myWidget.imageCenter.setImage(imageloc)
myWidget.imageTop.setImage("")
image = Image.open(open(imageloc, 'rb'))
width, height = image.size
myWidget.scaleimage(width, height, intYOffset)
xbmc.log('BANNERS >> STANDALONE INITIALIZING OVERLAY')
xbmc.sleep(displaytime)
try:
myWidget._close()
except Exception:
pass
myWidget = None
# ============================================================
# ------------------------------------------------------------
# Main
# ------------------------------------------------------------
# ============================================================
__addon__ = xbmcaddon.Addon(id='service.lowerthird')
__version__ = __addon__.getAddonInfo('version')
__addonwd__ = xbmc.translatePath(__addon__.getAddonInfo('path').decode("utf-8"))
myWidget = None
rt = None
intYOffset = int(__addon__.getSetting('yoffset'))
if __name__ == '__main__':
xbmc.log("BANNERS >> STANDALONE STARTED VERSION %s" % (__version__))
myWidget = None
try:
params = urlparse.parse_qs('&'.join(sys.argv[1:]))
notitxt = params.get('notitxt', None)[0]
imageloc = params.get('imageloc', None)[0]
displaytime = int(params.get('displaytime', None)[0])
position = params.get('position', None)[0]
except Exception:
imageloc = None
displaytime = None
position = None
notitxt = None
if imageloc and displaytime and position and notitxt:
success = xbmcvfs.exists(imageloc)
if success and displaytime > 1000 and displaytime < 300001 and (position == 'top' or position == 'bottom' or position == 'center'):
xbmc.log("BANNERS >> STANDALONE DISPLAY IMAGE: " + str(imageloc) + " >> TIMEOUT: " + str(displaytime) + " >> POSITION: " + str(position))
displayBanner(imageloc, displaytime, position)
else:
xbmc.log("BANNERS >> STANDALONE DISPLAY IMAGE ERROR: " + str(imageloc) + " >> TIMEOUT: " + str(displaytime) + " >> POSITION: " + str(position))
else:
__addon__.openSettings()
xbmc.log("BANNERS >> STANDALONE FINISHED")
# ------------------------------------------------------------
# ------------------------------------------------------------
# ------------------------------------------------------------
# ------------------------------------------------------------
# ------------------------------------------------------------
# ------------------------------------------------------------
# ------------------------------------------------------------
# ------------------------------------------------------------
# ------------------------------------------------------------
# ------------------------------------------------------------