rendered paste body#!/usr/bin/env python
# -*- coding: iso8859-15 -*-
import mmsv2gui
import os
import sys
import StringIO
import Image
import ImageFilter
#import amazon
import sqlite3
import ImageChops
class PictureUpdater(mmsv2gui.Window):
# bg = None
tc = None
exit = None
height = 600
width = 800
defaultcolor=(0,0,0,255)
button_exit = None
butto_exitpos = (0,0)
pic = None
picsize = (0,0)
picpos = (0,0)
list = None
listsize = (0,0)
listpos = (0,0)
prog = None
progpos = (0,0)
progsize = (0,0)
title = None
titlepos = (0,0)
titlesize = (0,0)
run = None
runsize = (0,0)
runpos = (0,0)
up = None
def __init__(self):
self.height = self.getHeight()
self.width = self.getWidth()
self.tc = ThemeConfig()
self.button_exit = self.create_exit_button()
bgfile = self.tc.get_file("background","audio")
path,ext = os.path.splitext(bgfile)
if self.height /10 == self.width/16 :
bgfile = path + "-16-10"+ ext
elif self.height /9 == self.width/16 :
bgfile = path +"-16-9"+ ext
else: bgfile = path +"-4-3"+ ext
self.bg = mmsv2gui.ImageControl(0, 0, self.getWidth(), self.getHeight(), bgfile)
self.image = self.create_image(os.path.join(self.tc.get_themepath(),"question.png"))
self.list = self.create_list()
self.up = updatepics(amazon())
self.title = self.create_title()
self.run = self.create_run()
self.addControl(self.bg)
self.addControl(self.title)
self.addControl(self.button_exit)
self.addControl(self.list)
self.addControl(self.image)
self.addControl(self.run)
self.run.controlRight(self.button_exit)
self.button_exit.controlLeft(self.run)
self.setFocus(self.button_exit)
mmsv2gui.Window.__init__(self)
def create_run(self):
xpos = 75
ypos = self.height -150
xsize = 50
ysize = 50
run = mmsv2gui.ButtonControl(xpos,ypos,xsize,ysize,nofocus=self.tc.get_file("search","general"),focus=self.create_focused_image(self.tc.get_file("search","general")))
return run
def create_title(self):
xsize = 300
ysize = 50
xpos = (self.width - xsize)/2
ypos = 25
title = mmsv2gui.LabelControl(xpos, ypos, xsize, ysize)
title.setLabel("Cover downloader")
self.titlesize=(xsize,ysize)
self.titlepos=(xpos,ypos)
return title
def create_exit_button(self):
xsize,ysize = Image.open(self.tc.get_file("quit")).size
tmpfile= self.create_focused_image(self.tc.get_file("quit"))
return mmsv2gui.ButtonControl(self.width -120,self.height-150, xsize,ysize,focus = tmpfile, nofocus = self.tc.get_file("quit"))
def create_focused_image(self,img):
image = Image.open(img)
bgleft = Image.open(self.tc.get_file("marked_left","audio"))
bgright = Image.open(self.tc.get_file("marked_right","audio"))
xsize, ysize = image.size
ret = Image.new("RGBA",(xsize,ysize),(255,255,255,255))
ret.paste(bgleft.resize((xsize/2,ysize)),(0,0))
ret.paste(bgright.resize((xsize/2,ysize)),(xsize,0))
ret.paste(image,(0,0))
tmpfile = os.tmpnam()+".jpg"
print tmpfile
ret.save(tmpfile)
return tmpfile
def create_image(self,image):
xsize = self.width/4
ysize = xsize * 4/3
xpos = (self.width - xsize)/2
ypos = self.height / 8
print "imagepos:",xpos,ypos
print "to", xpos+xsize,ypos+ysize
print "screensize:", self.width, self.height
if isinstance(image,str):
image= Image.open(image)
image = image.resize((xsize,xsize))
ret = Image.new("RGBA",(xsize,ysize),None)
ref = image.crop((0,xsize*2/3,xsize,xsize)).transpose(Image.FLIP_TOP_BOTTOM).filter(ImageFilter.BLUR)
ret.paste(image,(0,0,xsize,xsize))
#print "size", ref.size ,xsize,ysize-xsize
ret.paste(ref,(0,xsize-1,xsize,ysize))
#ret.save("img.jpeg")
tmpfile = os.tmpnam()+".jpg"
ret.save(tmpfile)
return mmsv2gui.ImageControl(xpos,ypos,xsize,ysize,tmpfile)
def create_list(self):
xsize = self.width/2 ##200
ysize = self.height/4 ##150
xpos = (self.width - xsize)/2 ##300
ypos = self.height *3/4 ##450
print "listpos:",xpos,ypos
print "to", xpos+xsize,ypos+ysize
print "screensize:", self.width, self.height
self.listsize = (xsize,ysize)
self.listpos = (xpos,ypos)
print self.listpos,self.listsize
tmp = mmsv2gui.ListControl(xpos,ypos,xsize,ysize)
#tmp.setLabel("Status")
return tmp
def onAction(self,action):
print "action:",action
if action == "back":
self.setFocus(self.button_exit)
if action == "action":
if self.getFocus() == self.button_exit:
self.close()
elif self.getFocus() == self.run:
print "starting search"
imgs = dict()
print len(self.up.filenames)
for file in self.up.filenames:
print file['artist'],":",file['album']
item = mmsv2gui.ListItem()
print "item created"
item.setLabel(file['artist']+": "+file['album'])
print self.list.addItem(item)
print "added, starting download"
self.up.downloader.coverpath=os.path.dirname(file['filename'])
print "coverpath set"
filename = self.up.downloader.get_album_art(file['artist'],file['album'])
print "downloaded"
if filename != None:
loaded+=1
imgs[self.up.downloader.coverpath] = filename
self.image = self.create_image(filename)
print "OK"
else:
item.setLabel(file['artist']+": "+file['album']+" .... failed")
print "failed"
#total +=1
print "end of for"
print "images:",len(imgs)
for p,f in imgs.iteritems():
print p,"#",f
try:
self.musicc.execute("INSERT INTO Covers VALUES (?,?)",(p+"/",f))
except sqlite3.IntegrityError:
self.musicc.execute("UPDATE Covers SET Cover=? WHERE Path=? AND Cover=''",(f,p+"/"))
print "finished"
class ThemeConfig():
themepath = ""
themeconfig = None
sectionconfig = None
section = "startmenu"
def __init__(self):
self.themeconfig = {}
try:
themeconf = os.expanduser("~/.mms/options/ThemeRuntime")
fd = open(themeconf)
theme = fd.read().split(",")[1].strip("\n\t ")
fd.close()
except:
theme = "standard"
print "theme:", theme
self.themepath = os.path.join("/usr/local/share/mms/themes/",theme)
themeconf = os.path.join(self.themepath,"theme.conf")
fd = open(themeconf)
for line in fd.readlines():
try:
tmp = line.split("=")
section = tmp[0].split(".")[0].strip(" \t\n")
key = tmp[0].split(".")[1].strip(" \t\n")
value = tmp[1].strip(" \t\n")
if not self.themeconfig.has_key(section):
self.themeconfig[section] = {key:value}
else:
s = self.themeconfig[section]
s[key]= value
except:
pass#print "error",line,":",msg
def get_val(self,key,section=None):
if section == None:
section = self.section
try:
tmp = self.themeconfig[section]
return tmp[key]
except:
return None
def get_themepath(self):
return self.themepath
def get_file(self,key,section=None):
f = self.get_val(key,section)
tmp = os.path.join(self.themepath,f)
return tmp
def set_section(self,section):
self.section = section
self.sectionconfig = self.themeconfig[section]
class amazon():
##path where the covers will be saved
coverpath = None
##the first part of the search url
url = "http://www.amazon.com/s/ref=nb_ss_/002-1992546-8939265?"
def __init__(self):
self.coverpath=os.path.expanduser("~/.mms/covers/")
def get_album_art(self,artist,album):
print "get_album_art"
image = Image.Image()
print "image created"
searchstring = ""
#artist = artist
#album = album
searchstring = self._fix_net_search_string(artist) + " " + self._fix_net_search_string(album)
if len(searchstring) <=3:
print "empty searchstring"
return None
print "searchstring:",searchstring,len(searchstring)
##parameters for the search
params = {"url":"search-alias=aps",
"field-keywords": searchstring,
"ei":"UTF-8"}
print "parameters:",params
txdata = urllib.urlencode(params)
print "urlencoded"
url = self.url + txdata + "&x=0&y=0"
print "opening:", url
found = False
try:
sock = urllib.urlopen(url)
htmlsource = sock.read()
sock.close()
except Exception,msg:
print "could not open socket:",msg
return None
#find the detailpage of the album in the page
detaillocationstart = htmlsource.find('<tr><td align="center" width="115"><a href="') +44
if detaillocationstart > 44:
#get end of URL
detaillocationend = htmlsource.find('"',detaillocationstart)
detaillocation = htmlsource[detaillocationstart:detaillocationend]
#print "detaillocation:",detaillocation
try:
#visit the detailpage
sock = urllib.urlopen(detaillocation)
detailpage = sock.read()
sock.close()
except Exception,msg:
#print "could not load detailpage", msg
return None
#look for a big image
imagestart1 = detailpage.find('registerImage("original_image", "') + 33
#print "1",imagestart1
if imagestart1 > 33:
#find the big image
#print detailpage[imagestart1:imagestart1 +100]
imagestart = detailpage.find('"<a href="+\'"\'+"',imagestart1) + len('"<a href="+\'"\'+"')
#print "2",imagestart
if imagestart > 15:
imageend = detailpage.find('"', imagestart)
imagelocation = detailpage[imagestart:imageend]
#print "imagelocation",imagelocation
try:
sock = urllib.urlopen(imagelocation)
htmlsource = sock.read()
sock.close()
except Exception,msg:
#print "could not get image page", msg
return None
imgstart = htmlsource.find('<noscript><div id="imageViewerDiv"><img src="') +45
if imgstart > 45:
imgend = htmlsource.find('"',imgstart)
imglocation = htmlsource[imgstart:imgend]
#print "imglocation",imglocation
sock = urllib.urlopen(imglocation)
#download the big image
image = sock.read()
sock.close()
#urllib.urlretrieve(imglocation,filename)
found = True
else:
imgstart = detailpage.find('"<img src="+\'"\'+"',imagestart1) +17
imageend = detailpage.find('"',imgstart)
imglocation = detailpage[imgstart:imageend]
#download mid image
sock = urllib.urlopen(imglocation)
image = sock.read()
sock.close()
found = True
else:
print "no small image found"
return None
else:
print "couldn't find details"
return None
if image == None:
return None
#remove the border
img = self.remove_border(Image.open(StringIO.StringIO(image)))
filename = os.path.join(self.coverpath,".front-cover.jpg")
print "image size:",img.size
img.save(filename)
return filename
def remove_border(self, img):
return img.crop(ImageChops.invert(img).getbbox())
def _fix_net_search_string(self, str):
s= ""
lastwasws = False
#print str
str = str.lower()
for c in str:
if c in ["\t",]:
continue
if c in ["_",":","?","/","-","~","[","]"," "]:
if lastwasws == True:
continue
else:
s+=" "
lastwasws= True
else:
s+=c
lastwasws = False
print "fixed:", s
return s
def _fix_fs_filename(self, s):
s = s.replace(":"," ")
s = s.replace(";"," ")
s = s.replace("&"," and ")
s = s.replace("$"," ")
s = s.replace("?"," ")
s = s.replace("/"," ")
s = s.replace("~"," ")
s = s.replace("<"," ")
s = s.replace(">"," ")
s = s.replace("`"," ")
s = s.replace("\\"," ")
s = s.replace(" "," ")
s = s.replace(" "," ")
return s
##path where the covers will be saved
coverpath = None
##the first part of the search url
url = "http://www.amazon.com/s/ref=nb_ss_/002-1992546-8939265?"
#if __name__ == "__main__":
# print "lalal"
# pu = PictureUpdater()
class updatepics:
##Musicdatabase connection and cursor
musicc = None
musiccon = None
musiccur = None
musicpath = None
##general database directory of mms
dbdir = ""
downloader = None
filenames = []
def __init__(self,d):
self.downloader = d
self.dbdir= os.path.expanduser("~/.mms/")
self.coverpath = os.path.expanduser("~/.mms/covers/")
#self.picpath = os.path.join(self.dbdir,"pictures.db")
self.musicpath = os.path.join(self.dbdir,"audio.db")
self.connect()
self.get_all()
#self.run()
def get_all(self):
self.filenames = self.musicc.execute("SELECT au.filename AS filename, ar.name AS artist, al.name AS album FROM Audio au,Artist ar, Album al WHERE (au.Artist=ar.id AND au.Album=al.id AND (ar.name <> '' OR al.name <> '')) GROUP BY ar.name,al.name").fetchall()
def get_new(self):
parents = self.musicc.execute("SELECT parent From Folder WHERE is_folder = 0")
#self.filenames = self.musicc.execute("SELECT au.filename AS filename, ar.name AS artist, al.name AS album FROM Audio au,Artist ar, Album al,Covers c WHERE (au.Artist=ar.id AND au.Album=al.id AND c.Cover='') GROUP BY ar.name,al.name")
def run(self):
loaded=0
total = 0
imgs = dict()
for file in self.filenames:
print file['artist'],":",file['album']#,file['filename']
self.downloader.coverpath=os.path.dirname(file['filename'])
#print self.downloader.coverpath
filename = self.downloader.get_album_art(file['artist'],file['album'])
if filename != None:
loaded+=1
imgs[self.downloader.coverpath] = filename
print "OK"
total +=1
#print "images:",len(imgs)
for p,f in imgs.iteritems():
print p,"#",f
try:
self.musicc.execute("INSERT INTO Covers VALUES (?,?)",(p+"/",f))
except sqlite3.IntegrityError:
self.musicc.execute("UPDATE Covers SET Cover=? WHERE Path=? AND Cover=''",(f,p+"/"))
print loaded,"of", total
def connect(self):
self.musiccon = sqlite3.connect(self.musicpath)
self.musiccon.row_factory = sqlite3.Row
self.musiccon.text_factory=str
self.musicc = self.musiccon.cursor()
print self.musiccon, self.musicc
def close(self):
self.musiccon.commit()
self.musiccon.close()
self.musiccon = None
self.musicc = None
def update(self):
self.musiccon.commit()
def reconnect(self):
self.close()
self.connect()
win = PictureUpdater()
win.doModal()
del win