All pastes #943714 Raw Edit

Zeug

public text v1 · immutable
·published 2008-03-15 15:02 UTC
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