mirror of
https://github.com/vale981/clay
synced 2025-03-05 09:31:40 -05:00
Fix #31
This commit is contained in:
parent
40390c48bd
commit
4edb5cd4f3
4 changed files with 73 additions and 16 deletions
50
clay/gp.py
50
clay/gp.py
|
@ -4,6 +4,16 @@ Google Play Music integration via gmusicapi.
|
||||||
# pylint: disable=broad-except
|
# pylint: disable=broad-except
|
||||||
# pylint: disable=protected-access
|
# pylint: disable=protected-access
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
|
try: # Python 3.x
|
||||||
|
from urllib.request import urlopen
|
||||||
|
except ImportError: # Python 2.x
|
||||||
|
from urllib import urlopen
|
||||||
|
try:
|
||||||
|
from PIL import Image
|
||||||
|
except ImportError:
|
||||||
|
Image = None
|
||||||
|
from io import BytesIO
|
||||||
|
from hashlib import sha1
|
||||||
from threading import Thread, Lock
|
from threading import Thread, Lock
|
||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
|
|
||||||
|
@ -11,6 +21,7 @@ from gmusicapi.clients import Mobileclient
|
||||||
|
|
||||||
from clay.eventhook import EventHook
|
from clay.eventhook import EventHook
|
||||||
from clay.log import logger
|
from clay.log import logger
|
||||||
|
from clay.settings import settings
|
||||||
|
|
||||||
STATION_FETCH_LEN = 50
|
STATION_FETCH_LEN = 50
|
||||||
|
|
||||||
|
@ -96,12 +107,27 @@ class Track(object):
|
||||||
data = data['track']
|
data = data['track']
|
||||||
self.store_id = data['storeId']
|
self.store_id = data['storeId']
|
||||||
|
|
||||||
|
artist_art_ref = next(iter(sorted(
|
||||||
|
[
|
||||||
|
ref
|
||||||
|
for ref
|
||||||
|
in data.get('artistArtRef', [])
|
||||||
|
],
|
||||||
|
key=lambda x: x['aspectRatio']
|
||||||
|
)), None)
|
||||||
self.title = data['title']
|
self.title = data['title']
|
||||||
self.artist = data['artist']
|
self.artist = data['artist']
|
||||||
self.duration = int(data['durationMillis'])
|
self.duration = int(data['durationMillis'])
|
||||||
self.rating = (int(data['rating']) if 'rating' in data else 0)
|
self.rating = (int(data['rating']) if 'rating' in data else 0)
|
||||||
self.source = source
|
self.source = source
|
||||||
self.cached_url = None
|
self.cached_url = None
|
||||||
|
self.artist_art_url = None
|
||||||
|
self.artist_art_filename = None
|
||||||
|
if artist_art_ref is not None:
|
||||||
|
self.artist_art_url = artist_art_ref['url']
|
||||||
|
self.artist_art_filename = sha1(
|
||||||
|
self.artist_art_url.encode('utf-8')
|
||||||
|
).hexdigest() + u'.jpg'
|
||||||
self.explicit_rating = (int(data['explicitType']))
|
self.explicit_rating = (int(data['explicitType']))
|
||||||
|
|
||||||
if self.rating == 5:
|
if self.rating == 5:
|
||||||
|
@ -194,6 +220,30 @@ class Track(object):
|
||||||
track_id = self.library_id
|
track_id = self.library_id
|
||||||
gp.get_stream_url_async(track_id, callback=on_get_url)
|
gp.get_stream_url_async(track_id, callback=on_get_url)
|
||||||
|
|
||||||
|
@synchronized
|
||||||
|
def get_artist_art_filename(self):
|
||||||
|
"""
|
||||||
|
Return artist art filename, None if this track doesn't have any.
|
||||||
|
Downloads if necessary.
|
||||||
|
"""
|
||||||
|
if self.artist_art_url is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
if not settings.get_is_file_cached(self.artist_art_filename):
|
||||||
|
response = urlopen(self.artist_art_url)
|
||||||
|
data = response.read()
|
||||||
|
if Image:
|
||||||
|
image = Image.open(BytesIO(data))
|
||||||
|
image.thumbnail((128, 128))
|
||||||
|
out = BytesIO()
|
||||||
|
image.save(out, format='JPEG')
|
||||||
|
data = out.getvalue()
|
||||||
|
settings.save_file_to_cache(self.artist_art_filename, data)
|
||||||
|
|
||||||
|
return settings.get_cached_file_path(self.artist_art_filename)
|
||||||
|
|
||||||
|
# get_artist_arg_filename_async = asynchronous(get_artist_art_filename)
|
||||||
|
|
||||||
@synchronized
|
@synchronized
|
||||||
def create_station(self):
|
def create_station(self):
|
||||||
"""
|
"""
|
||||||
|
|
30
clay/osd.py
30
clay/osd.py
|
@ -1,6 +1,8 @@
|
||||||
"""
|
"""
|
||||||
On-screen display stuff.
|
On-screen display stuff.
|
||||||
"""
|
"""
|
||||||
|
from threading import Thread
|
||||||
|
|
||||||
from clay.notifications import notification_area
|
from clay.notifications import notification_area
|
||||||
from clay import meta
|
from clay import meta
|
||||||
|
|
||||||
|
@ -33,21 +35,27 @@ class _OSDManager(object):
|
||||||
)
|
)
|
||||||
self.notify_interface = Interface(self.notifcations, "org.freedesktop.Notifications")
|
self.notify_interface = Interface(self.notifcations, "org.freedesktop.Notifications")
|
||||||
|
|
||||||
def notify(self, title, message):
|
def notify(self, track):
|
||||||
"""
|
"""
|
||||||
Create new or update existing notification.
|
Create new or update existing notification.
|
||||||
"""
|
"""
|
||||||
if IS_INIT:
|
if IS_INIT:
|
||||||
self._last_id = self.notify_interface.Notify(
|
thread = Thread(target=self._notify, args=(track,))
|
||||||
meta.APP_NAME,
|
thread.daemon = True
|
||||||
self._last_id,
|
thread.start()
|
||||||
'audio-headphones',
|
|
||||||
title,
|
def _notify(self, track):
|
||||||
message,
|
artist_art_filename = track.get_artist_art_filename()
|
||||||
[],
|
self._last_id = self.notify_interface.Notify(
|
||||||
dict(),
|
meta.APP_NAME,
|
||||||
5000
|
self._last_id,
|
||||||
)
|
artist_art_filename if artist_art_filename is not None else 'audio-headphones',
|
||||||
|
track.title,
|
||||||
|
u'by {}\nfrom {}'.format(track.artist, track.album_name),
|
||||||
|
[],
|
||||||
|
dict(),
|
||||||
|
5000
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
osd_manager = _OSDManager() # pylint: disable=invalid-name
|
osd_manager = _OSDManager() # pylint: disable=invalid-name
|
||||||
|
|
|
@ -418,10 +418,7 @@ class _Player(object):
|
||||||
|
|
||||||
self.media_player.play()
|
self.media_player.play()
|
||||||
|
|
||||||
osd_manager.notify('Now playing', '{} - {}'.format(
|
osd_manager.notify(track)
|
||||||
track.artist,
|
|
||||||
track.title
|
|
||||||
))
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_loading(self):
|
def is_loading(self):
|
||||||
|
|
|
@ -64,7 +64,9 @@ class SongListItem(urwid.Pile):
|
||||||
RATING_ICONS = {
|
RATING_ICONS = {
|
||||||
0: ' ',
|
0: ' ',
|
||||||
1: u'\U0001F593' if _unicode else '-',
|
1: u'\U0001F593' if _unicode else '-',
|
||||||
4: u'\U0001F593' if _unicode else '-',
|
2: u'\U0001F593' if _unicode else '2',
|
||||||
|
3: u'\U0001F593' if _unicode else '3',
|
||||||
|
4: u'\U0001F593' if _unicode else '4',
|
||||||
5: u'\U0001F592' if _unicode else '+'
|
5: u'\U0001F592' if _unicode else '+'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue