Add Station Logo
Added means to add a station logo from an image URL. Entry is activated by right clicking in the Album Art area while a station is playing. Typing or pasting the URL and clicking Ok downloads it and sets the station logo of the playing station with it.
This commit is contained in:
parent
f234b261ad
commit
3d29840e9c
77
nrsc5-dui.py
77
nrsc5-dui.py
@ -31,6 +31,9 @@ import gi
|
|||||||
gi.require_version("Gtk", "3.0")
|
gi.require_version("Gtk", "3.0")
|
||||||
from gi.repository import Gtk, GObject, Gdk, GdkPixbuf, GLib
|
from gi.repository import Gtk, GObject, Gdk, GdkPixbuf, GLib
|
||||||
|
|
||||||
|
import urllib3
|
||||||
|
from OpenSSL import SSL
|
||||||
|
|
||||||
import musicbrainzngs
|
import musicbrainzngs
|
||||||
|
|
||||||
# print debug messages to stdout (if debugger is attached)
|
# print debug messages to stdout (if debugger is attached)
|
||||||
@ -56,6 +59,7 @@ class NRSC5_DUI(object):
|
|||||||
|
|
||||||
self.getControls() # get controls and windows
|
self.getControls() # get controls and windows
|
||||||
self.initStreamInfo() # initilize stream info and clear status widgets
|
self.initStreamInfo() # initilize stream info and clear status widgets
|
||||||
|
self.http = urllib3.PoolManager()
|
||||||
|
|
||||||
self.debugLog("Local path determined as " + runtimeDir)
|
self.debugLog("Local path determined as " + runtimeDir)
|
||||||
|
|
||||||
@ -135,6 +139,11 @@ class NRSC5_DUI(object):
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.slPopup = None # entry for external station logo URL
|
||||||
|
self.slData = {
|
||||||
|
"externalURL" : ""
|
||||||
|
}
|
||||||
|
|
||||||
self.ServiceDataType = {
|
self.ServiceDataType = {
|
||||||
0 : "Non_Specific",
|
0 : "Non_Specific",
|
||||||
1 : "News",
|
1 : "News",
|
||||||
@ -907,6 +916,40 @@ class NRSC5_DUI(object):
|
|||||||
# delete the map viewer
|
# delete the map viewer
|
||||||
self.mapViewer = None
|
self.mapViewer = None
|
||||||
|
|
||||||
|
def on_alignmentCover_clicked(self, widget, event):
|
||||||
|
if (event.button == Gdk.BUTTON_SECONDARY):
|
||||||
|
if (self.slPopup is None) and (self.playing):
|
||||||
|
self.slPopup = NRSC5_SLPopup(self, self.slPopupCallback, self.slData)
|
||||||
|
self.slPopup.txtEntry.set_text(self.slData['externalURL'])
|
||||||
|
self.slPopup.entryWindow.show()
|
||||||
|
# now center it
|
||||||
|
winX, winY = self.mainWindow.get_position()
|
||||||
|
winW, winH = self.mainWindow.get_size()
|
||||||
|
slW, slH = self.slPopup.entryWindow.get_size()
|
||||||
|
self.slPopup.entryWindow.move(int(winW/2 - slW/2)+winX, int(winH/2 - slH/2)+winY)
|
||||||
|
self.slPopup.entryWindow.set_keep_above(True)
|
||||||
|
|
||||||
|
def slPopupCallback(self):
|
||||||
|
extensions = ['.gif','.jpg','.jpeg','.png']
|
||||||
|
useExt = ""
|
||||||
|
self.slData['externalURL'] = self.slPopup.txtEntry.get_text()
|
||||||
|
self.slPopup = None
|
||||||
|
if (self.slData['externalURL'] != ""):
|
||||||
|
freq = int((self.spinFreq.get_value()+0.005)*100) + int(self.streamNum + 1)
|
||||||
|
fileName = str(freq)+"_SL"+self.streamInfo["Callsign"]+"$$"+str(int(self.streamNum + 1))
|
||||||
|
for extension in extensions:
|
||||||
|
if extension in self.slData['externalURL']:
|
||||||
|
useExt = extension
|
||||||
|
break
|
||||||
|
if (useExt != ""):
|
||||||
|
fileName = fileName + useExt
|
||||||
|
saveStr=os.path.join(aasDir,fileName)
|
||||||
|
with self.http.request('GET',self.slData['externalURL'], preload_content=False) as r, open(saveStr, 'wb') as out_file:
|
||||||
|
if(r.status == 200):
|
||||||
|
shutil.copyfileobj(r, out_file)
|
||||||
|
self.stationLogos[self.stationStr][self.streamNum] = fileName
|
||||||
|
self.displayLogo()
|
||||||
|
|
||||||
def play(self):
|
def play(self):
|
||||||
FNULL = open(os.devnull, 'w')
|
FNULL = open(os.devnull, 'w')
|
||||||
FTMP = open('tmp.log','w')
|
FTMP = open('tmp.log','w')
|
||||||
@ -1527,6 +1570,7 @@ class NRSC5_DUI(object):
|
|||||||
# get controls
|
# get controls
|
||||||
self.image1 = builder.get_object("image1")
|
self.image1 = builder.get_object("image1")
|
||||||
self.notebookMain = builder.get_object("notebookMain")
|
self.notebookMain = builder.get_object("notebookMain")
|
||||||
|
self.frameCover = builder.get_object("frameCover")
|
||||||
self.alignmentCover = builder.get_object("alignmentCover")
|
self.alignmentCover = builder.get_object("alignmentCover")
|
||||||
self.imgCover = builder.get_object("imgCover")
|
self.imgCover = builder.get_object("imgCover")
|
||||||
self.alignmentMap = builder.get_object("alignment_map")
|
self.alignmentMap = builder.get_object("alignment_map")
|
||||||
@ -1608,6 +1652,11 @@ class NRSC5_DUI(object):
|
|||||||
|
|
||||||
self.mainWindow.connect("check-resize", self.on_cover_resize)
|
self.mainWindow.connect("check-resize", self.on_cover_resize)
|
||||||
|
|
||||||
|
self.alignmentCover.set_sensitive(True)
|
||||||
|
self.alignmentCover.set_has_window(True)
|
||||||
|
self.alignmentCover.set_events(Gdk.EventMask.BUTTON_PRESS_MASK)
|
||||||
|
self.alignmentCover.connect("button-press-event", self.on_alignmentCover_clicked)
|
||||||
|
|
||||||
def initStreamInfo(self):
|
def initStreamInfo(self):
|
||||||
# stream information
|
# stream information
|
||||||
self.streamInfo = {
|
self.streamInfo = {
|
||||||
@ -1843,6 +1892,34 @@ class NRSC5_DUI(object):
|
|||||||
now = datetime.datetime.now()
|
now = datetime.datetime.now()
|
||||||
print (now.strftime("%b %d %H:%M:%S : ") + message)
|
print (now.strftime("%b %d %H:%M:%S : ") + message)
|
||||||
|
|
||||||
|
class NRSC5_SLPopup(object):
|
||||||
|
def __init__(self, parent, callback, data):
|
||||||
|
global resDir
|
||||||
|
# setup gui
|
||||||
|
builder = Gtk.Builder()
|
||||||
|
builder.add_from_file(os.path.join(resDir,"entryForm.glade"))
|
||||||
|
builder.connect_signals(self)
|
||||||
|
|
||||||
|
self.parent = parent
|
||||||
|
self.callback = callback
|
||||||
|
self.data = data
|
||||||
|
|
||||||
|
# get the controls
|
||||||
|
self.entryWindow = builder.get_object("entryWindow")
|
||||||
|
self.txtEntry = builder.get_object("txtEntry")
|
||||||
|
self.btn_cancel = builder.get_object("btn_cancel")
|
||||||
|
self.btn_ok = builder.get_object("btn_ok")
|
||||||
|
|
||||||
|
self.entryWindow.connect("delete-event", self.on_entryWindow_delete)
|
||||||
|
|
||||||
|
def on_cleanup(self, btn):
|
||||||
|
if (btn == self.btn_cancel):
|
||||||
|
self.txtEntry.set_text('')
|
||||||
|
self.entryWindow.close()
|
||||||
|
|
||||||
|
def on_entryWindow_delete(self, *args):
|
||||||
|
self.callback() # run the callback
|
||||||
|
|
||||||
class NRSC5_Map(object):
|
class NRSC5_Map(object):
|
||||||
def __init__(self, parent, callback, data):
|
def __init__(self, parent, callback, data):
|
||||||
global resDir
|
global resDir
|
||||||
|
Loading…
x
Reference in New Issue
Block a user