Skip to content

Commit

Permalink
various changes
Browse files Browse the repository at this point in the history
  • Loading branch information
Nokse22 committed Apr 30, 2024
1 parent a6f3773 commit 8651e40
Show file tree
Hide file tree
Showing 10 changed files with 119 additions and 54 deletions.
3 changes: 3 additions & 0 deletions data/io.github.nokse22.HighTide.gschema.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@
</key>
<key name="last-playing-list-id" type="s">
<default>''</default>
</key>
<key name="last-playing-list-type" type="s">
<default>''</default>
</key>
<key name="last-volume" type="i">
<default>10</default>
Expand Down
8 changes: 4 additions & 4 deletions data/ui/pages_ui/tracks_list_template.ui
Original file line number Diff line number Diff line change
Expand Up @@ -156,23 +156,23 @@
<property name="spacing">12</property>
<property name="valign">center</property>
<child>
<object class="GtkButton">
<object class="GtkButton" id="_play_button_2">
<property name="css-classes">pill
suggested-action</property>
<property name="icon-name">media-playback-start-symbolic</property>
</object>
</child>
<child>
<object class="GtkButton">
<object class="GtkButton" id="_shuffle_button_2">
<property name="css-classes">pill</property>
<property name="icon-name">media-playlist-shuffle-symbolic</property>
</object>
</child>
<child>
<object class="GtkButton">
<object class="GtkButton" id="_in_my_collection_button_2">
<property name="css-classes">circular
flat</property>
<property name="icon-name">list-add-symbolic</property>
<property name="icon-name" bind-source="_in_my_collection_button" bind-property="icon-name"/>
<property name="valign">center</property>
</object>
</child>
Expand Down
30 changes: 29 additions & 1 deletion data/ui/widgets/queue_widget.ui
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,35 @@
<property name="margin-top">3</property>
<property name="margin-bottom">6</property>
<child>
<object class="GenericTrackWidget" id="playing_track_widget">
<object class="GtkListBoxRow" id="playing_track_widget">
<property name="selectable">False</property>
<child>
<object class="GtkBox">
<property name="margin-start">6</property>
<property name="margin-end">6</property>
<child>
<object class="GtkImage" id="playing_track_image">
<property name="height-request">44</property>
<property name="icon-name">emblem-music-symbolic</property>
<property name="width-request">44</property>
<property name="margin-end">12</property>
<property name="margin-bottom">6</property>
<property name="margin-top">6</property>
<property name="overflow">hidden</property>
<property name="css-classes">small-image</property>
</object>
</child>
<child>
<object class="GtkLabel" id="playing_track_title_label">
<property name="css-classes">title-4</property>
<property name="ellipsize">end</property>
<property name="label">Title</property>
<property name="vexpand">True</property>
<property name="xalign">0.0</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
Expand Down
65 changes: 39 additions & 26 deletions src/lib/player_object.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,38 @@ def __init__(self):

Gst.init()

self.playbin = Gst.ElementFactory.make("playbin", "playbin")
# TODO Rename all player_object to something like GstPlayer

# GLib.timeout_add(4000, self.print_queue_and_list)
GLib.timeout_add(1000, self.check_for_end_of_stream)
self._player = Gst.ElementFactory.make('playbin3', 'player')
self._bus = self._player.get_bus()
self._bus.add_signal_watch()

self._bus.connect('message::eos', self._on_bus_eos)

# ---------------------------- FROM GNOME-MUSIC ----------------------------
#
#
# self._bus = self._player.get_bus()
# self._bus.add_signal_watch()
# self._setup_replaygain()

# self._settings.connect(
# 'changed::replaygain', self._on_replaygain_setting_changed)
# self._on_replaygain_setting_changed(
# None, self._settings.get_value('replaygain'))

# self._bus.connect('message::async-done', self._on_async_done)
# self._bus.connect('message::error', self._on_bus_error)
# self._bus.connect('message::element', self._on_bus_element)
# self._bus.connect('message::eos', self._on_bus_eos)
# self._bus.connect('message::new-clock', self._on_new_clock)
# self._bus.connect("message::state-changed", self._on_state_changed)
# self._bus.connect("message::stream-start", self._on_bus_stream_start)

# self._player.connect("about-to-finish", self._on_about_to_finish)

