Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package pithos for openSUSE:Factory checked 
in at 2026-08-21 22:17:30
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/pithos (Old)
 and      /work/SRC/openSUSE:Factory/.pithos.new.1258 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "pithos"

Fri Aug 21 22:17:30 2026 rev:16 rq:1372899 version:1.6.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/pithos/pithos.changes    2022-12-05 
18:02:02.208854617 +0100
+++ /work/SRC/openSUSE:Factory/.pithos.new.1258/pithos.changes  2026-08-21 
22:17:33.248439413 +0200
@@ -1,0 +2,11 @@
+Thu Aug 20 16:00:28 UTC 2026 - Dominique Leuenberger <[email protected]>
+
+- Update to version 1.6.2:
+  + Fix issue where playback would stop after a few songs
+  + Fix album art caches never being deleted
+- Changes from version 1.6.1:
+  + Fix Python 3.11 support
+  + Fix very short songs being labeled as ads
+- Migrate to _service managed git checkout.
+
+-------------------------------------------------------------------

Old:
----
  pithos-1.6.0.tar.xz

New:
----
  _scmsync.obsinfo
  _service
  build.specials.obscpio
  pithos-1.6.2.tar.xz
  pithos.obsinfo

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ pithos.spec ++++++
--- /var/tmp/diff_new_pack.UAmruc/_old  2026-08-21 22:17:35.842532061 +0200
+++ /var/tmp/diff_new_pack.UAmruc/_new  2026-08-21 22:17:35.844532132 +0200
@@ -19,7 +19,7 @@
 
 %global appid io.github.Pithos
 Name:           pithos
-Version:        1.6.0
+Version:        1.6.2
 Release:        0
 Summary:        Native Pandora Radio client for Linux
 License:        GPL-3.0-only

++++++ _scmsync.obsinfo ++++++
mtime: 1787241806
commit: 58ee1964ff17339888ae9c286803eb548bf959d68f2e1c73b6713d4891b410ce
url: https://src.opensuse.org/GNOME/pithos
revision: 58ee1964ff17339888ae9c286803eb548bf959d68f2e1c73b6713d4891b410ce
projectscmsync: https://src.opensuse.org/GNOME/_ObsPrj

++++++ _service ++++++
<?xml version="1.0"?>
<services>
  <service name="obs_scm" mode="manual">
    <param name="scm">git</param>
    <param name="url">https://github.com/pithos/pithos.git</param>
    <param name="revision">1.6.2</param>
    <param name="versionformat">@PARENT_TAG@+@TAG_OFFSET@</param>
    <param name="versionrewrite-pattern">v?(.*)\+0</param>
    <param name="versionrewrite-replacement">\1</param>
    <!--    <param name="changesgenerate">enable</param> -->
  </service>
  <service name="tar" mode="manual"/>
  <service name="recompress" mode="manual">
    <param name="file">*.tar</param>
    <param name="compression">xz</param>
  </service>
  <service name="set_version" mode="manual"/>
</services>

++++++ build.specials.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/.gitignore new/.gitignore
--- old/.gitignore      1970-01-01 01:00:00.000000000 +0100
+++ new/.gitignore      2026-08-20 18:03:26.000000000 +0200
@@ -0,0 +1,5 @@
+*.obscpio
+*.osc
+_build.*
+.pbuild
+osc-collab.*

