2023-08-17 00:06:21 +08:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
2023-08-21 19:06:22 +08:00
|
|
|
import gi, sys, os, threading, time
|
2023-08-17 00:06:21 +08:00
|
|
|
# import dbus
|
|
|
|
# import dbus.service, dbus.mainloop.glib
|
|
|
|
from pprint import pprint as print
|
2023-08-18 19:04:51 +08:00
|
|
|
import musicbrainzngs as mus
|
2023-08-17 00:06:21 +08:00
|
|
|
|
2023-08-21 19:06:22 +08:00
|
|
|
|
2023-08-17 00:06:21 +08:00
|
|
|
gi.require_version('Gtk', '3.0')
|
|
|
|
|
2023-08-21 19:06:22 +08:00
|
|
|
from gi.repository import Gtk, Gdk, GLib, GdkPixbuf, GObject
|
2023-08-17 00:06:21 +08:00
|
|
|
|
|
|
|
from window import SonistWindow
|
2023-08-17 20:51:59 +08:00
|
|
|
|
2023-08-17 00:06:21 +08:00
|
|
|
# from mpd.asyncio import MPDClient
|
|
|
|
from mpd.base import MPDClient
|
|
|
|
|
|
|
|
app_id = 'fun.wkit.sonist'
|
|
|
|
|
|
|
|
|
2023-08-18 19:04:51 +08:00
|
|
|
def run_async(func):
|
|
|
|
def wrapper(*args, **kwargs):
|
|
|
|
thread = threading.Thread(target=func, args=args, kwargs=kwargs)
|
|
|
|
thread.daemon = True
|
|
|
|
thread.start()
|
|
|
|
return thread
|
|
|
|
return wrapper
|
|
|
|
|
2023-08-18 00:09:43 +08:00
|
|
|
|
2023-08-17 00:06:21 +08:00
|
|
|
class Application(Gtk.Application):
|
2023-08-21 19:06:22 +08:00
|
|
|
|
|
|
|
__gsignals__ = {
|
|
|
|
'playing': (GObject.SignalFlags.RUN_FIRST, None, (bool,)),
|
|
|
|
'song_changed': (GObject.SignalFlags.RUN_FIRST, None, (bool,)),
|
|
|
|
'state_changed': (GObject.SignalFlags.RUN_FIRST, None, (str,))
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2023-08-17 00:06:21 +08:00
|
|
|
def __init__(self):
|
|
|
|
Gtk.Application.__init__(self, application_id = app_id)
|
|
|
|
|
2023-08-21 19:06:22 +08:00
|
|
|
self.mpd_state = None
|
|
|
|
self.mpd_curr_song = None
|
|
|
|
|
2023-08-18 19:04:51 +08:00
|
|
|
self.mpd = MPDClient()
|
|
|
|
|
2023-08-21 19:06:22 +08:00
|
|
|
self.mpd_is_online = self.mpd_connect()
|
2023-08-18 19:04:51 +08:00
|
|
|
|
|
|
|
self.connect('window-removed', self.on_window_removed)
|
2023-08-17 00:06:21 +08:00
|
|
|
|
2023-08-18 19:04:51 +08:00
|
|
|
mus.set_useragent('Sonist Gtk', '0.0.1', 'https://github.com/app-cat/sonist-gtk')
|
|
|
|
|
2023-08-21 19:06:22 +08:00
|
|
|
|
|
|
|
|
2023-08-18 19:04:51 +08:00
|
|
|
@run_async
|
|
|
|
def get_cover(self, song, filepath, callback):
|
|
|
|
try:
|
|
|
|
data = mus.search_releases(song["artist"], song["title"], 1)
|
|
|
|
release_id = data["release-list"][0]["release-group"]["id"]
|
|
|
|
print(release_id)
|
|
|
|
buff = mus.get_release_group_image_front(release_id, size = 128)
|
|
|
|
with open(filepath, 'wb') as file:
|
|
|
|
output = file.write(buff)
|
|
|
|
callback(filepath)
|
|
|
|
except:
|
|
|
|
pass
|
2023-08-21 19:06:22 +08:00
|
|
|
|
|
|
|
@run_async
|
|
|
|
def ping(self):
|
|
|
|
if self.mpd_is_online:
|
|
|
|
while True:
|
|
|
|
try:
|
|
|
|
self.mpd.ping()
|
|
|
|
stat = self.mpd.status()
|
|
|
|
song = self.mpd.currentsong() or {}
|
|
|
|
state = stat.get('state')
|
|
|
|
|
|
|
|
if self.mpd_curr_song != song.get('id'):
|
|
|
|
self.mpd_curr_song = song.get('id')
|
|
|
|
self.emit('song_changed', self.mpd_curr_song)
|
|
|
|
|
|
|
|
if state == 'play':
|
|
|
|
self.emit('playing', False)
|
|
|
|
|
|
|
|
if self.mpd_state != state:
|
|
|
|
self.emit('state_changed', state)
|
|
|
|
|
|
|
|
self.mpd_state = state
|
|
|
|
time.sleep(1)
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
print('<><><><><><><><>')
|
|
|
|
print(e)
|
|
|
|
print('<><><><><><><><>')
|
|
|
|
self.mpd.kill()
|
|
|
|
time.sleep(1)
|
|
|
|
self.mpd_is_online = self.mpd_connect()
|
|
|
|
|
|
|
|
|
|
|
|
def mpd_connect(self):
|
|
|
|
try:
|
|
|
|
self.mpd.connect("127.0.0.1", 6600)
|
|
|
|
return True
|
|
|
|
except:
|
|
|
|
return False
|
2023-08-17 00:06:21 +08:00
|
|
|
|
|
|
|
|
|
|
|
def do_activate(self):
|
|
|
|
print('hello mpc')
|
2023-08-17 20:51:59 +08:00
|
|
|
self.set_app_menu(None)
|
|
|
|
self.set_menubar(None)
|
2023-08-18 19:04:51 +08:00
|
|
|
|
|
|
|
self.window = SonistWindow(self)
|
|
|
|
self.add_window(self.window)
|
|
|
|
|
|
|
|
self.window.show_all()
|
2023-08-21 19:06:22 +08:00
|
|
|
self.ping()
|
2023-08-18 19:04:51 +08:00
|
|
|
|
|
|
|
|
|
|
|
def on_window_removed(self, app, win):
|
|
|
|
if len(self.get_windows()) == 0:
|
|
|
|
print('朕要休息了~~~')
|
|
|
|
|
2023-08-17 00:06:21 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
""" class ApplicationService(dbus.service.Object):
|
|
|
|
def __init__(self, app):
|
|
|
|
self.app = app
|
|
|
|
bus_name = dbus.service.BusName(app_id, bus = dbus.SessionBus())
|
|
|
|
dbus.service.Object.__init__(self, bus_name, '/')
|
|
|
|
|
|
|
|
|
|
|
|
@dbus.service.method(app_id)
|
|
|
|
def call_app(self):
|
|
|
|
self.app.present()
|
|
|
|
"""
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
# dbus.mainloop.glib.DBusGMainLoop(set_as_default = True)
|
|
|
|
# bus = dbus.SessionBus()
|
|
|
|
|
|
|
|
# try:
|
|
|
|
# obj = bus.get_object(app_id, '/')
|
|
|
|
# obj.call_app()
|
|
|
|
# sys.exit(0)
|
|
|
|
# except dbus.DBusException:
|
|
|
|
# pass
|
|
|
|
|
|
|
|
|
|
|
|
app = Application()
|
|
|
|
|
|
|
|
# ApplicationService(app)
|
2023-08-18 19:04:51 +08:00
|
|
|
app.run(sys.argv)
|
|
|
|
|
2023-08-17 00:06:21 +08:00
|
|
|
|