Index: contrib/theme_installer.py ================================================================== --- contrib/theme_installer.py +++ contrib/theme_installer.py @@ -58,11 +58,12 @@ # plugin info module = "theme_installer" meta = plugin_meta() category = "themes" theme_dir = conf.dir + "/themes/" - themes_url = "http://milki.include-once.org/streamtuner2/themes/" +# themes_url = "http://milki.include-once.org/streamtuner2/themes/" + themes_url = "http://oha59.bplaced.net/streamtuner2/themes/" themes_csv = "themes.json" mime = "zip/gtk-theme" parent = None bm = None @@ -91,11 +92,11 @@ return # look if theme exists fn = "%s%s/%s" % (self.theme_dir, conf.theme, "gtk-2.0/gtkrc") if not os.path.exists(fn): return - log.GTK_THEME_FILE(fn) + log.GTK_THEME_FILE("XYZ " + fn) # .GTKRC/Gtk2 uikit.gtk.rc_parse_string("module_path \"%s:%s\"\n" % (uikit.gtk.rc_get_module_dir(), self.theme_dir)) uikit.gtk.rc_parse(fn) uikit.gtk.rc_reset_styles(uikit.gtk.settings_get_for_screen(uikit.gtk.gdk.screen_get_default())) @@ -141,10 +142,11 @@ if not os.path.exists(d["favicon"]): fi.banner_localcopy(d["img"], d["favicon"], 64) log.COPY( d["img"], d["favicon"] ) return r + # invoked by action. module when encounterin a zip/gtk-theme links def install_handler(self, row, audioformat, source, assoc): if not "url" in row: return @@ -156,10 +158,12 @@ with open(zip, "wb") as f: f.write(ahttp.get(row["url"], binary=True)) # extract z = zipfile.ZipFile(zip) z.extractall(self.theme_dir) + z.close() + os.remove(zip) ls = z.namelist() dll = [fn for fn in ls if re.search("\w+\.(dll|so)$", fn)] base = [m.group(1) for fn in ls for m in [re.match("^([\w\s\-\.]+)/gtk-2.0/.+", fn)] if m] # move *.dll / *.so @@ -167,13 +171,38 @@ if os.path.exists(gtk_dir) and os.access(gtk_dir, os.W_OK): for fn in dll: if fn.find("/") > 0: # create lib/engines/.../ if given try: os.makedirs(self.theme_dir + os.path.basename(fn)) except: pass # copy file - if shutil.copy(self.theme_dir + fn, gtk_dir): - break + try: + if shutil.copy(self.theme_dir + fn, gtk_dir): + break + except Exception as e: + log.THEME_INSTALL("Copy Gtk theme engine error ", e) + self.parent.status('⛔ Set theme unsuccessful. - Check access rights!', timeout=22, markup=1) + self.clear_theme(ls, dll) + return + else: + self.clear_theme(ls) + return # enable + if dll: + self.clear_dll(dll) + conf.theme = base[0] self.apply_theme(True) conf.save() + # delete theme files if application failed + def clear_theme(self, ls, dll): + for fn in ls: + try: + shutil.rmtree(self.theme_dir + fn) + except: pass # probably not found + if dll: + self.clear_dll(dll) + + # delete theme engine dll + def clear_dll(self, dll): + for fn in dll: + os.remove(self.theme_dir + fn)