++++++ pithos-1.6.0.tar.xz -> pithos-1.6.2.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pithos-1.6.0/.github/workflows/codeql.yml 
new/pithos-1.6.2/.github/workflows/codeql.yml
--- old/pithos-1.6.0/.github/workflows/codeql.yml       1970-01-01 
01:00:00.000000000 +0100
+++ new/pithos-1.6.2/.github/workflows/codeql.yml       2024-03-04 
00:53:20.000000000 +0100
@@ -0,0 +1,41 @@
+name: "CodeQL"
+
+on:
+  push:
+    branches: [ "master" ]
+  pull_request:
+    branches: [ "master" ]
+  schedule:
+    - cron: "0 15 * * 0"
+
+jobs:
+  analyze:
+    name: Analyze
+    runs-on: ubuntu-latest
+    permissions:
+      actions: read
+      contents: read
+      security-events: write
+
+    strategy:
+      fail-fast: false
+      matrix:
+        language: [ python ]
+
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v3
+
+      - name: Initialize CodeQL
+        uses: github/codeql-action/init@v2
+        with:
+          languages: ${{ matrix.language }}
+          queries: +security-and-quality
+
+      - name: Autobuild
+        uses: github/codeql-action/autobuild@v2
+
+      - name: Perform CodeQL Analysis
+        uses: github/codeql-action/analyze@v2
+        with:
+          category: "/language:${{ matrix.language }}"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pithos-1.6.0/data/io.github.Pithos.appdata.xml.in 
new/pithos-1.6.2/data/io.github.Pithos.appdata.xml.in
--- old/pithos-1.6.0/data/io.github.Pithos.appdata.xml.in       2022-09-27 
22:06:23.000000000 +0200
+++ new/pithos-1.6.2/data/io.github.Pithos.appdata.xml.in       2024-03-04 
00:53:20.000000000 +0100
@@ -9,21 +9,51 @@
   <metadata_license>CC0-1.0</metadata_license>
   <project_license>GPL-3.0+</project_license>
   <description>
-    <p>Pithos is a easy to use native Pandora Radio client that is more 
lightweight than the pandora.com web client and integrates with the desktop.</p>
-    <p>It supports most functionality of pandora.com such as rating songs, 
creating/managing stations, quickmix, etc. On top of that it has features such 
as last.fm scrobbling, media keys, notifications, proxies, and mpris 
support.</p>
+    <p>An easy to use native Pandora Radio client that is more lightweight 
than the pandora.com web client and integrates with the desktop.</p>
+    <p>It supports most functionality of pandora.com such as rating songs, 
creating/managing stations, quickmix, etc. On top of that it has many features 
such as last.fm scrobbling</p>
   </description>
   <url type="homepage">https://pithos.github.io</url>
   <url type="bugtracker">https://github.com/pithos/pithos/issues</url>
   <url 
type="translate">https://github.com/pithos/pithos/wiki/Contributing</url>
   <url type="donation">https://goo.gl/StrKkg</url>
   <url type="help">https://github.com/pithos/pithos/wiki</url>
+  <branding>
+    <color type="primary" scheme_preference="light">#e6d4ff</color>
+    <color type="primary" scheme_preference="dark">#644b93</color>
+  </branding>
   <screenshots>
-    <screenshot type="default" width="624" height="351">
-      <image>http://i.imgur.com/2U2ce8v.png</image>
-      <caption>Main Window</caption>
+    <screenshot type="default">
+      <image>https://i.imgur.com/RzMCls4.png</image>
+      <caption>Main Window showing a playlist</caption>
+    </screenshot>
+    <screenshot>
+      <image>https://i.imgur.com/5tcEhkp.png</image>
+      <caption>Dialog showing available plugins</caption>
+    </screenshot>
+    <screenshot>
+      <image>https://i.imgur.com/NyQ0uZB.png</image>
+      <caption>Dark variant of the main window</caption>
     </screenshot>
   </screenshots>
   <releases>
+    <release date="2024-03-03" version="1.6.2">
+      <description>
+        <p>This is a small release with a few fixes</p>
+        <ul>
+          <li>Fix issue where playback would stop after a few songs</li>
+          <li>Fix album art caches never being deleted</li>
+        </ul>
+      </description>
+    </release>
+    <release date="2023-05-19" version="1.6.1">
+      <description>
+        <p>This is a small bugfix release</p>
+        <ul>
+          <li>Fix Python 3.11 support</li>
+          <li>Fix incorrectly labeling very short songs as ads</li>
+        </ul>
+      </description>
+    </release>
     <release date="2022-09-27" version="1.6.0">
       <description>
         <p>This is a fairly small release with some UI tweaks and bug fixes</p>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pithos-1.6.0/meson.build new/pithos-1.6.2/meson.build