def _on_bus_eos(self, *args):
self.play_next()

def play_this(self, thing, index = 0): # Used to play albums, playlists, mixes
self.current_mix_album_playlist = thing
Expand Down Expand Up @@ -115,7 +143,7 @@ def play(self):
self.notify("is_playing")

self.emit("play-changed", self.is_playing)
self.playbin.set_state(Gst.State.PLAYING)
self._player.set_state(Gst.State.PLAYING)

GLib.timeout_add(1000, self.update_slider_call)

Expand All @@ -124,7 +152,7 @@ def pause(self):
self.notify("is_playing")

self.emit("play-changed", self.is_playing)
self.playbin.set_state(Gst.State.PAUSED)
self._player.set_state(Gst.State.PAUSED)

def play_pause(self):
if self.is_playing:
Expand All @@ -140,9 +168,9 @@ def play_track(self, track):
def _play_track(self, track):
print(f"play track: {track.name} by {track.artist.name}, {track.media_metadata_tags}, {track.audio_quality}, {track.id}")
music_url = track.get_url()
self.playbin.set_state(Gst.State.NULL)
self._player.set_state(Gst.State.NULL)

self.playbin.set_property("uri", music_url)
self._player.set_property("uri", music_url)

if self.is_playing:
self.play()
Expand Down Expand Up @@ -207,21 +235,6 @@ def play_previous(self):
self.tracks_to_play.insert(0, self.playing_track)
self.play_track(track)

def check_for_end_of_stream(self):
# FIXME Gstreamer position/duration don't update instantly after changing song (it still returns the previous values)
success1, duration = self.query_duration(Gst.Format.TIME)
success2, position = self.query_position(Gst.Format.TIME)

# print(f"{position} and {duration}")

if success1 and success2:
if position >= duration - 1:
print("song ended")
self.play_next()
# return False

return True

def print_queue_and_list(self):
return
print("----------played songs----------")
Expand All @@ -246,7 +259,7 @@ def add_next(self, track):
self.emit("song-added-to-queue")

def change_volume(self, value):
self.playbin.set_property("volume", value)
self._player.set_property("volume", value)

def shuffle(self, state):
"""Enable or disable shuffle mode."""
Expand Down Expand Up @@ -290,10 +303,10 @@ def update_slider_call(self):
return False

def query_duration(self, time_format):
return self.playbin.query_duration(Gst.Format.TIME)
return self._player.query_duration(Gst.Format.TIME)

def query_position(self, time_format):
return self.playbin.query_position(Gst.Format.TIME)
return self._player.query_position(Gst.Format.TIME)

def seek(self, time_format, something, seek_time):
self.playbin.seek_simple(time_format, something, seek_time)
self._player.seek_simple(time_format, something, seek_time)
11 changes: 11 additions & 0 deletions src/lib/variables.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,17 @@ def on_in_to_my_collection_button_clicked(btn, item):
else:
threading.Thread(target=remove_from_my_collection, args=(btn, item,)).start()

def get_type(item):
if isinstance(item, Track):
return "track"
elif isinstance(item, Mix):
return "mix"
elif isinstance(item, Album):
return "album"
elif isinstance(item, Artist):
return "artist"
elif isinstance(item, Playlist):
return "playlist"
def open_uri(label, uri, turn=True):
print(uri)
th= threading.Thread(target=_load_object, args=(uri,))
Expand Down
24 changes: 8 additions & 16 deletions src/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ def do_activate(self):
self.win = HighTideWindow(application=self)
self.win.present()

self.win.connect("close-request", self.on_shutdown)

