Check-in [8c0b288e66]
Overview
Comment: | Use GenericChannel.prepare_filters hook to update "favicon" filenames in rows. Precompile row_to_fn regexps. Fix google_find_homepage params (just a function, not a method). |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
8c0b288e66ddc83c073dba82eb8aa0f1 |
User & Date: | mario on 2015-05-12 20:03:29 |
Other Links: | manifest | tags |
Context
2015-05-12
| ||
20:03 | Remove plugin #color: check-in: b4558a4599 user: mario tags: trunk | |
20:03 | Use GenericChannel.prepare_filters hook to update "favicon" filenames in rows. Precompile row_to_fn regexps. Fix google_find_homepage params (just a function, not a method). check-in: 8c0b288e66 user: mario tags: trunk | |
20:01 | Split up post-proccessing filters (run after load/update_streams), use filter callback list now. Separate prepare display filters as well (so to hook dedicated favicon callback into). Move conf.show_favicons option into uikit.columns() signature. check-in: 475f736d5d user: mario tags: trunk | |
Changes
Modified channels/favicon.py from [7cf3ceafbb] to [bdefdbfe53].
︙ | ︙ | |||
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | # depend on a recent Pillow2 python module (superseding the PIL module). # Else may display images with fragments if converted from ICO files. import os, os.path from io import BytesIO import re from config import * import ahttp from PIL import Image from uikit import gtk #import traceback # Ensure that we don't try to download a single favicon twice per session. # If it's not available the first time, we won't get it after switching # stations back and forth either. So URLs are skipped simply. tried_urls = [] # Has recently been rewritten, is somewhat less entangled with other # modules now: # | > | | | | > | 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | # depend on a recent Pillow2 python module (superseding the PIL module). # Else may display images with fragments if converted from ICO files. import os, os.path from io import BytesIO import re import channels from config import * import ahttp from PIL import Image from uikit import gtk #import traceback # Ensure that we don't try to download a single favicon twice per session. # If it's not available the first time, we won't get it after switching # stations back and forth either. So URLs are skipped simply. tried_urls = [] # Has recently been rewritten, is somewhat less entangled with other # modules now: # # · GenericChannel presets row["favicon"] with cache image filenames # in any case. It uses row["homepage"] or row["img"] as template. # # · The url-to-filename shortening functionality in GenChan.prepare() # is identical to that in row_to_fn() here. # # · uikit.columns() merely checks row["favicon"] for file existence # when redrawing a station list. # # · main only calls .update_playing() via hooks["play"], and the menu # invokes .update_all() # # · urllib is no longer required. Using just ahttp/requests API now. # # · Might need unhtml() utility from channels/__init__ later.. # # · Still need to consolidate config options → Move main favicon # options here? |
︙ | ︙ | |||
85 86 87 88 89 90 91 92 93 94 95 96 97 98 | parent.hooks["play"].append(self.update_playing) # Prepare favicon cache directory conf.icon_dir = conf.dir + "/icons" if not os.path.exists(conf.icon_dir): os.mkdir(conf.icon_dir) open(icon_dir+"/.nobackup", "a").close() # Main callback: update favicon cache for complete list of station rows def update_all(self, *args, **kwargs): #kwargs[pixstore] = self.parent.channel()._ls, ... self.parent.thread(self.update_rows, *args, **kwargs) | > > > | 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | parent.hooks["play"].append(self.update_playing) # Prepare favicon cache directory conf.icon_dir = conf.dir + "/icons" if not os.path.exists(conf.icon_dir): os.mkdir(conf.icon_dir) open(icon_dir+"/.nobackup", "a").close() # Hook into channel/streams updating pipine channels.GenericChannel.prepare_filters.append(self.prepare_filter_favicon) # Main callback: update favicon cache for complete list of station rows def update_all(self, *args, **kwargs): #kwargs[pixstore] = self.parent.channel()._ls, ... self.parent.thread(self.update_rows, *args, **kwargs) |
︙ | ︙ | |||
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 | try: p = gtk.gdk.pixbuf_new_from_file(fn) ls[i][pix_entry] = p except Exception as e: log.ERR("Update_pixstore image", fn, "error:", e) #--- somewhat unrelated --- # # Should become a distinct feature plugin. - It just depends on correct # invocation order for both plugins to interact. # Googling is often blocked anyway, because this is clearly a bot request. # And requests are tagged with ?client=streamtuner2 still purposefully. # | > > > | | 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 | try: p = gtk.gdk.pixbuf_new_from_file(fn) ls[i][pix_entry] = p except Exception as e: log.ERR("Update_pixstore image", fn, "error:", e) # Run after any channel .update_streams() to populate "favicon" def prepare_filter_favicon(self, row): row["favicon"] = row_to_fn(row) #--- somewhat unrelated --- # # Should become a distinct feature plugin. - It just depends on correct # invocation order for both plugins to interact. # Googling is often blocked anyway, because this is clearly a bot request. # And requests are tagged with ?client=streamtuner2 still purposefully. # def google_find_homepage(row): """ Searches for missing homepage URL via Google. """ if row.get("url") not in tried_urls: tried_urls.append(row.get("url")) if row.get("title"): rx_t = re.compile('^(([^-:]+.?){1,2})') rx_u = re.compile(r'/url\?q=(https?://[^"&/]+)') |
︙ | ︙ | |||
214 215 216 217 218 219 220 221 222 223 224 | pass #----------------- # Convert row["img"] or row["homepage"] into local favicon cache filename def row_to_fn(row): url = row.get("img") or row.get("homepage") or None if url: url = url.lower() | > > | | | 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 | pass #----------------- # Convert row["img"] or row["homepage"] into local favicon cache filename rx_strip_proto = re.compile("^\w+://|/$") rx_non_wordchr = re.compile("[^\w._-]") def row_to_fn(row): url = row.get("img") or row.get("homepage") or None if url: url = url.lower() url = rx_strip_proto.sub("", url) # strip proto:// and trailing / url = rx_non_wordchr.sub("_", url) # remove any non-word characters url = "{}/{}.png".format(conf.icon_dir, url) return url # Copy banner row["img"] into icons/ directory def banner_localcopy(url, fn): |
︙ | ︙ |