main_screen.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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_manager import TouchManager
  12. from .screen_objects import ScreenObjectsManager
  13. from .dynamic_background import DynamicBackground
  14. logger = logging.getLogger(__name__)
  15. class MainScreen():
  16. def __init__(self, size, manager, cache, core, fonts):
  17. self.core = core
  18. self.size = size
  19. self.base_size = self.size[1]/8
  20. self.fonts = fonts
  21. self.manager = manager
  22. self.background = DynamicBackground()
  23. self.track = None
  24. self.cache = cache
  25. self.image = None
  26. self.touch_text_manager = ScreenObjectsManager(size,self.base_size)
  27. def update(self, screen):
  28. self.background.drawBackground(screen)
  29. if self.track is not None:
  30. if self.image is not None:
  31. screen.blit(self.image, (self.base_size/2, self.base_size + self.base_size/2))
  32. self.touch_text_manager.get_touch_object("time_progress").set_value(self.core.playback.time_position.get()/1000)
  33. self.touch_text_manager.get_touch_object("time_progress").set_text(time.strftime('%M:%S', time.gmtime(self.core.playback.time_position.get()/1000))+"/"+time.strftime('%M:%S', time.gmtime(self.track.length/1000)))
  34. self.touch_text_manager.render(screen)
  35. return screen
  36. def track_started(self, track):
  37. self.image = None
  38. x = self.base_size * 5
  39. self.touch_text_manager.add_object("track_name",self.fonts['dejavusans'],track.name,(x,self.base_size*2), (self.size[0]-self.base_size,self.size[1]), (255, 255, 255))
  40. self.touch_text_manager.add_object("album_name",self.fonts['dejavusans'],track.album.name,(x,self.base_size*3), (self.size[0]-self.base_size,self.size[1]), (255, 255, 255))
  41. self.touch_text_manager.add_object("artist_name",self.fonts['dejavusans'],self.getFirstArtist(track),(x,self.base_size*4), (self.size[0]-self.base_size,self.size[1]), (255, 255, 255))
  42. self.touch_text_manager.add_progressbar("time_progress", self.fonts['dejavusans'],time.strftime('%M:%S', time.gmtime(0))+"/"+time.strftime('%M:%S', time.gmtime(0)),(0,self.base_size*6), (self.size[0],self.base_size*7),track.length/1000, False)
  43. self.track = track
  44. if not self.is_image_in_cache():
  45. thread = Thread(target=self.downloadImage())
  46. thread.start()
  47. else:
  48. self.loadImage()
  49. def getFirstArtist(self,track):
  50. if track is None:
  51. artist = next(iter(self.track.artists)).name
  52. else:
  53. artist = next(iter(track.artists)).name
  54. return artist
  55. def getImageFileName(self):
  56. name = self.track.album.name + '-' + self.getFirstArtist(None)
  57. md5name = hashlib.md5(name).hexdigest()
  58. return md5name
  59. def getCoverFolder(self):
  60. if(not os.path.isdir(self.cache+"/covers")):
  61. os.makedirs(self.cache+"/covers")
  62. return self.cache+"/covers/"
  63. def is_image_in_cache(self):
  64. self.getCoverFolder()
  65. return os.path.isfile(self.getCoverFolder()+self.getImageFileName())
  66. def downloadImage(self):
  67. try:
  68. safe_artist=urllib.quote_plus(self.getFirstArtist(self.track))
  69. safe_album=urllib.quote_plus(self.track.album.name)
  70. url="http://ws.audioscrobbler.com/2.0/?"
  71. params="method=album.getinfo&api_key=59a04c6a73fb99d6e8996e01db306829&artist="+safe_artist+"&album="+safe_album+"&format=json"
  72. response = urllib2.urlopen(url+params)
  73. data = json.load(response)
  74. image = data['album']['image'][-1]['#text']
  75. urllib.urlretrieve(image, self.getCoverFolder()+self.getImageFileName())
  76. self.loadImage()
  77. except:
  78. logger.warning("Cover could not be downloaded")
  79. logger.error(self.track.name)
  80. self.touch_text_manager.add_object("track_name",self.fonts['dejavusans'],self.track.name,(self.base_size,self.base_size*2), (self.size[0]-self.base_size,self.size[1]), (255, 255, 255))
  81. self.touch_text_manager.add_object("album_name",self.fonts['dejavusans'],self.track.album.name,(self.base_size,self.base_size*3), (self.size[0]-self.base_size,self.size[1]), (255, 255, 255))
  82. self.touch_text_manager.add_object("artist_name",self.fonts['dejavusans'],self.getFirstArtist(self.track),(self.base_size,self.base_size*4), (self.size[0]-self.base_size,self.size[1]), (255, 255, 255))
  83. def loadImage(self):
  84. size = self.base_size * 4
  85. self.image = pygame.transform.scale(pygame.image.load(self.getCoverFolder()+self.getImageFileName()).convert(),(size,size))
  86. def touch_event(self, event):
  87. if event.type == TouchManager.click:
  88. objects = self.touch_text_manager.get_touch_objects_in_pos(event.current_pos)
  89. if objects is not None:
  90. for key in objects:
  91. if key == "time_progress":
  92. value = self.touch_text_manager.get_touch_object(key).get_pos_value(event.current_pos) * 1000
  93. self.core.playback.seek(value)
  94. elif event.type == TouchManager.swipe:
  95. if event.direction == TouchManager.left:
  96. self.core.playback.next()
  97. elif event.direction == TouchManager.right:
  98. self.core.playback.previous()
  99. elif event.direction == TouchManager.up:
  100. volume = self.core.playback.volume.get() + 10
  101. if volume > 100:
  102. volume = 100
  103. self.manager.backend.tell({'action':'volume','value':volume})
  104. self.manager.volume_changed(volume)
  105. elif event.direction == TouchManager.down:
  106. volume = self.core.playback.volume.get() - 10
  107. if volume < 0:
  108. volume = 0
  109. self.manager.backend.tell({'action':'volume','value':volume})
  110. self.manager.volume_changed(volume)