diff --git a/nrsc5-dui.py b/nrsc5-dui.py
index 6b18f69..153e104 100644
--- a/nrsc5-dui.py
+++ b/nrsc5-dui.py
@@ -31,6 +31,9 @@ import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GObject, Gdk, GdkPixbuf, GLib
+import urllib3
+from OpenSSL import SSL
+
# print debug messages to stdout (if debugger is attached)
debugMessages = (sys.gettrace() != None)
debugAutoStart = True
@@ -53,6 +56,7 @@ class NRSC5_DUI(object):
self.getControls() # get controls and windows
self.initStreamInfo() # initilize stream info and clear status widgets
+ self.http = urllib3.PoolManager()
self.debugLog("Local path determined as " + runtimeDir)
@@ -85,6 +89,7 @@ class NRSC5_DUI(object):
self.logFile = None # nrsc5 log file
self.lastImage = "" # last image file displayed
self.coverImage = ""
+ self.id3Changed = False
#self.lastXHDR = ["", -1] # the last XHDR data received
self.lastXHDR = "" # the last XHDR data received
self.stationStr = "" # current station frequency (string)
@@ -309,6 +314,82 @@ class NRSC5_DUI(object):
#self.imgMap.set_from_stock(Gtk.STOCK_MISSING_IMAGE, Gtk.IconSize.LARGE_TOOLBAR)
self.imgMap.set_from_icon_name("MISSING_IMAGE", Gtk.IconSize.LARGE_TOOLBAR)
+ def id3_did_change(self):
+ oldTitle = self.txtTitle.get_label()
+ oldArtist = self.txtArtist.get_label()
+ newTitle = self.streamInfo["Title"]
+ newArtist = self.streamInfo["Artist"]
+ return ((newArtist != oldArtist) and (newTitle != oldTitle))
+
+ def get_cover_data(self, response):
+ check = -1
+ resultUrl = ""
+ resultArtist = ""
+ m = re.search(r"card card_large float_fix",response)
+ if (m.start() > -1):
+ response = response[m.start():]
+ m = re.search(r"
-1):
+ response = response[m.start()+15:]
+ m = re.search(r"\"",response)
+ if (m.start() > -1):
+ resultUrl = response[:m.start()]
+ response = response[m.start()+1:]
+ m = re.search(r" -1):
+ response = response[m.start()+13:]
+ m = re.search(r"\"",response)
+ if (m.start() > -1):
+ resultArtist = response[:m.start()]
+ response = response[m.start()+1:]
+ check = 0
+ return check, response, resultUrl, resultArtist
+
+
+ def get_cover_image_online(self):
+ got_cover = False
+
+ # only change when there's a new ID3
+ if (self.id3Changed):
+ baseStr = str(self.streamInfo["Artist"]+" - "+self.streamInfo["Title"]).replace("/","_").replace(":","_").replace("and","&")
+ saveStr = "aas/"+ baseStr.replace(" ","_")+".jpg"
+ searchStr = baseStr.replace(" ","+")
+
+ # does it already exist?
+ if (os.path.isfile(saveStr)):
+ self.coverImage = saveStr
+
+ # if not, get it from Discogs
+ else:
+ try:
+ searchStr = "https://www.discogs.com/search/?q="+searchStr+"&type=all"
+ r = self.http.request('GET',searchStr)
+ if (r.status == 200):
+ response = r.data.decode('utf-8')
+
+ # loop through the page until you either get an artist match or you run out of page (check)
+ while (not got_cover):
+ resultUrl = ""
+ resultArtist = ""
+ check, response, resultUrl, resultArtist = self.get_cover_data(response)
+ got_cover = (resultArtist.lower() in self.streamInfo["Artist"].lower()) and (check == 0)
+
+ # if you got a match, save it
+ if (resultUrl != ""):
+ with self.http.request('GET', resultUrl, preload_content=False) as r, open(saveStr, 'wb') as out_file:
+ if (r.status == 200):
+ shutil.copyfileobj(r, out_file)
+ self.coverImage = saveStr
+
+ # If no match use the station logo if there is one
+ else:
+ self.coverImage = self.stationLogos[self.stationStr][self.streamNum]
+ except:
+ pass
+
+ # now display it by simulating a window resize
+ self.on_cover_resize(self.mainWindow)
+
def displayLogo(self):
global aasDir
#if (self.stationLogos.has_key(self.stationStr)):
@@ -763,6 +844,7 @@ class NRSC5_DUI(object):
image = ""
#ber = [self.streamInfo["BER"][0]*100,self.streamInfo["BER"][1]*100,self.streamInfo["BER"][2]*100,self.streamInfo["BER"][3]*100]
ber = [self.streamInfo["BER"][i]*100 for i in range(4)]
+ self.id3Changed = self.id3_did_change()
self.txtTitle.set_text(self.streamInfo["Title"])
self.txtTitle.set_tooltip_text(self.streamInfo["Title"])
self.txtArtist.set_text(self.streamInfo["Artist"])
@@ -837,6 +919,9 @@ class NRSC5_DUI(object):
# second param is lot id, if -1, show cover, otherwise show cover
# technically we should show the file with the matching lot id
+ if (self.cbCovers.get_active() and self.id3Changed):
+ self.get_cover_image_online()
+
#if (int(self.lastXHDR[1]) > 0 and self.streamInfo["Cover"] != None):
if self.lastXHDR == "0":
imagePath = os.path.join(aasDir, self.streamInfo["Cover"])
@@ -1302,6 +1387,7 @@ class NRSC5_DUI(object):
self.spinRTL = builder.get_object("spinRTL")
self.cbAutoGain = builder.get_object("cbAutoGain")
self.cbLog = builder.get_object("cbLog")
+ self.cbCovers = builder.get_object("cbCovers")
self.btnPlay = builder.get_object("btnPlay")
self.btnStop = builder.get_object("btnStop")
self.btnBookmark = builder.get_object("btnBookmark")
@@ -1478,6 +1564,8 @@ class NRSC5_DUI(object):
self.spinPPM.set_value(config["PPMError"])
self.spinRTL.set_value(config["RTL"])
self.cbLog.set_active(config["LogToFile"])
+ if ("DLoadArt" in config):
+ self.cbCovers.set_active(config["DLoadArt"])
self.bookmarks = config["Bookmarks"]
for bookmark in self.bookmarks:
self.lsBookmarks.append(bookmark)
@@ -1556,6 +1644,7 @@ class NRSC5_DUI(object):
"PPMError" : int(self.spinPPM.get_value()),
"RTL" : int(self.spinRTL.get_value()),
"LogToFile" : self.cbLog.get_active(),
+ "DLoadArt" : self.cbCovers.get_active(),
"Bookmarks" : self.bookmarks,
"MapData" : self.mapData,
}