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
