main_screen.py 6.6 KB

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