--- old/pithos-1.6.0/meson.build        2022-09-27 22:06:23.000000000 +0200
+++ new/pithos-1.6.2/meson.build        2024-03-04 00:53:20.000000000 +0100
@@ -1,5 +1,5 @@
 project('pithos',
-  version: '1.6.0',
+  version: '1.6.2',
   meson_version: '>= 0.50.0'
 )
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pithos-1.6.0/pithos/pandora/blowfish.py 
new/pithos-1.6.2/pithos/pandora/blowfish.py
--- old/pithos-1.6.0/pithos/pandora/blowfish.py 2022-09-27 22:06:23.000000000 
+0200
+++ new/pithos-1.6.2/pithos/pandora/blowfish.py 2024-03-04 00:53:20.000000000 
+0100
@@ -216,7 +216,7 @@
 
         return bytes([b & 0xff for b in bval])
 
-# These are the standard initialization valies of P and S blocks for the
+# These are the standard initialization values of P and S blocks for the
 # cipher. The constants are internal to this module and should not be accessed
 # directly or modified by outside code.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pithos-1.6.0/pithos/pithos.py 
new/pithos-1.6.2/pithos/pithos.py
--- old/pithos-1.6.0/pithos/pithos.py   2022-09-27 22:06:23.000000000 +0200
+++ new/pithos-1.6.2/pithos/pithos.py   2024-03-04 00:53:20.000000000 +0100
@@ -14,6 +14,7 @@
 
 
 import contextlib
+import hashlib
 import html
 import json
 import logging
@@ -22,7 +23,6 @@
 import os
 import sys
 import time
-import tempfile
 import urllib.error
 import urllib.parse
 import urllib.request
@@ -61,6 +61,8 @@
 
 ALBUM_ART_SIZE = 96
 TEXT_X_PADDING = 12
+# 15 days in seconds to retain album art files.
+ART_CACHE_TIME = 1.296e+6
 
 FALLBACK_BLACK = Gdk.RGBA(red=0.0, green=0.0, blue=0.0, alpha=1.0)
 FALLBACK_WHITE = Gdk.RGBA(red=1.0, green=1.0, blue=1.0, alpha=1.0)
@@ -176,7 +178,7 @@
         bg_rgb = bg_color.to_string()
 
         # Use our color values to create strings representing valid SVG's
-        # for backgound and rate_bg, then load them with PixbufLoader.
+        # for background and rate_bg, then load them with PixbufLoader.
         background = BACKGROUND_SVG.format(px=ALBUM_ART_SIZE, 
fg=fg_rgb).encode()
         rating_bg = RATING_BG_SVG.format(bg=bg_rgb).encode()
 
@@ -298,7 +300,7 @@
         self._query_position = Gst.Query.new_position(Gst.Format.TIME)
         self._query_buffer = Gst.Query.new_buffering(Gst.Format.PERCENT)
 
-        self.player = Gst.ElementFactory.make("playbin", "player")
+        self.player = Gst.ElementFactory.make("playbin3", "player")
         self.player.set_property('buffer-duration', 3 * Gst.SECOND)
         self.rgvolume = Gst.ElementFactory.make("rgvolume", "rgvolume")
         self.rgvolume.set_property("album-mode", False)
@@ -365,12 +367,13 @@
         self.worker = GObjectWorker()
 
         try:
-            tempdir_base = '/var/tmp' # Prefered over /tmp as lots of icons 
can be large in size.
+            tempdir_base = '/var/tmp' # Preferred over /tmp as lots of icons 
can be large in size.
             if is_flatpak():
                 # However in flatpak that path is not readable by the host.
                 tempdir_base = os.path.join(GLib.get_user_cache_dir(), 'tmp')
