Initial commit
authorMarcus Wikström <mece@ovi.com>
Wed, 27 Jan 2010 13:03:54 +0000 (15:03 +0200)
committerMarcus Wikström <mece@ovi.com>
Wed, 27 Jan 2010 13:03:54 +0000 (15:03 +0200)
13 files changed:
comic_widget.desktop [new file with mode: 0644]
comic_widget.py [new file with mode: 0644]
images/down.png [new file with mode: 0644]
images/down1.png [new file with mode: 0644]
images/left.png [new file with mode: 0644]
images/left1.png [new file with mode: 0644]
images/right.png [new file with mode: 0644]
images/right1.png [new file with mode: 0644]
images/star.png [new file with mode: 0644]
images/star1.png [new file with mode: 0644]
images/up.png [new file with mode: 0644]
images/up1.png [new file with mode: 0644]
welcome [deleted file]

diff --git a/comic_widget.desktop b/comic_widget.desktop
new file mode 100644 (file)
index 0000000..fc41d4b
--- /dev/null
@@ -0,0 +1,5 @@
+[Desktop Entry]
+Name=Comic Widget
+Comment=Simple Comic widget
+Type=python
+X-Path=comic_widget.py
diff --git a/comic_widget.py b/comic_widget.py
new file mode 100644 (file)
index 0000000..a253b72
--- /dev/null
@@ -0,0 +1,424 @@
+import hildon
+import hildondesktop
+import gtk
+import csv
+import urllib2
+import urllib
+import string
+import os
+import osso
+
+# constants. dbfile is the location of the csv
+# comiccache is the location of the images
+dbfile = "/home/user/.comicdb.csv"
+comiccache = "/home/user/MyDocs/comics/"
+comics = {"xkcd":{"name":"xkcd","link":"http://xkcd.org/","start":666,"dbfile":"/home/user/.comicdb.xkcd.csv"},
+               "sinfest":{"name":"Sinfest","link":"http://sinfest.com/","start":3400,"dbfile":"/home/user/.comicdb.sinfest.csv"}}
+
+# handling of the comics
+class ComicDb():
+       def __init__(self, comic):
+               #if no db, start from this comic id.
+               self.comic = comic
+               self.start = comics[self.comic]["start"]
+               self.dbfile = comics[self.comic]["dbfile"]
+
+               #if db file exist, read it
+               if os.path.isfile(self.dbfile) == True:
+                       dbf = open(self.dbfile, 'r')
+               # if not, create it.
+               else:
+                       dbf = open(self.dbfile, 'w')
+                       dbf.write('comic,id,link,url,filename,title\n')
+                       dbf.close()
+                       dbf = open(self.dbfile, 'r')
+                       self.fetch_latest_std(self.comic, self.start)
+
+               if not os.path.exists(comiccache + self.comic + "/"):
+                       os.makedirs(comiccache + self.comic + "/")
+               dbr = csv.DictReader(dbf)
+               self.db = []
+               for row in dbr:
+                       self.db.insert(0,row)
+               dbf.close()
+               self.currentcomic = 0
+
+       def get_comic(self):
+               print str(self.currentcomic)
+               if self.currentcomic < 0:
+                       self.refresh()
+                       self.currentcomic = 0
+               if  len(self.db) < (self.currentcomic + 1):
+                       self.currentcomic -= 1
+                       self.refresh()
+                       self.currentcomic = len(self.db) - 1
+                       
+               dbrow = self.db[self.currentcomic]
+               filename = comiccache + self.comic + "/" + dbrow['filename']
+               print filename + "\n"
+               
+               if os.path.isfile(filename):
+                       print "found, returning " + filename + "\n"
+                       return filename
+               else:
+                       #fetch file
+                       print filename + " not found\nretrieving " + dbrow['url'] + "\n"
+                       urllib.urlretrieve(dbrow['url'], filename)
+                       print "success\n"
+                       return filename
+
+       def get_current_row(self):
+               return self.db[self.currentcomic]               
+
+       def get_link(self):
+               print str(self.currentcomic)
+               if self.currentcomic < 0:
+                       self.refresh()
+                       self.currentcomic = 0
+               if  len(self.db) < (self.currentcomic + 1):
+                       self.currentcomic -= 1
+               return self.db[self.currentcomic]['link']
+
+
+
+       def insert_row(self, irow):
+               dbf = open(self.dbfile, 'a')
+               dbw = csv.writer(dbf)
+               dbw.writerow(irow)
+               dbf.close()
+
+       def insert_row_first(self, irow):
+               dbf = open(self.dbfile, 'w')
+               dbf.write('comic,id,link,url,filename,title\n')
+               dbw = csv.writer(dbf)
+               dbw.writerow(irow)
+               dbf.close()
+               dbf = open(self.dbfile, 'a')
+               dbw = csv.DictWriter(dbf, ['comic','id','link','url','filename','title'])
+               tmpdb = self.db
+               tmpdb.reverse()
+               for row in tmpdb:
+                       dbw.writerow(row)
+               dbf.close()
+
+       def refresh(self):
+               if len(self.db) < 1:
+                       self.fetch_latest_std(self.comic, self.start)
+               elif self.currentcomic == 0 or self.currentcomic < 0:
+                       self.fetch_latest_std(self.comic, self.db[0]['id'])
+               elif self.currentcomic == (len(self.db) - 1):
+                       self.fetch_earlier(self.comic, self.db[self.currentcomic]['id'])
+               dbf = open(self.dbfile, 'r')
+               dbr = csv.DictReader(dbf)
+               self.db = []
+               for row in dbr:
+                       self.db.insert(0,row)
+               dbf.close()
+
+       def fetch_earlier(self, comic, earliest):
+               number = int(earliest) - 1
+               if number < 0:
+                       return False
+               print "number is now: " + str(number) + "\n"
+               if comic == 'xkcd':
+                       link = "http://xkcd.org/" + str(number) + "/"
+               elif comic == 'sinfest':
+                       link = "http://www.sinfest.net/archive_page.php?comicID=" + str(number)
+               else:
+                       return False
+               print "link: " + link + "\n"
+               try:
+                       f = urllib2.urlopen(link)
+                       hcode = f.code
+               except:
+                       hcode = 404
+               print "got hcode = " + str(hcode) + "\n"
+               if (hcode != 200):
+                       return False
+               else:
+                       # Build db entry.
+                       # they look like: comic,id,link,url,filename,title
+                       # We already have comic, number/id and link
+                       
+                       if comic == 'xkcd':
+                               s = f.read()
+                               f.close()
+                               splt = string.split(s, "<h3>Image URL (for hotlinking/embedding): ", 1)
+                               splt2 = string.split(splt[1], "</h3>", 1)
+                               url = splt2[0]
+                               splt = string.split(splt[0], "<h1>", 1)
+                               splt = string.split(splt[1], "</h1>", 1)
+                               title = splt[0]
+
+                       elif comic == 'sinfest':
+                               s = f.read()
+                               f.close()
+                               splt = string.split(s, 'height="107"', 1)
+                               splt = string.split(splt[1], '<img src="', 1)
+                               splt = string.split(splt[1], '" alt="', 1)
+                               url = splt[0]
+                               if len(url) < 49:
+                                       print "Fake 404! Break break break!"
+                                       return False
+                               splt = string.split(splt[1], '" border="0" />', 1)
+                               title = splt[0]
+                       splt2 = string.rsplit(url, "/", 1)
+                       filename = splt2[1]                             
+                       irow = [comic,number,link,url,filename,title]
+                       print "got irow: "
+                       print irow
+                       print "\ninserting first...\n"
+                       self.insert_row_first(irow)
+
+
+       def fetch_latest_std(self, comic, latest):
+               
+               print "fetching new after " + str(comic) + " " + str(latest) + "\n"
+               hcode = 200
+               number = int(latest) + 1
+               while hcode == 200:
+                       print "number is now: " + str(number) + "\n"
+                       if comic == 'xkcd':
+                               link = "http://xkcd.org/" + str(number) + "/"
+                       elif comic == 'sinfest':
+                               link = "http://www.sinfest.net/archive_page.php?comicID=" + str(number)
+                       else:
+                               break
+                       print "link: " + link + "\n"
+                       try:
+                               f = urllib2.urlopen(link)
+                               hcode = f.code
+                       except:
+                               hcode = 404
+                       print "got hcode = " + str(hcode) + "\n"
+                       if (hcode != 200):
+                               break
+                       else:
+                               # Build db entry.
+                               # they look like: comic,id,link,url,filename,title
+                               # We already have comic, number/id and link
+                               
+                               if comic == 'xkcd':
+                                       s = f.read()
+                                       f.close()
+                                       splt = string.split(s, "<h3>Image URL (for hotlinking/embedding): ", 1)
+                                       splt2 = string.split(splt[1], "</h3>", 1)
+                                       url = splt2[0]
+                                       splt = string.split(splt[0], "<h1>", 1)
+                                       splt = string.split(splt[1], "</h1>", 1)
+                                       title = splt[0]
+
+                               elif comic == 'sinfest':
+                                       s = f.read()
+                                       f.close()
+                                       splt = string.split(s, 'height="107"', 1)
+                                       splt = string.split(splt[1], '<img src="', 1)
+                                       splt = string.split(splt[1], '" alt="', 1)
+                                       url = splt[0]
+                                       if len(url) < 49:
+                                               print "Fake 404! Break break break!"
+                                               break
+                                       splt = string.split(splt[1], '" border="0" />', 1)
+                                       title = splt[0]
+
+                               splt2 = string.rsplit(url, "/", 1)
+                               filename = splt2[1]                                     
+                               irow = [comic,number,link,url,filename,title]
+                               print "got irow: "
+                               print irow
+                               print "\ninserting...\n"
+                               
+                               self.insert_row(irow)
+
+                       number += 1
+
+class ComicHomePlugin(hildondesktop.HomePluginItem):
+       def __init__(self):
+               hildondesktop.HomePluginItem.__init__(self)
+               self.osso_c = osso.Context("comic_widget", "0.0.1", False)
+               self.osso_rpc = osso.Rpc(self.osso_c)
+               self.keys = comics.keys()
+               self.keypointer = 1
+               self.db = ComicDb(self.keys[self.keypointer])
+               self.comicname = comics[self.keys[self.keypointer]]['name']
+               screen = self.get_screen()
+               colormap = screen.get_rgba_colormap()
+               self.set_colormap(colormap)
+               #setup internal area
+               self.set_size_request(480, 230)
+               self.imgvpos = 0;
+               self.vbox = gtk.VBox()
+               self.hbox = gtk.HBox()
+               self.label = gtk.Label(self.comicname + " " + str(self.db.db[self.db.currentcomic]['id']))
+               self.e_goweb = gtk.EventBox()
+               self.e_open = gtk.EventBox()
+               self.e_switch = gtk.EventBox()
+               self.e_next = gtk.EventBox()
+               self.e_prev = gtk.EventBox()
+               self.e_up = gtk.EventBox()
+               self.e_down = gtk.EventBox()
+               self.comic_image = self.get_resized_pixmap(self.db.get_comic(), self.imgvpos)
+               self.comic_image.show()
+               self.next = gtk.image_new_from_file("/home/user/comic_widget/right.png")
+               self.prev = gtk.image_new_from_file("/home/user/comic_widget/left.png")
+               self.up = gtk.image_new_from_file("/home/user/comic_widget/up.png")
+               self.down = gtk.image_new_from_file("/home/user/comic_widget/down.png")
+               self.switch = gtk.image_new_from_file("/home/user/comic_widget/star.png")
+
+               self.e_goweb.add(self.label)
+               self.e_goweb.set_events(gtk.gdk.BUTTON_PRESS_MASK)
+               self.e_goweb.connect("button-press-event", self.view_comic)
+
+               self.e_open.add(self.comic_image)
+
+               self.e_switch.add(self.switch)
+               self.e_switch.set_events(gtk.gdk.BUTTON_PRESS_MASK)
+               self.e_switch.connect("button-press-event", self.switch_comic)
+
+
+               self.e_next.add(self.next)
+               self.e_next.set_events(gtk.gdk.BUTTON_PRESS_MASK)
+               self.e_next.connect("button-press-event", self.get_next)
+
+               self.e_prev.add(self.prev)
+               self.e_prev.set_events(gtk.gdk.BUTTON_PRESS_MASK)
+               self.e_prev.connect("button_press_event", self.get_prev)
+
+               self.e_up.add(self.up)
+               self.e_up.set_events(gtk.gdk.BUTTON_PRESS_MASK)
+               self.e_up.connect("button-press-event", self.scroll_up)
+
+               self.e_down.add(self.down)
+               self.e_down.set_events(gtk.gdk.BUTTON_PRESS_MASK)
+               self.e_down.connect("button-press-event", self.scroll_down)
+
+               self.vbox.pack_start(self.e_open,False,False,0)
+               self.vbox.pack_end(self.hbox,False,False,0)
+
+               self.hbox.pack_start(self.e_switch,False,False,5)
+               self.hbox.pack_start(self.e_goweb,False,False,5)
+               self.hbox.pack_end(self.e_next,False,False,5)
+               self.hbox.pack_end(self.e_down,False,False,5)
+               self.hbox.pack_end(self.e_up,False,False,5)
+               self.hbox.pack_end(self.e_prev,False,False,5)
+               self.vbox.show_all()
+               self.add(self.vbox)
+
+
+       def switch_comic(self, widget, event):
+               if not event.type == gtk.gdk.BUTTON_PRESS:
+                       return False
+               self.keypointer = (self.keypointer + 1) % 2
+               self.imgvpos = 0
+               self.db = []
+               print "switching to " + self.keys[self.keypointer]
+               self.comicname = comics[self.keys[self.keypointer]]['name']
+               self.db = ComicDb(self.keys[self.keypointer])
+               self.e_goweb.remove(self.label)
+               self.label = gtk.Label(self.comicname + " " + str(self.db.db[self.db.currentcomic]['id']))
+               self.e_goweb.add(self.label)
+               self.e_goweb.show_all()
+               self.e_open.remove(self.comic_image)
+               self.comic_image = self.get_resized_pixmap(self.db.get_comic(), self.imgvpos)
+               self.e_open.add(self.comic_image)
+               self.e_open.show_all()          
+
+       def switch_rel(self, widget, event):
+               if not event.type == gtk.gdk.BUTTON_RELEASE:
+                       return False
+               widget.remove(self.switch)
+               self.switch = gtk.image_new_from_file("/home/user/comic_widget/star.png")
+               widget.add(self.switch)
+               widget.show_all()
+
+       def view_comic(self, widget, event):
+               if not event.type == gtk.gdk.BUTTON_PRESS:
+                       return False
+               link = self.db.get_link()
+               self.osso_rpc.rpc_run_with_defaults("osso_browser", "open_new_window", (link,))
+
+       def scroll_down(self, widget, event):
+               if not event.type == gtk.gdk.BUTTON_PRESS:
+                       return False
+               self.e_open.remove(self.comic_image)
+               self.imgvpos = self.imgvpos + 50
+               self.comic_image = self.get_resized_pixmap(self.db.get_comic(), self.imgvpos)
+               self.e_open.add(self.comic_image)
+               self.e_open.show_all()
+
+       def scroll_up(self, widget, event):
+               if not event.type == gtk.gdk.BUTTON_PRESS:
+                       return False
+               self.e_open.remove(self.comic_image)
+               self.imgvpos = self.imgvpos - 50
+               if self.imgvpos < 0:
+                       self.imgvpos = 0
+               self.comic_image = self.get_resized_pixmap(self.db.get_comic(), self.imgvpos)
+               self.e_open.add(self.comic_image)
+               self.e_open.show_all()
+
+       def get_next(self, widget, event):
+               if not event.type == gtk.gdk.BUTTON_PRESS:
+                       return False
+               self.db.currentcomic -= 1
+               self.imgvpos = 0
+               self.e_open.remove(self.comic_image)
+               self.comic_image = self.get_resized_pixmap(self.db.get_comic(), self.imgvpos)
+               self.e_open.add(self.comic_image)
+               self.e_open.show_all()
+               self.e_goweb.remove(self.label)
+               self.label = gtk.Label(self.comicname + " " + str(self.db.db[self.db.currentcomic]['id']))
+               self.e_goweb.add(self.label)
+               self.e_goweb.show_all()
+                       
+       def get_prev(self, widget, event):
+               if not event.type == gtk.gdk.BUTTON_PRESS:
+                       return False
+               self.db.currentcomic += 1
+               self.imgvpos = 0
+               self.e_open.remove(self.comic_image)
+               self.comic_image = self.get_resized_pixmap(self.db.get_comic(), self.imgvpos)
+               self.e_open.add(self.comic_image)
+               self.e_open.show_all()
+               self.e_goweb.remove(self.label)
+               self.label = gtk.Label(self.comicname + " " + str(self.db.db[self.db.currentcomic]['id']))
+               self.e_goweb.add(self.label)
+               self.e_goweb.show_all()
+
+       def get_resized_pixmap(self, filename, vpos):
+               pixbuf = gtk.gdk.pixbuf_new_from_file(filename)
+               parent_buf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, pixbuf.get_has_alpha(), 8, 478, 190)
+               parent_buf.fill(0x00000000)
+               retimg = gtk.Image()
+               # get correct width/height
+               new_width = 0
+               new_height = 1
+               new_width = 478
+               new_height = int((478.0 / pixbuf.get_width()) * pixbuf.get_height())
+               scaled_buf = pixbuf.scale_simple(new_width,new_height,gtk.gdk.INTERP_BILINEAR)
+
+               if scaled_buf.get_height() > 190:
+                       if scaled_buf.get_height() - (vpos + 190) < 0:
+                               vpos = scaled_buf.get_height() - 190
+                       scaled_buf.copy_area(0,vpos,478,190,parent_buf,0,0)
+
+               else:
+                       tmpy = 190 - scaled_buf.get_height()
+                       if tmpy > 0:
+                               tmpy = tmpy / 2
+
+                       scaled_buf.copy_area(0,vpos,478,scaled_buf.get_height(),parent_buf,0,tmpy)
+
+               retimg.set_from_pixbuf(parent_buf)
+               return retimg
+
+
+hd_plugin_type = ComicHomePlugin
+
+
+if __name__ == "__main__":
+       import gobject
+       gobject.type_register(hd_plugin_type)
+       obj = gobject.new(hd_plugin_type, plugin_id="plugin_id")
+       obj.show_all()
+       gtk.main()
diff --git a/images/down.png b/images/down.png
new file mode 100644 (file)
index 0000000..650aa28
Binary files /dev/null and b/images/down.png differ
diff --git a/images/down1.png b/images/down1.png
new file mode 100644 (file)
index 0000000..3494e7a
Binary files /dev/null and b/images/down1.png differ
diff --git a/images/left.png b/images/left.png
new file mode 100644 (file)
index 0000000..3d24cc1
Binary files /dev/null and b/images/left.png differ
diff --git a/images/left1.png b/images/left1.png
new file mode 100644 (file)
index 0000000..1ef38cd
Binary files /dev/null and b/images/left1.png differ
diff --git a/images/right.png b/images/right.png
new file mode 100644 (file)
index 0000000..1f2764f
Binary files /dev/null and b/images/right.png differ
diff --git a/images/right1.png b/images/right1.png
new file mode 100644 (file)
index 0000000..a6d198b
Binary files /dev/null and b/images/right1.png differ
diff --git a/images/star.png b/images/star.png
new file mode 100644 (file)
index 0000000..c9614e5
Binary files /dev/null and b/images/star.png differ
diff --git a/images/star1.png b/images/star1.png
new file mode 100644 (file)
index 0000000..cfaaad7
Binary files /dev/null and b/images/star1.png differ
diff --git a/images/up.png b/images/up.png
new file mode 100644 (file)
index 0000000..56acae9
Binary files /dev/null and b/images/up.png differ
diff --git a/images/up1.png b/images/up1.png
new file mode 100644 (file)
index 0000000..ae1c5c9
Binary files /dev/null and b/images/up1.png differ
diff --git a/welcome b/welcome
deleted file mode 100644 (file)
index e69de29..0000000