Check-in [aac4fcacbf]
Overview
Comment: | Implement favicon live updating. Play event and download_all now pass the treestore, with row index, and pix_entry number (column index in liststore). Favicon module checks for downloaded images twice now, and updates PixBuf in ListStore. (Works for both single station view, and download_all.) |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
aac4fcacbfaafe669d49d9db4571d8c4 |
User & Date: | mario on 2015-05-09 21:40:07 |
Other Links: | manifest | tags |
Context
2015-05-09
| ||
21:41 | Fix super slow requests download for Xiph YP.XML, due to automatic charset detected in requests.text access. Override encoding= now and manually .decode() known "utf-8" charset. check-in: 06fe0ef3db user: mario tags: trunk | |
21:40 | Implement favicon live updating. Play event and download_all now pass the treestore, with row index, and pix_entry number (column index in liststore). Favicon module checks for downloaded images twice now, and updates PixBuf in ListStore. (Works for both single station view, and download_all.) check-in: aac4fcacbf user: mario tags: trunk | |
21:38 | Prepare for more complex hooks["play"] invocation (ignore args, kwargs). check-in: 5fbe0ccd0c user: mario tags: trunk | |
Changes
Modified favicon.py from [684fc768c9] to [9ae90f0624].
︙ | ︙ | |||
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | from compat2and3 import xrange, urllib import re from config import * from threading import Thread import ahttp import compat2and3 from PIL import Image # 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 tried_urls = [] # walk through entries | > | | | | > | < | > > > | | > > > > > > > > > > > > > > > > > > | 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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | from compat2and3 import xrange, urllib import re from config import * from threading import Thread import ahttp import compat2and3 from PIL import Image from uikit import gtk # 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 tried_urls = [] # walk through entries def download_all(*args, **kwargs): t = Thread(target=download_thread, args=args, kwargs=kwargs) t.start() def download_thread(entries, pixstore=None): for i,e in enumerate(entries): # try just once if e.get("homepage") in tried_urls: continue # retrieve specific img url as favicon elif e.get("img"): localcopy(e["img"], True) tried_urls.append(e.get("img")) # favicon from homepage URL elif e.get("homepage"): download(e["homepage"]) tried_urls.append(e.get("homepage")) # Update TreeView update_pixstore(e, pixstore, i) pass # download a single favicon for currently playing station def download_playing(row, pixstore=None): if conf.google_homepage and not row.get("homepage"): google_find_homepage(row) if conf.load_favicon and row.get("homepage"): download_all([row], pixstore=pixstore) pass # Update favicon in treeview/liststore def update_pixstore(row, pixstore=None, row_i=None): log.PIXSTORE(pixstore, row_i) if pixstore: ls, pix_entry, i = pixstore if i is None: i = row_i fn = None if row.get("favicon"): fn = row["favicon"] elif row.get("img"): fn = localcopy(row["img"], False) elif row.get("homepage"): fn = file(row["homepage"]) if fn and os.path.exists(fn): p = gtk.gdk.pixbuf_new_from_file(fn) ls[i][pix_entry] = p #--- unrelated --- 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")) |
︙ | ︙ |
Modified st2.py from [833ae6e3d8] to [7768280a8d].
︙ | ︙ | |||
258 259 260 261 262 263 264 | return self.row().get(name) # Play button def on_play_clicked(self, widget, event=None, *args): self.status("Starting player...") | | > > | | 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 | return self.row().get(name) # Play button def on_play_clicked(self, widget, event=None, *args): self.status("Starting player...") channel = self.channel() pixstore = [channel._ls, channel._pix_entry, channel.rowno()] row = channel.play() self.status("") [callback(row, pixstore=pixstore) for callback in self.hooks["play"]] # Recording: invoke streamripper for current stream URL def on_record_clicked(self, widget): self.status("Recording station...") row = self.channel().record() [callback(row) for callback in self.hooks["record"]] |
︙ | ︙ | |||
319 320 321 322 323 324 325 | # Reload category tree def update_categories(self, widget): Thread(target=self.channel().reload_categories).start() # Menu invocation: refresh favicons for all stations in current streams category def update_favicons(self, widget): | | | | 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 | # Reload category tree def update_categories(self, widget): Thread(target=self.channel().reload_categories).start() # Menu invocation: refresh favicons for all stations in current streams category def update_favicons(self, widget): ch = self.channel() favicon.download_all(entries=ch.stations(), pixstore=[ch._ls, ch._pix_entry, None]) # Save stream to file (.m3u) def save_as(self, widget): row = self.row() default_fn = row["title"] + ".m3u" fn = uikit.save_file("Save Stream", None, default_fn, [(".m3u","*m3u"),(".pls","*pls"),(".xspf","*xspf"),(".jspf","*jspf"),(".smil","*smil"),(".asx","*asx"),("all files","*")]) if fn: |
︙ | ︙ |