From 856b6237854d11b9cfcfd983f8eb2173fa2a5f7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Dzi=C4=99giel?= Date: Fri, 26 Jul 2024 13:47:06 +0200 Subject: [PATCH 1/4] fix(mv): clapper: Do not use MPRIS for GIFs Tuba now tries to treat GIFV as GIFs and not videos. For this reason and consistency with how other clients/browser work, there should not be a MPRIS controls for GIF media. --- src/Views/MediaViewer.vala | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/Views/MediaViewer.vala b/src/Views/MediaViewer.vala index 68e2353de..bde3d74f2 100644 --- a/src/Views/MediaViewer.vala +++ b/src/Views/MediaViewer.vala @@ -944,14 +944,6 @@ public class Tuba.Views.MediaViewer : Gtk.Widget, Gtk.Buildable, Adw.Swipeable { var video = new ClapperGtk.Video () { auto_inhibit = true }; - #if CLAPPER_MPRIS - var mpris = new Clapper.Mpris ( - "org.mpris.MediaPlayer2.Tuba", - Build.NAME, - Build.DOMAIN - ); - video.player.add_feature (mpris); - #endif video.player.audio_filter = Gst.ElementFactory.make ("scaletempo", null); #else var video = new Gtk.Video () { @@ -974,6 +966,13 @@ public class Tuba.Views.MediaViewer : Gtk.Widget, Gtk.Buildable, Adw.Swipeable { #endif } else { #if CLAPPER + #if CLAPPER_MPRIS + video.player.add_feature (new Clapper.Mpris ( + "org.mpris.MediaPlayer2.Tuba", + Build.NAME, + Build.DOMAIN + )); + #endif video.add_fading_overlay (new ClapperGtk.SimpleControls () { valign = Gtk.Align.END, fullscreenable = false From d85bdd1d779ee67367cf2d452caf01621c781423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Dzi=C4=99giel?= Date: Fri, 26 Jul 2024 13:51:44 +0200 Subject: [PATCH 2/4] fix(mv): clapper: Remove unnecessary Gst element creation Since Clapper patch version 0.6.1 this is fixed to be done automatically in ClapperGtk video, so no need to create another object instance here. Most distros have now updated to 0.6.1 version, Clapper in Tuba is not used by default and even with 0.6.0 the only dowside of removing it would be wrong audio pitch on non-1x speed, so not a major enough reason to do a version check just for that. --- src/Views/MediaViewer.vala | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Views/MediaViewer.vala b/src/Views/MediaViewer.vala index bde3d74f2..fe6157744 100644 --- a/src/Views/MediaViewer.vala +++ b/src/Views/MediaViewer.vala @@ -944,7 +944,6 @@ public class Tuba.Views.MediaViewer : Gtk.Widget, Gtk.Buildable, Adw.Swipeable { var video = new ClapperGtk.Video () { auto_inhibit = true }; - video.player.audio_filter = Gst.ElementFactory.make ("scaletempo", null); #else var video = new Gtk.Video () { #if GTK_4_16 From 32a2a31533d45a9a0caede7f473db39a1e867827 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Dzi=C4=99giel?= Date: Fri, 26 Jul 2024 13:58:37 +0200 Subject: [PATCH 3/4] fix(mv): Do not set autoplay for GIFV Tuba always set player to playing (both GtkVideo and Clapper) for any kind of video when ready, so autoplay here is redundant. --- src/Views/MediaViewer.vala | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Views/MediaViewer.vala b/src/Views/MediaViewer.vala index fe6157744..a933ba9f7 100644 --- a/src/Views/MediaViewer.vala +++ b/src/Views/MediaViewer.vala @@ -958,10 +958,8 @@ public class Tuba.Views.MediaViewer : Gtk.Widget, Gtk.Buildable, Adw.Swipeable { if (media_type == Tuba.Attachment.MediaType.GIFV) { #if CLAPPER video.player.queue.progression_mode = Clapper.QueueProgressionMode.REPEAT_ITEM; - video.player.autoplay = true; #else video.loop = true; - video.autoplay = true; #endif } else { #if CLAPPER From 9fea1cfe8653a5f519b68c43d0f9e483f04c8001 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Dzi=C4=99giel?= Date: Fri, 26 Jul 2024 15:28:39 +0200 Subject: [PATCH 4/4] fix(mv): clapper: Fix handling of multiple media in a single post When going "stopped" -> "paused" player will already start caching/buffering until it has enough data to ba able to go into "playing" immediately. This causes a problem where multiple created video widgets for multiple GIFV media download all of videos at once while user views just on a one of them. Fix this misbehavior by not going into "paused" when we are "stopped" which means we are at initial state. --- src/Views/MediaViewer.vala | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/Views/MediaViewer.vala b/src/Views/MediaViewer.vala index a933ba9f7..acafc5801 100644 --- a/src/Views/MediaViewer.vala +++ b/src/Views/MediaViewer.vala @@ -103,10 +103,12 @@ public class Tuba.Views.MediaViewer : Gtk.Widget, Gtk.Buildable, Adw.Swipeable { if (!is_video) return; if (is_done) { #if CLAPPER + Clapper.Player player = ((ClapperGtk.Video) child_widget).player; + if (value) { - ((ClapperGtk.Video) child_widget).player.play (); - } else { - ((ClapperGtk.Video) child_widget).player.pause (); + player.play (); + } else if (player.state > Clapper.PlayerState.STOPPED) { + player.pause (); } #else ((Gtk.Video) child_widget).media_stream.playing = value; @@ -275,14 +277,16 @@ public class Tuba.Views.MediaViewer : Gtk.Widget, Gtk.Buildable, Adw.Swipeable { if (is_video) { #if CLAPPER + Clapper.Player player = ((ClapperGtk.Video) child_widget).player; + if (pre_playing) { - ((ClapperGtk.Video) child_widget).player.play (); - } else { - ((ClapperGtk.Video) child_widget).player.pause (); + player.play (); + } else if (player.state > Clapper.PlayerState.STOPPED) { + player.pause (); } - ((ClapperGtk.Video) child_widget).player.volume = last_used_volume; - ((ClapperGtk.Video) child_widget).player.notify["volume"].connect (on_manual_volume_change); + player.volume = last_used_volume; + player.notify["volume"].connect (on_manual_volume_change); #else ((Gtk.Video) child_widget).media_stream.volume = 1.0 - last_used_volume; ((Gtk.Video) child_widget).media_stream.volume = last_used_volume;