-            self.tempdir = tempfile.TemporaryDirectory(prefix='pithos-', 
dir=tempdir_base)
-            logging.info("Created temporary directory 
{}".format(self.tempdir.name))
+            self.tempdir = os.path.join(tempdir_base, 'pithos_cache')
+            os.makedirs(self.tempdir, exist_ok=True)
+            logging.info("Created temporary directory {}".format(self.tempdir))
         except IOError as e:
             self.tempdir = None
             logging.warning('Failed to create a temporary directory: 
{}'.format(e))
@@ -848,6 +851,15 @@
         else:
             self.user_play()
 
+    def clear_art_cache(self):
+        logging.info('Checking for expired art in cache')
+        timestamp = time.time()
+        with os.scandir(self.tempdir) as art_list:
+            for art in art_list:
+                age = timestamp - art.stat().st_mtime
+                if age > ART_CACHE_TIME:
+                    os.remove(os.path.join(self.tempdir, art.path))
+
     def get_playlist(self, start = False):
         if self.playlist_update_timer_id:
             GLib.source_remove(self.playlist_update_timer_id)
@@ -877,11 +889,16 @@
                 return (None, None,) + extra
 
             file_url = None
+            song, index = extra
             if tmpdir:
                 try:
-                    with tempfile.NamedTemporaryFile(prefix='art-', 
suffix='.jpeg', dir=tmpdir.name, delete=False) as f:
-                        f.write(image)
-                        file_url = urllib.parse.urljoin('file://', 
urllib.parse.quote(f.name))
+                    self.clear_art_cache()
+                    filename_hash = 
hashlib.sha256((song.artist+song.album).encode('utf-8')).hexdigest()+'.jpeg'
+                    cache_file_path = os.path.join(self.tempdir, filename_hash)
+                    file_url = urllib.parse.urljoin('file://', 
urllib.parse.quote(cache_file_path))
+                    if not os.path.exists(cache_file_path):
+                        with open(cache_file_path, 'xb') as f:
+                            f.write(image)
                 except IOError:
                     logging.warning("Failed to write art tempfile")
 
@@ -1068,7 +1085,7 @@
             return True
 
     def on_gst_stream_start(self, bus, message):
-        # Edge case. We might get this singal while we're reconnecting to 
Pandora.
+        # Edge case. We might get this signal while we're reconnecting to 
Pandora.
         # If so self.current_song will be None.
         if self.current_song is None:
             return
@@ -1076,7 +1093,6 @@
         self.current_song.duration = self.query_duration() or 
self.current_song.trackLength * Gst.SECOND
         self.current_song.duration_message = 
self.format_time(self.current_song.duration)
         self.update_song_row()
-        self.check_if_song_is_ad()
         # We can't seek so duration in MPRIS is just for display purposes if 
it's not off by more than a sec it's OK.
         if self.current_song.get_duration_sec() != 
self.current_song.trackLength:
             self.emit('metadata-changed', self.current_song)
@@ -1115,36 +1131,22 @@
         if not GstPbutils.install_plugins_installation_in_progress():
             self.next_song()
 
-    def check_if_song_is_ad(self):
-        if self.current_song.is_ad is None:
-            if self.current_song.duration:
-                if self.current_song.get_duration_sec() < 45:  # Less than 45 
seconds we assume it's an ad
-                    logging.info('Ad detected!')
-                    self.current_song.is_ad = True
-                    self.update_song_row()
-                    self.set_title("Commercial Advertisement - Pithos")
-                else:
-                    logging.info('Not an Ad..')
-                    self.current_song.is_ad = False
-            else:
-                logging.warning('dur_stat is False. The assumption that 
duration is available once the stream-start messages feeds is bad.')
-
     def on_gst_buffering(self, bus, message):
         # React to the buffer message immediately and also fire a short 
repeating timeout
         # to check the buffering state that cancels only if we're not 
buffering or there's a pending timeout.
         # This will insure we don't get stuck in a buffering state if we're 
really not buffering.
 
-        self.react_to_buffering_mesage(False)
+        self.react_to_buffering_message(False)
 
         if self.buffering_timer_id:
             GLib.source_remove(self.buffering_timer_id)
             self.buffering_timer_id = 0
-        self.buffering_timer_id = GLib.timeout_add(200, 
self.react_to_buffering_mesage, True)
+        self.buffering_timer_id = GLib.timeout_add(200, 
self.react_to_buffering_message, True)
 
-    def react_to_buffering_mesage(self, from_timeout):
+    def react_to_buffering_message(self, from_timeout):
         # If the pipeline signals that it is buffering set the player to 
PseudoGst.BUFFERING
         # (which is an alias to Gst.State.PAUSED). During buffering if the 
user goes to Pause
-        # or Play(an/or back again) go though all the motions but don't 
actaully change the
+        # or Play(an/or back again) go though all the motions but don't 
actually change the
         # player's state to the desired state until buffering has completed. 
The player only
         # cares about the actual state, the rest of Pithos only cares about 
our buffer_recovery
         # state, the state we *wish* we were in.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pithos-1.6.0/pithos/plugins/dbus_util/DBusServiceObject.py 
new/pithos-1.6.2/pithos/plugins/dbus_util/DBusServiceObject.py
--- old/pithos-1.6.0/pithos/plugins/dbus_util/DBusServiceObject.py      
2022-09-27 22:06:23.000000000 +0200
+++ new/pithos-1.6.2/pithos/plugins/dbus_util/DBusServiceObject.py      
2024-03-04 00:53:20.000000000 +0100
@@ -120,7 +120,7 @@
         return node
 
 def _create_arginfo_list(func, signature):
-    arg_names = inspect.getargspec(func).args
+    arg_names = inspect.getfullargspec(func).args
     signature_list = GLib.Variant.split_signature('(%s)' %signature) if 
signature else []
     arg_names.pop(0) # eat "self" argument
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pithos-1.6.0/pithos/plugins/lastfm.py 
new/pithos-1.6.2/pithos/plugins/lastfm.py
--- old/pithos-1.6.0/pithos/plugins/lastfm.py   2022-09-27 22:06:23.000000000 
+0200
+++ new/pithos-1.6.2/pithos/plugins/lastfm.py   2024-03-04 00:53:20.000000000 
+0100
@@ -51,7 +51,7 @@
         if self.settings['data']:
             self._enable_real()
         else:
-            # Show the LastFmAuth dialog on enabling the plugin if we aren't 
aready authorized.
+            # Show the LastFmAuth dialog on enabling the plugin if we aren't 
already authorized.
             dialog = self.preferences_dialog
             dialog.set_transient_for(self.window.prefs_dlg)
             dialog.set_destroy_with_parent(True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pithos-1.6.0/pithos/plugins/mpris.py 
new/pithos-1.6.2/pithos/plugins/mpris.py
--- old/pithos-1.6.0/pithos/plugins/mpris.py    2022-09-27 22:06:23.000000000 
+0200
+++ new/pithos-1.6.2/pithos/plugins/mpris.py    2024-03-04 00:53:20.000000000 
+0100
@@ -212,7 +212,7 @@
         ]
 
         if window.stations_dlg:
-            # If stations_dlg exsists already
+            # If stations_dlg exists already
             # we missed the ready signal and
             # we should connect our handlers.
             self._stations_dlg_ready_handler()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pithos-1.6.0/pithos/plugins/notify.py 
new/pithos-1.6.2/pithos/plugins/notify.py
--- old/pithos-1.6.0/pithos/plugins/notify.py   2022-09-27 22:06:23.000000000 
+0200
+++ new/pithos-1.6.2/pithos/plugins/notify.py   2024-03-04 00:53:20.000000000 
+0100
@@ -30,7 +30,7 @@
 
     def on_prepare(self):
         # We prefer the behavior of the fdo backend to the gtk backend
-        # as it doesn't force persistance which doesn't make sense for
+        # as it doesn't force persistence which doesn't make sense for
         # this application.
         if not is_flatpak():
             os.environ['GNOTIFICATION_BACKEND'] = 'freedesktop'

++++++ pithos.obsinfo ++++++
name: pithos
version: 1.6.2
mtime: 1709510000
commit: 0c5ca80c67ed18d292827f7582e2a9c935d50bea

Reply via email to