main_screen.py 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import pygame
  2. import logging
  3. import hashlib
  4. import time
  5. import os
  6. from threading import Thread
  7. import urllib
  8. import urllib2
  9. import json
  10. from mopidy.audio import PlaybackState
  11. from .touch_text_manager import TouchTextManager
  12. from .dynamic_background import DynamicBackground
  13. logger = logging.getLogger(__name__)
  14. class MainScreen():
  15. def __init__(self,size,manager,cache):
  16. self.size = size
  17. self.base_size = self.size[1]/12
  18. self.manager = manager
  19. self.background = DynamicBackground()
  20. self.track = None
  21. self.cache = cache
  22. self.image = None
  23. self.touch_text_manager = TouchTextManager(size,self.base_size)
  24. self.touch_text_manager.add_touch_object("pause_play","Play",(0,0),(255,255,255))
  25. def update(self,core):
  26. screen = pygame.Surface(self.size)
  27. self.background.drawBackground(screen)
  28. if self.track is not None:
  29. if self.image is not None:
  30. screen.blit(self.image, (self.base_size, self.base_size*3))
  31. self.touch_text_manager.get_touch_object("time_progress").set_value(core.playback.time_position.get()/1000)
  32. self.touch_text_manager.get_object("track_time").set_text(time.strftime('%M:%S', time.gmtime(core.playback.time_position.get()/1000))+"/"+time.strftime('%M:%S', time.gmtime(self.track.length/1000)))
  33. self.touch_text_manager.render(screen)
  34. return screen
  35. def track_started(self, track):
  36. self.image = None
  37. self.touch_text_manager.add_object("track_name",track.name,(self.size[0]/2,self.base_size*3), (self.size[0]-self.base_size,self.size[1]), (255, 255, 255))
  38. self.touch_text_manager.add_object("album_name",track.album.name,(self.size[0]/2,self.base_size*4), (self.size[0]-self.base_size,self.size[1]), (255, 255, 255))
  39. self.touch_text_manager.add_object("artist_name",self.getFirstArtist(track),(self.size[0]/2,self.base_size*5), (self.size[0]-self.base_size,self.size[1]), (255, 255, 255))
  40. self.touch_text_manager.add_object("track_time",time.strftime('%M:%S', time.gmtime(0))+"/"+time.strftime('%M:%S', time.gmtime(0)),(self.size[0]/2,self.base_size*6), (self.size[0]-self.base_size,self.base_size * 7), (255, 255, 255))
  41. self.touch_text_manager.add_progressbar("time_progress", (self.size[0]/2,self.base_size*7), (self.size[0]-self.base_size,self.base_size*8),track.length/1000)
  42. self.track = track
  43. if not self.is_image_in_cache():
  44. thread = Thread(target=self.downloadImage())
  45. thread.start()
  46. else:
  47. self.loadImage()
  48. def getFirstArtist(self,track):
  49. if track is None:
  50. artist = next(iter(self.track.artists)).name
  51. else:
  52. artist = next(iter(track.artists)).name
  53. return artist
  54. def getImageFileName(self):
  55. name = self.track.album.name + '-' + self.getFirstArtist(None)
  56. md5name = hashlib.md5(name).hexdigest()
  57. return md5name
  58. def getCoverFolder(self):
  59. if(not os.path.isdir(self.cache+"/covers")):
  60. os.makedirs(self.cache+"/covers")
  61. return self.cache+"/covers/"
  62. def is_image_in_cache(self):
  63. self.getCoverFolder()
  64. return os.path.isfile(self.getCoverFolder()+self.getImageFileName())
  65. def downloadImage(self):
  66. safe_artist=urllib.quote_plus(self.getFirstArtist(None))
  67. safe_album=urllib.quote_plus(self.track.album.name)
  68. url="http://ws.audioscrobbler.com/2.0/?"
  69. params="method=album.getinfo&api_key=59a04c6a73fb99d6e8996e01db306829&artist="+safe_artist+"&album="+safe_album+"&format=json"
  70. response = urllib2.urlopen(url+params)
  71. data = json.load(response)
  72. image = data['album']['image'][-1]['#text']
  73. urllib.urlretrieve(image, self.getCoverFolder()+self.getImageFileName())
  74. self.loadImage()
  75. def loadImage(self):
  76. size = self.base_size*6
  77. self.image = pygame.transform.scale(pygame.image.load(self.getCoverFolder()+self.getImageFileName()).convert(),(size,size))