def on_about_action(self, widget, _):
"""Callback for the app.about action."""
about = Adw.AboutDialog(
Expand Down Expand Up @@ -112,23 +114,13 @@ def create_action(self, name, callback, shortcuts=None):
if shortcuts:
self.set_accels_for_action(f"app.{name}", shortcuts)

# FIXME The do_shutdown function creates an error: (HighTide:2): GLib-GIO-CRITICAL **: 23:33:58.928: GApplication subclass 'high_tide+main+TidalApplication' failed to chain up on ::shutdown (from end of override function)
def do_shutdown(self):
track = self.win.player_object.playing_track
def on_shutdown(self, *args):
# track = self.win.player_object.playing_track
list_ = self.win.player_object.current_mix_album_playlist
if track and list_:
track_id = track.id
list_id = list_.id
self.win.settings.set_int("last-playing-song-id", track_id)
self.win.settings.set_string("last-playing-list-id", list_id)

folder_path = "tmp_img"

# FIXME Directory not empty: 'tmp_img'
if os.path.exists(folder_path):
shutil.rmtree(folder_path)

os.makedirs(folder_path)
list_id = list_.id
# self.win.settings.set_int("last-playing-song-id", track_id)
self.win.settings.set_string("last-playing-list-id", list_id)
self.win.settings.set_string("last-playing-list-type", variables.get_type(list_))

def main(version):
"""The application's entry point."""
Expand Down
6 changes: 5 additions & 1 deletion src/pages/album_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,14 +54,18 @@ def _load_page(self):
tracks_list_box.connect("row-activated", self.on_row_selected)

builder.get_object("_title_label").set_label(self.item.name)
builder.get_object("_first_subtitle_label").set_label(self.item.artist.name)
builder.get_object("_first_subtitle_label").set_label(f"{self.item.artist.name} - {self.item.release_date.strftime('%d-%m-%Y')}")
builder.get_object("_second_subtitle_label").set_label(f"{self.item.num_tracks} tracks ({utils.pretty_duration(self.item.duration)})")

builder.get_object("_play_button").connect("clicked", self.on_play_button_clicked)
builder.get_object("_play_button_2").connect("clicked", self.on_play_button_clicked)

builder.get_object("_shuffle_button").connect("clicked", self.on_shuffle_button_clicked)
builder.get_object("_shuffle_button_2").connect("clicked", self.on_shuffle_button_clicked)

in_my_collection_button = builder.get_object("_in_my_collection_button")
in_my_collection_button.connect("clicked", variables.on_in_to_my_collection_button_clicked, self.item)
builder.get_object("_in_my_collection_button_2").connect("clicked", variables.on_in_to_my_collection_button_clicked, self.item)

if (variables.is_favourited(self.item)):
in_my_collection_button.set_icon_name("heart-filled-symbolic")
Expand Down
4 changes: 1 addition & 3 deletions src/widgets/generic_track_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,9 +112,7 @@ def set_track(self, _track, is_album=False):

self.insert_action_group("trackwidget", action_group)

th = threading.Thread(target=utils.add_image, args=(self.image, self.track.album))
th.deamon = True
th.start()
threading.Thread(target=utils.add_image, args=(self.image, self.track.album)).start()

def hide_album(self):
self._grid.remove(self.track_album_label)
Expand Down
6 changes: 5 additions & 1 deletion src/widgets/queue_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,16 @@ class QueueWidget(Gtk.Box):

playing_track_widget = Gtk.Template.Child()

playing_track_image = Gtk.Template.Child()
playing_track_title_label = Gtk.Template.Child()

def __init__(self):
super().__init__()

def update(self, player):
track = player.playing_track
self.playing_track_widget.set_track(track)
self.playing_track_title_label.set_label(track.name)
threading.Thread(target=utils.add_image, args=(self.playing_track_image, track.album)).start()

child = self.played_songs_list.get_row_at_index(0)
while child:
Expand Down
16 changes: 14 additions & 2 deletions src/window.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,14 +197,26 @@ def add_favourite_playlists(self):
def _set_last_playing_song(self):
track_id = self.settings.get_int("last-playing-song-id")
list_id = self.settings.get_string("last-playing-list-id")
list_type = self.settings.get_string("last-playing-list-type")

album_mix_playlist = None

if list_type == "mix":
album_mix_playlist = self.session.mix(list_id)
elif list_type == "album":
album_mix_playlist = self.session.album(track_id)
elif list_type == "playlist":
album_mix_playlist = self.session.playlist(track_id)

if track_id == -1:
return

self.playbar_main_box.set_visible(True)

track = self.session.track(track_id)
self.player_object.play_track(track)
# track = self.session.track(track_id)
self.player_object.play_this(album_mix_playlist, 0)

self.player_object.pause()

# TODO Set last playing playlist/mix/album as current playing thing

Expand Down

0 comments on commit 8651e40

Please sign in to comment.