Hello community, here is the log from the commit of package lollypop for openSUSE:Factory checked in at 2018-10-26 11:10:53 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/lollypop (Old) and /work/SRC/openSUSE:Factory/.lollypop.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "lollypop" Fri Oct 26 11:10:53 2018 rev:53 rq:644711 version:0.9.609 Changes: -------- --- /work/SRC/openSUSE:Factory/lollypop/lollypop.changes 2018-10-25 09:09:04.854406830 +0200 +++ /work/SRC/openSUSE:Factory/.lollypop.new/lollypop.changes 2018-10-26 11:10:59.741661169 +0200 @@ -1,0 +2,12 @@ +Thu Oct 25 17:29:32 UTC 2018 - antoine.belvire@opensuse.org + +- Update to version 0.9.609: + * Fix a "sqlite db locked" introduced in 0.9.608. +- Changes from version 0.9.608: + * Fix an issue with multiple disc albums + (glgo#World/lollypop#1528). + * Fix hang while updating collection (glgo#World/lollypop#1517). + * Stop playback if writing to tags on current album + (glgo#World/lollypop#1527). + +------------------------------------------------------------------- Old: ---- lollypop-0.9.607.tar.xz New: ---- lollypop-0.9.609.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ lollypop.spec ++++++ --- /var/tmp/diff_new_pack.7ijW5y/_old 2018-10-26 11:11:01.385658992 +0200 +++ /var/tmp/diff_new_pack.7ijW5y/_new 2018-10-26 11:11:01.389658987 +0200 @@ -18,7 +18,7 @@ %global gobject_introspection_version 1.35.9 Name: lollypop -Version: 0.9.607 +Version: 0.9.609 Release: 0 Summary: GNOME music playing application License: GPL-3.0-or-later ++++++ _service ++++++ --- /var/tmp/diff_new_pack.7ijW5y/_old 2018-10-26 11:11:01.413658955 +0200 +++ /var/tmp/diff_new_pack.7ijW5y/_new 2018-10-26 11:11:01.413658955 +0200 @@ -1,7 +1,7 @@ <services> <service mode="disabled" name="tar_scm"> <param name="changesgenerate">enable</param> - <param name="revision">0.9.607</param> + <param name="revision">0.9.609</param> <param name="scm">git</param> <param name="url">https://gitlab.gnome.org/World/lollypop.git</param> <param name="versionformat">@PARENT_TAG@</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.7ijW5y/_old 2018-10-26 11:11:01.425658939 +0200 +++ /var/tmp/diff_new_pack.7ijW5y/_new 2018-10-26 11:11:01.429658934 +0200 @@ -1,4 +1,4 @@ <servicedata> <service name="tar_scm"> <param name="url">https://gitlab.gnome.org/World/lollypop.git</param> - <param name="changesrevision">4bfcd1f0e7da754750096381b9c255ae8af19cd2</param></service></servicedata> \ No newline at end of file + <param name="changesrevision">eee4683f8a1e94bd5ac330855f3372c3f10b7fc1</param></service></servicedata> \ No newline at end of file ++++++ lollypop-0.9.607.tar.xz -> lollypop-0.9.609.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/data/org.gnome.Lollypop.appdata.xml.in new/lollypop-0.9.609/data/org.gnome.Lollypop.appdata.xml.in --- old/lollypop-0.9.607/data/org.gnome.Lollypop.appdata.xml.in 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/data/org.gnome.Lollypop.appdata.xml.in 2018-10-25 14:37:37.000000000 +0200 @@ -27,14 +27,11 @@ </ul> </description> <releases> - <release version="0.9.605" date="2018-10-19"> + <release version="0.9.608" date="2018-10-24"> <description> <ul> - <li>Sort albums with full date</li> - <li>Faster album loading</li> - <li>Add a button to go from search to artist</li> - <li>Better wikipedia search</li> - <li>Allow importing loved tracks</li> + <li>Fix hang while updating collection</li> + <li>Fix an issue with multiple disc albums</li> </ul> </description> </release> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/lollypop/art_album.py new/lollypop-0.9.609/lollypop/art_album.py --- old/lollypop-0.9.607/lollypop/art_album.py 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/lollypop/art_album.py 2018-10-25 14:37:37.000000000 +0200 @@ -424,6 +424,8 @@ @param album_id as int """ if self.kid3_available: + if App().player.current_track.album.id == album_id: + App().player.stop() for uri in App().albums.get_track_uris(album_id, [], []): try: path = GLib.filename_from_uri(uri)[0] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/lollypop/collectionscanner.py new/lollypop-0.9.609/lollypop/collectionscanner.py --- old/lollypop-0.9.607/lollypop/collectionscanner.py 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/lollypop/collectionscanner.py 2018-10-25 14:37:37.000000000 +0200 @@ -132,9 +132,8 @@ else: files.append(f) except Exception as e: - Logger.error("""CollectionScanner:: - __get_objects_for_uris(): %s""" % e) - return ([], []) + Logger.error("CollectionScanner::__get_objects_for_uris(): %s" + % e) for f in files: try: if is_pls(f): @@ -142,11 +141,11 @@ elif is_audio(f): tracks.append(f.get_uri()) else: - Logger.debug("""%s not detected - as a music file""" % f.get_uri()) + Logger.debug("%s not detected as a music file" % + f.get_uri()) except Exception as e: - Logger.error("""CollectionScanner:: - __get_objects_for_uris(): %s""" % e) + Logger.error("CollectionScanner::__get_objects_for_uris(): %s" + % e) return (tracks, track_dirs) def __update_progress(self, current, total): @@ -192,12 +191,13 @@ self.__inotify.add_monitor(d) i = 0 - # Look for new files/modified files + # Look for new files/modified file + SqlCursor.add(App().db) try: to_add = [] - SqlCursor.add(App().db) for uri in new_tracks: if self.__thread is None: + SqlCursor.remove(App().db) return try: GLib.idle_add(self.__update_progress, i, count) @@ -247,6 +247,7 @@ i += 1 GLib.idle_add(self.__update_progress, i, count) self.__del_from_db(uri) + SqlCursor.allow_thread_execution(App().db) # Add files to db for (uri, mtime) in to_add: try: @@ -258,9 +259,10 @@ except Exception as e: Logger.error("CollectionScanner::__scan(add): %s, %s" % (e, uri)) - SqlCursor.remove(App().db) except Exception as e: Logger.error("CollectionScanner::__scan(): %s" % e) + SqlCursor.commit(App().db) + SqlCursor.remove(App().db) GLib.idle_add(self.__finish, modifications and saved) if not saved: self.__play_new_tracks(new_tracks) @@ -329,8 +331,7 @@ Logger.debug("CollectionScanner::add2db(): " "Add album artists %s" % album_artists) - (album_artist_ids, - new_artist_ids) = self.add_album_artists(album_artists, aa_sortnames) + album_artist_ids = self.add_album_artists(album_artists, aa_sortnames) # User does not want compilations if self.__disable_compilations and not album_artist_ids: @@ -345,13 +346,12 @@ Logger.debug("CollectionScanner::add2db(): Add album: " "%s, %s" % (album_name, album_artist_ids)) - (album_id, new_album) = self.add_album(album_name, mb_album_id, - album_artist_ids, - uri, loved, album_pop, - album_rate, mtime) + album_id = self.add_album(album_name, mb_album_id, + album_artist_ids, + uri, loved, album_pop, + album_rate, mtime) - (genre_ids, - new_genre_ids) = self.add_genres(genres) + genre_ids = self.add_genres(genres) # Add track to db Logger.debug("CollectionScanner::add2db(): Add track") @@ -360,18 +360,14 @@ album_id, year, timestamp, track_pop, track_rate, track_ltime, mtime, mb_track_id) - + SqlCursor.commit(App().db) Logger.debug("CollectionScanner::add2db(): Update track") self.__update_track(track_id, artist_ids, genre_ids) Logger.debug("CollectionScanner::add2db(): Update album") self.__update_album(album_id, album_artist_ids, genre_ids, year, timestamp) - if new_album: - SqlCursor.commit(App().db) - for genre_id in new_genre_ids: + for genre_id in genre_ids: GLib.idle_add(self.emit, "genre-updated", genre_id, True) - for artist_id in new_artist_ids: - GLib.idle_add(self.emit, "artist-updated", artist_id, True) return track_id def __del_from_db(self, uri): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/lollypop/database.py new/lollypop-0.9.609/lollypop/database.py --- old/lollypop-0.9.607/lollypop/database.py 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/lollypop/database.py 2018-10-25 14:37:37.000000000 +0200 @@ -24,6 +24,27 @@ from lollypop.utils import noaccents +class MyLock: + """ + Lock with count + """ + def __init__(self): + self.__lock = Lock() + self.__count = 0 + + def acquire(self): + self.__count += 1 + self.__lock.acquire() + + def release(self): + self.__count -= 1 + self.__lock.release() + + @property + def count(self): + return self.__count + + class Database: """ Base database object @@ -94,7 +115,7 @@ """ Create database tables or manage update if needed """ - self.thread_lock = Lock() + self.thread_lock = MyLock() f = Gio.File.new_for_path(self.DB_PATH) upgrade = DatabaseAlbumsUpgrade() if not f.query_exists(): @@ -103,7 +124,7 @@ if not d.query_exists(): d.make_directory_with_parents() # Create db schema - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: sql.execute(self.__create_albums) sql.execute(self.__create_artists) sql.execute(self.__create_genres) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/lollypop/database_albums.py new/lollypop-0.9.609/lollypop/database_albums.py --- old/lollypop-0.9.607/lollypop/database_albums.py 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/lollypop/database_albums.py 2018-10-25 14:37:37.000000000 +0200 @@ -46,7 +46,7 @@ @return inserted rowid as int @warning: commit needed """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: result = sql.execute("INSERT INTO albums\ (name, mb_album_id, no_album_artist,\ uri, loved, popularity, rate, mtime, synced)\ @@ -67,7 +67,7 @@ @param artist id as int @warning: commit needed """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: artist_ids = self.get_artist_ids(album_id) if artist_id not in artist_ids: sql.execute("INSERT INTO " @@ -81,7 +81,7 @@ @param genre id as int @warning: commit needed """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: genres = self.get_genre_ids(album_id) if genre_id not in genres: sql.execute("INSERT INTO\ @@ -96,7 +96,7 @@ @param artist_ids as [int] @warning: commit needed """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: currents = self.get_artist_ids(album_id) if not currents or set(currents) - set(artist_ids): sql.execute("DELETE FROM album_artists\ @@ -113,7 +113,7 @@ @param synced as int @warning: commit needed """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: sql.execute("UPDATE albums SET synced=? WHERE rowid=?", (synced, album_id)) @@ -124,7 +124,7 @@ @param loved as int @warning: commit needed """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: sql.execute("UPDATE albums SET loved=? WHERE rowid=?", (loved, album_id)) @@ -133,7 +133,7 @@ Set album rate @param rate as int """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: sql.execute("UPDATE albums SET rate=? WHERE rowid=?", (rate, album_id)) @@ -144,7 +144,7 @@ @param year as int @warning: commit needed """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: sql.execute("UPDATE albums SET year=? WHERE rowid=?", (year, album_id)) @@ -155,7 +155,7 @@ @param timestamp as int @warning: commit needed """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: sql.execute("UPDATE albums SET timestamp=? WHERE rowid=?", (timestamp, album_id)) @@ -165,7 +165,7 @@ @param Album id as int, uri as string @warning: commit needed """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: sql.execute("UPDATE albums SET uri=? WHERE rowid=?", (uri, album_id)) @@ -175,7 +175,7 @@ @param album_id as int @param popularity as int """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: try: sql.execute("UPDATE albums set popularity=? WHERE rowid=?", (popularity, album_id)) @@ -282,7 +282,7 @@ @param pop as int @raise sqlite3.OperationalError on db update """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: result = sql.execute("SELECT popularity from albums WHERE rowid=?", (album_id,)) pop = result.fetchone() @@ -1056,7 +1056,7 @@ @param return True if album deleted or genre modified @warning commit needed """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: ret = False # Check album really have tracks from its genres for genre_id in self.get_genre_ids(album_id): @@ -1107,7 +1107,7 @@ ON albums.rowid=t.album_id\ GROUP BY albums.rowid)") v = result.fetchone() - if v: + if v and v[0] is not None: self.__max_count = v[0] ####################### diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/lollypop/database_artists.py new/lollypop-0.9.609/lollypop/database_artists.py --- old/lollypop-0.9.607/lollypop/database_artists.py 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/lollypop/database_artists.py 2018-10-25 14:37:37.000000000 +0200 @@ -39,7 +39,7 @@ """ if sortname == "": sortname = format_artist_name(name) - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: result = sql.execute("INSERT INTO artists (name, sortname)\ VALUES (?, ?)", (name, sortname)) @@ -52,7 +52,7 @@ @param sort name a str @warning: commit needed """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: sql.execute("UPDATE artists\ SET sortname=?\ WHERE rowid=?", @@ -257,7 +257,7 @@ @return cleaned as bool @warning commit needed """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: cleaned = False result = sql.execute("SELECT album_id from album_artists\ WHERE artist_id=?\ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/lollypop/database_genres.py new/lollypop-0.9.609/lollypop/database_genres.py --- old/lollypop-0.9.607/lollypop/database_genres.py 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/lollypop/database_genres.py 2018-10-25 14:37:37.000000000 +0200 @@ -36,7 +36,7 @@ @return inserted rowid as int @warning: commit needed """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: result = sql.execute("INSERT INTO genres (name) VALUES (?)", (name,)) return result.lastrowid @@ -128,7 +128,7 @@ @return cleaned as bool @warning commit needed """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: cleaned = False result = sql.execute("SELECT track_id from track_genres\ WHERE genre_id=?\ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/lollypop/database_history.py new/lollypop-0.9.609/lollypop/database_history.py --- old/lollypop-0.9.607/lollypop/database_history.py 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/lollypop/database_history.py 2018-10-25 14:37:37.000000000 +0200 @@ -45,11 +45,11 @@ self.thread_lock = Lock() # Create db schema try: - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: sql.execute(self.__create_history) except: pass - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: result = sql.execute("SELECT COUNT(*)\ FROM history") v = result.fetchone() @@ -75,7 +75,7 @@ @param album_rate as int @thread safe """ - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: if self.exists(name, duration): sql.execute("UPDATE history\ SET popularity=?,rate=?,ltime=?,mtime=?,\ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/lollypop/database_tracks.py new/lollypop-0.9.609/lollypop/database_tracks.py --- old/lollypop-0.9.607/lollypop/database_tracks.py 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/lollypop/database_tracks.py 2018-10-25 14:37:37.000000000 +0200 @@ -54,7 +54,7 @@ @return inserted rowid as int @warning: commit needed """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: result = sql.execute( "INSERT INTO tracks (name, uri, duration, tracknumber,\ discnumber, discname, album_id,\ @@ -84,7 +84,7 @@ @param artist id as int @warning: commit needed """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: artists = self.get_artist_ids(track_id) if artist_id not in artists: sql.execute("INSERT INTO " @@ -98,7 +98,7 @@ @param genre id as int @warning: commit needed """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: genres = self.get_genre_ids(track_id) if genre_id not in genres: sql.execute("INSERT INTO\ @@ -283,7 +283,7 @@ @param Track id as int @param uri as string """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: sql.execute("UPDATE tracks SET uri=?\ WHERE rowid=?", (uri, track_id)) @@ -296,7 +296,7 @@ @param Track id as int @param rate as int """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: sql.execute("UPDATE tracks SET rate=?\ WHERE rowid=?", (rate, track_id)) @@ -460,7 +460,7 @@ @param Track id as int @param duration as int """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: sql.execute("UPDATE tracks\ SET duration=?\ WHERE rowid=?", (duration, track_id,)) @@ -557,7 +557,7 @@ @param track id as int @raise sqlite3.OperationalError on db update """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: result = sql.execute("SELECT popularity from tracks WHERE rowid=?", (track_id,)) pop = result.fetchone() @@ -575,7 +575,7 @@ @param track id as int @param time as int """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: sql.execute("UPDATE tracks set ltime=? WHERE rowid=?", (time, track_id)) @@ -603,31 +603,6 @@ ORDER BY ltime DESC LIMIT 100") return list(itertools.chain(*result)) - def get_persistent(self, track_id): - """ - Return track persistent - @param track id as int - @return int - """ - with SqlCursor(App().db) as sql: - result = sql.execute("SELECT rowid FROM tracks\ - WHERE persistent=?", (track_id,)) - v = result.fetchone() - if v is not None: - return v[0] - return 0 - - def set_persistent(self, track_id, persistent): - """ - Set track persistent - @param track id as int - @param persistent as int - """ - with SqlCursor(App().db) as sql: - sql.execute("UPDATE tracks\ - SET persistent=?\ - WHERE rowid=?", (persistent, track_id,)) - def get_randoms(self): """ Return random tracks @@ -645,7 +620,7 @@ @param track id as int @param popularity as int """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: try: sql.execute("UPDATE tracks set popularity=? WHERE rowid=?", (popularity, track_id)) @@ -713,7 +688,7 @@ @param track_id as int @warning commit needed """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: sql.execute("DELETE FROM track_artists\ WHERE track_id = ?", (track_id,)) sql.execute("DELETE FROM track_genres\ @@ -758,7 +733,7 @@ Remove track @param track id as int """ - with SqlCursor(App().db) as sql: + with SqlCursor(App().db, True) as sql: sql.execute("DELETE FROM track_genres\ WHERE track_id=?", (track_id,)) sql.execute("DELETE FROM track_artists\ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/lollypop/database_upgrade.py new/lollypop-0.9.609/lollypop/database_upgrade.py --- old/lollypop-0.9.607/lollypop/database_upgrade.py 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/lollypop/database_upgrade.py 2018-10-25 14:37:37.000000000 +0200 @@ -45,12 +45,12 @@ # Migration from gsettings gsettings_version = App().settings.get_value("db-version").get_int32() if gsettings_version != -1: - with SqlCursor(db) as sql: + with SqlCursor(db, True) as sql: sql.execute("PRAGMA user_version=%s" % gsettings_version) App().settings.set_value("db-version", GLib.Variant("i", -1)) version = 0 - with SqlCursor(db) as sql: + with SqlCursor(db, True) as sql: result = sql.execute("PRAGMA user_version") v = result.fetchone() if v is not None: @@ -139,7 +139,7 @@ """ Add a sorted field to artists """ - with SqlCursor(db) as sql: + with SqlCursor(db, True) as sql: sql.execute("ALTER TABLE artists ADD sortname TEXT") result = sql.execute("SELECT DISTINCT artists.rowid,\ artists.name\ @@ -155,7 +155,7 @@ """ Add album artists table """ - with SqlCursor(db) as sql: + with SqlCursor(db, True) as sql: sql.execute("CREATE TABLE album_artists (\ album_id INT NOT NULL,\ artist_id INT NOT NULL)") @@ -209,7 +209,7 @@ """ Convert tracks filepath column to uri """ - with SqlCursor(db) as sql: + with SqlCursor(db, True) as sql: sql.execute("ALTER TABLE tracks RENAME TO tmp_tracks") sql.execute("""CREATE TABLE tracks (id INTEGER PRIMARY KEY, name TEXT NOT NULL, @@ -265,7 +265,7 @@ """ if App().notify: App().notify.send("Please wait while upgrading db...") - with SqlCursor(db) as sql: + with SqlCursor(db, True) as sql: result = sql.execute("SELECT tracks.rowid FROM tracks\ WHERE NOT EXISTS (\ SELECT track_id\ @@ -282,7 +282,7 @@ for path in paths: uris.append(GLib.filename_to_uri(path)) App().settings.set_value("music-uris", GLib.Variant("as", uris)) - with SqlCursor(db) as sql: + with SqlCursor(db, True) as sql: sql.execute("ALTER TABLE albums RENAME TO tmp_albums") sql.execute("""CREATE TABLE albums ( id INTEGER PRIMARY KEY, @@ -327,7 +327,7 @@ INT NOT NULL DEFAULT -1") except: pass # May fails if History was non existent - with SqlCursor(db) as sql: + with SqlCursor(db, True) as sql: sql.execute("ALTER TABLE tracks ADD rate\ INT NOT NULL DEFAULT -1") sql.execute("ALTER TABLE albums ADD rate\ @@ -338,7 +338,7 @@ Add mtimes tables """ mtime = int(time()) - with SqlCursor(db) as sql: + with SqlCursor(db, True) as sql: sql.execute("ALTER TABLE album_genres\ ADD mtime INT NOT NULL DEFAULT %s" % mtime) sql.execute("ALTER TABLE track_genres\ @@ -458,7 +458,7 @@ """ Remove Charts/Web entries """ - with SqlCursor(db) as sql: + with SqlCursor(db, True) as sql: result = sql.execute("SELECT rowid FROM tracks\ WHERE persistent=0 OR\ persistent=2 OR\ @@ -525,7 +525,7 @@ """ Restore back mtime in tracks """ - with SqlCursor(db) as sql: + with SqlCursor(db, True) as sql: sql.execute("ALTER TABLE tracks ADD mtime INT") sql.execute("ALTER TABLE albums ADD mtime INT") @@ -560,7 +560,7 @@ """ Rename album_id to mb_album_id in albums """ - with SqlCursor(db) as sql: + with SqlCursor(db, True) as sql: sql.execute("ALTER TABLE albums RENAME TO tmp_albums") sql.execute("""CREATE TABLE albums ( id INTEGER PRIMARY KEY, @@ -587,7 +587,7 @@ Upgrade setting based on db https://gitlab.gnome.org/gnumdk/lollypop/issues/1368 """ - with SqlCursor(db) as sql: + with SqlCursor(db, True) as sql: result = sql.execute("SELECT albums.rowid\ FROM albums, album_artists\ WHERE album_artists.artist_id=?\ @@ -605,7 +605,7 @@ from time import strptime, mktime from datetime import datetime for item in ["albums", "tracks"]: - with SqlCursor(db) as sql: + with SqlCursor(db, True) as sql: sql.execute("ALTER TABLE %s ADD timestamp INT" % item) result = sql.execute("SELECT rowid, year FROM %s" % item) for (rowid, year) in result: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/lollypop/player_bin.py new/lollypop-0.9.609/lollypop/player_bin.py --- old/lollypop-0.9.607/lollypop/player_bin.py 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/lollypop/player_bin.py 2018-10-25 14:37:37.000000000 +0200 @@ -295,13 +295,7 @@ for scrobbler in App().scrobblers: if scrobbler.available: scrobbler.playing_now(self._current_track) - try: - # Should not raise anything since SqlCursor handles locks - if not App().scanner.is_locked(): - App().tracks.set_listened_at(self._current_track.id, - int(time())) - except Exception as e: - Logger.error("BinPlayer::_on_stream_start(): %s", e) + App().tracks.set_listened_at(self._current_track.id, int(time())) def _on_bus_message_tag(self, bus, message): """ @@ -384,7 +378,7 @@ return self._scrobble(self._current_track, self._start_time) # Increment popularity - if not App().scanner.is_locked() and self._current_track.id >= 0: + if self._current_track.id >= 0: App().tracks.set_more_popular(self._current_track.id) # In party mode, linear popularity if self.is_party: @@ -487,22 +481,21 @@ if track is None: self._scrobble(self._current_track, self._start_time) # Increment popularity - if not App().scanner.is_locked(): - App().tracks.set_more_popular(self._current_track.id) - # In party mode, linear popularity - if self.is_party: - pop_to_add = 1 - # In normal mode, based on tracks count + App().tracks.set_more_popular(self._current_track.id) + # In party mode, linear popularity + if self.is_party: + pop_to_add = 1 + # In normal mode, based on tracks count + else: + count = App().albums.get_tracks_count( + self._current_track.album_id) + if count: + pop_to_add = int(App().albums.max_count / count) else: - count = App().albums.get_tracks_count( - self._current_track.album_id) - if count: - pop_to_add = int(App().albums.max_count / count) - else: - pop_to_add = 0 - if pop_to_add > 0: - App().albums.set_more_popular(self._current_track.album_id, - pop_to_add) + pop_to_add = 0 + if pop_to_add > 0: + App().albums.set_more_popular(self._current_track.album_id, + pop_to_add) GLib.idle_add(self.__volume_down, self._playbin, self._plugins, duration) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/lollypop/playlists.py new/lollypop-0.9.609/lollypop/playlists.py --- old/lollypop-0.9.607/lollypop/playlists.py 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/lollypop/playlists.py 2018-10-25 14:37:37.000000000 +0200 @@ -63,7 +63,7 @@ f = Gio.File.new_for_path(self._DB_PATH) if not f.query_exists(): try: - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: sql.execute(self.__create_playlists) sql.execute(self.__create_tracks) sql.execute("PRAGMA user_version=%s" % upgrade.version) @@ -81,7 +81,7 @@ """ if name == self.LOVED: return Type.LOVED - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: result = sql.execute("INSERT INTO playlists (name, mtime)" " VALUES (?, ?)", (name, datetime.now().strftime("%s"))) @@ -111,7 +111,7 @@ @param old_name as str @param new_name as str """ - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: playlist_id = self.get_id(old_name) sql.execute("UPDATE playlists\ SET name=?\ @@ -124,7 +124,7 @@ delete playlist @param playlist name as str """ - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: playlist_id = self.get_id(name) sql.execute("DELETE FROM playlists\ WHERE name=?", @@ -139,7 +139,7 @@ Remove track from playlists @param uri as str """ - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: sql.execute("DELETE FROM tracks\ WHERE uri=?", (uri,)) @@ -359,7 +359,7 @@ @param playlist_id as int @param synced as bool """ - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: sql.execute("UPDATE playlists\ SET synced=?\ WHERE rowid=?", @@ -371,7 +371,7 @@ @param playlist id as int @param notify as bool """ - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: sql.execute("DELETE FROM tracks\ WHERE playlist_id=?", (playlist_id,)) if notify: @@ -384,7 +384,7 @@ @param tracks as [Track] @param notify as bool """ - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: changed = False for track in tracks: if not self.exists_track(playlist_id, track): @@ -406,7 +406,7 @@ @param playlist id as int @param uris as [str] """ - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: for uri in uris: sql.execute("INSERT INTO tracks" " VALUES (?, ?)", @@ -421,7 +421,7 @@ @param playlist id as int @param tracks as [Track] """ - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: for track in tracks: sql.execute("DELETE FROM tracks\ WHERE uri=?\ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/lollypop/radios.py new/lollypop-0.9.609/lollypop/radios.py --- old/lollypop-0.9.607/lollypop/radios.py 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/lollypop/radios.py 2018-10-25 14:37:37.000000000 +0200 @@ -45,7 +45,7 @@ self.thread_lock = Lock() # Create db schema try: - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: sql.execute(self.create_radios) except: pass @@ -57,7 +57,7 @@ @param url as str @thread safe """ - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: if self.exists(name): sql.execute("UPDATE radios\ SET url=?\ @@ -91,7 +91,7 @@ @param old playlist name as str @param new playlist name as str """ - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: sql.execute("UPDATE radios\ SET name=?\ WHERE name=?", @@ -103,7 +103,7 @@ delete radio @param radio name as str """ - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: sql.execute("DELETE FROM radios\ WHERE name=?", (name,)) @@ -167,7 +167,7 @@ Set radio more popular @param name as str """ - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: result = sql.execute("SELECT popularity from radios WHERE name=?", (name,)) pop = result.fetchone() @@ -214,7 +214,7 @@ @param name as str @param popularity as int """ - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: try: sql.execute("UPDATE radios SET\ popularity=? WHERE name=?", @@ -228,7 +228,7 @@ @param name as str @param rate as int """ - with SqlCursor(self) as sql: + with SqlCursor(self, True) as sql: try: sql.execute("UPDATE radios SET\ rate=? WHERE name=?", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/lollypop/sqlcursor.py new/lollypop-0.9.609/lollypop/sqlcursor.py --- old/lollypop-0.9.607/lollypop/sqlcursor.py 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/lollypop/sqlcursor.py 2018-10-25 14:37:37.000000000 +0200 @@ -45,24 +45,30 @@ Commit current obj """ name = current_thread().getName() + obj.__class__.__name__ - App().cursors[name].commit() + if name in App().cursors.keys(): + App().cursors[name].commit() def allow_thread_execution(obj): """ Release thread lock allowing others threads execution """ name = current_thread().getName() + obj.__class__.__name__ - if name in App().cursors.keys() and len(App().cursors.keys()) > 1: + if name in App().cursors.keys() and obj.thread_lock.count > 1: + App().cursors[name].commit() obj.thread_lock.release() sleep(0.01) obj.thread_lock.acquire() - def __init__(self, obj): + def __init__(self, obj, commit=False): """ - Init object + Init object, if using multiple SqlCursor, parent commit param will + be used + @param obj as Database/Playlists/Radios + @param commit as bool """ self.__obj = obj self.__creator = False + self.__commit = commit def __enter__(self): """ @@ -70,19 +76,20 @@ """ name = current_thread().getName() + self.__obj.__class__.__name__ if name not in App().cursors.keys(): - self.__creator = True App().cursors[name] = self.__obj.get_cursor() - self.__obj.thread_lock.acquire() + self.__creator = True + if self.__commit: + self.__obj.thread_lock.acquire() return App().cursors[name] def __exit__(self, type, value, traceback): """ If creator, close cursor and remove it """ - if self.__creator: - name = current_thread().getName() + self.__obj.__class__.__name__ - if name in App().cursors.keys(): + name = current_thread().getName() + self.__obj.__class__.__name__ + if name in App().cursors.keys() and self.__creator: + if self.__commit: App().cursors[name].commit() - App().cursors[name].close() - del App().cursors[name] - self.__obj.thread_lock.release() + self.__obj.thread_lock.release() + App().cursors[name].close() + del App().cursors[name] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/lollypop/tagreader.py new/lollypop-0.9.609/lollypop/tagreader.py --- old/lollypop-0.9.607/lollypop/tagreader.py 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/lollypop/tagreader.py 2018-10-25 14:37:37.000000000 +0200 @@ -487,11 +487,10 @@ @param artists as [string] @param sortnames as [string] @param artist ids as int - @return ([int], [int]) + @return [int] @commit needed """ artist_ids = [] - new_artist_ids = [] sortsplit = sortnames.split(";") sortlen = len(sortsplit) i = 0 @@ -508,12 +507,11 @@ if sortname is None: sortname = format_artist_name(artist) artist_id = App().artists.add(artist, sortname) - new_artist_ids.append(artist_id) elif sortname is not None: App().artists.set_sortname(artist_id, sortname) i += 1 artist_ids.append(artist_id) - return (artist_ids, new_artist_ids) + return artist_ids def add_genres(self, genres): """ @@ -524,7 +522,6 @@ """ # Get all genre ids genre_ids = [] - new_genre_ids = [] for genre in genres.split(";"): genre = genre.strip() if genre != "": @@ -532,9 +529,8 @@ genre_id = App().genres.get_id(genre) if genre_id is None: genre_id = App().genres.add(genre) - new_genre_ids.append(genre_id) genre_ids.append(genre_id) - return (genre_ids, new_genre_ids) + return genre_ids def add_album(self, album_name, mb_album_id, artist_ids, uri, loved, popularity, rate, mtime): @@ -548,20 +544,18 @@ @param popularity as int @param rate as int @param mtime as int - @return (album id as int, new as bool) + @return album_id as int @commit needed """ f = Gio.File.new_for_uri(uri) d = f.get_parent() parent_uri = "/" if d is None else d.get_uri() - new = False album_id = App().albums.get_id(album_name, mb_album_id, artist_ids) if album_id is None: - new = True album_id = App().albums.add(album_name, mb_album_id, artist_ids, parent_uri, loved, popularity, rate, mtime) # Now we have our album id, check if path doesn"t change if App().albums.get_uri(album_id) != parent_uri: App().albums.set_uri(album_id, parent_uri) - return (album_id, new) + return album_id diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/lollypop/widgets_album.py new/lollypop-0.9.609/lollypop/widgets_album.py --- old/lollypop-0.9.607/lollypop/widgets_album.py 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/lollypop/widgets_album.py 2018-10-25 14:37:37.000000000 +0200 @@ -63,13 +63,6 @@ self._show_overlay_func(set) @property - def is_populated(self): - """ - True if album populated - """ - return True - - @property def filter(self): return "" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/lollypop/widgets_album_simple.py new/lollypop-0.9.609/lollypop/widgets_album_simple.py --- old/lollypop-0.9.607/lollypop/widgets_album_simple.py 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/lollypop/widgets_album_simple.py 2018-10-25 14:37:37.000000000 +0200 @@ -99,6 +99,13 @@ width = Gtk.FlowBoxChild.do_get_preferred_width(self)[0] return (width, width) + @property + def is_populated(self): + """ + True if album populated + """ + return True + ####################### # PROTECTED # ####################### diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/lollypop/widgets_radio.py new/lollypop-0.9.609/lollypop/widgets_radio.py --- old/lollypop-0.9.607/lollypop/widgets_radio.py 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/lollypop/widgets_radio.py 2018-10-25 14:37:37.000000000 +0200 @@ -135,6 +135,13 @@ self._artwork.set_state(Gtk.StateType.NORMAL) @property + def is_populated(self): + """ + True if album populated + """ + return True + + @property def id(self): """ Return widget id (same value for all radio widgets) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/lollypop/widgets_rating.py new/lollypop-0.9.609/lollypop/widgets_rating.py --- old/lollypop-0.9.607/lollypop/widgets_rating.py 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/lollypop/widgets_rating.py 2018-10-25 14:37:37.000000000 +0200 @@ -111,8 +111,6 @@ @param widget as Gtk.EventBox @param event as Gdk.Event """ - if App().scanner.is_locked(): - return user_rating = True rate = self.__object.get_rate() # -1 for compatiblity with previous release diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/meson.build new/lollypop-0.9.609/meson.build --- old/lollypop-0.9.607/meson.build 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/meson.build 2018-10-25 14:37:37.000000000 +0200 @@ -1,5 +1,5 @@ project('lollypop', - version: '0.9.607', + version: '0.9.609', meson_version: '>= 0.40.0' ) i18n = import('i18n') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/subprojects/po/ar.po new/lollypop-0.9.609/subprojects/po/ar.po --- old/lollypop-0.9.607/subprojects/po/ar.po 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/subprojects/po/ar.po 2018-10-25 14:37:37.000000000 +0200 @@ -8,7 +8,7 @@ "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-10-09 18:44+0200\n" -"PO-Revision-Date: 2018-10-02 21:21+0000\n" +"PO-Revision-Date: 2018-10-23 16:22+0000\n" "Last-Translator: AbouZakaria <zakariakov@gmail.com>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/gnumdk/lollypop/" "ar/>\n" @@ -18,7 +18,7 @@ "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 3.2-dev\n" +"X-Generator: Weblate 3.3-dev\n" #: ../data/org.gnome.Lollypop.gschema.xml:28 msgid "Window size" @@ -194,7 +194,7 @@ #: ../data/org.gnome.Lollypop.gschema.xml:188 msgid "Disable scrobbling usage" -msgstr "" +msgstr "تعطيل استخدام scrobbler" #: ../data/org.gnome.Lollypop.gschema.xml:193 msgid "Handle compilations" @@ -389,11 +389,11 @@ #: ../data/org.gnome.Lollypop.appdata.xml.in:33 msgid "Fix a crash in artist view" -msgstr "" +msgstr "إصلاح العطل في عرض الفنان" #: ../data/org.gnome.Lollypop.appdata.xml.in:40 msgid "Fix a freeze in playlists" -msgstr "" +msgstr "إصلاح التجميد في قوائم التشغيل" #: ../data/org.gnome.Lollypop.desktop.in:4 msgid "Music Player" @@ -892,7 +892,7 @@ #: ../data/Shortcuts.ui:170 msgctxt "shortcut window" msgid "Enable/disable scrobbling" -msgstr "" +msgstr "تمكين / تعطيل scrobbler" #: ../data/ToolbarEnd.ui:7 msgid "Party mode" @@ -936,11 +936,11 @@ #: ../data/ToolbarEnd.ui:53 msgid "Scrobbling" -msgstr "" +msgstr "Scrobbler" #: ../data/ToolbarEnd.ui:55 msgid "Enable scrobbling" -msgstr "" +msgstr "تمكبن Scrobbler" #: ../data/ToolbarEnd.ui:99 msgid "Playback type" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lollypop-0.9.607/subprojects/po/de.po new/lollypop-0.9.609/subprojects/po/de.po --- old/lollypop-0.9.607/subprojects/po/de.po 2018-10-21 22:19:13.000000000 +0200 +++ new/lollypop-0.9.609/subprojects/po/de.po 2018-10-25 14:37:37.000000000 +0200 @@ -20,7 +20,7 @@ "Project-Id-Version: lollypop\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-10-09 18:44+0200\n" -"PO-Revision-Date: 2018-09-28 20:27+0000\n" +"PO-Revision-Date: 2018-10-23 12:29+0000\n" "Last-Translator: Vincent Bermel <willovince@openmailbox.org>\n" "Language-Team: German <https://hosted.weblate.org/projects/gnumdk/lollypop/" "de/>\n" @@ -29,7 +29,7 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.2-dev\n" +"X-Generator: Weblate 3.3-dev\n" #: ../data/org.gnome.Lollypop.gschema.xml:28 msgid "Window size" @@ -205,7 +205,7 @@ #: ../data/org.gnome.Lollypop.gschema.xml:188 msgid "Disable scrobbling usage" -msgstr "" +msgstr "Scrobbling deaktivieren" #: ../data/org.gnome.Lollypop.gschema.xml:193 msgid "Handle compilations" @@ -410,11 +410,11 @@ #: ../data/org.gnome.Lollypop.appdata.xml.in:33 msgid "Fix a crash in artist view" -msgstr "" +msgstr "Fehler in Künstlerübersicht behoben" #: ../data/org.gnome.Lollypop.appdata.xml.in:40 msgid "Fix a freeze in playlists" -msgstr "" +msgstr "Wiedergabelisten-Absturz behoben" #: ../data/org.gnome.Lollypop.desktop.in:4 msgid "Music Player" @@ -916,7 +916,7 @@ #: ../data/Shortcuts.ui:170 msgctxt "shortcut window" msgid "Enable/disable scrobbling" -msgstr "" +msgstr "Scrobbling (de)aktivieren" #: ../data/ToolbarEnd.ui:7 msgid "Party mode" @@ -960,11 +960,11 @@ #: ../data/ToolbarEnd.ui:53 msgid "Scrobbling" -msgstr "" +msgstr "Scrobbling" #: ../data/ToolbarEnd.ui:55 msgid "Enable scrobbling" -msgstr "" +msgstr "Scrobbling aktivieren" #: ../data/ToolbarEnd.ui:99 msgid "Playback type" @@ -1160,11 +1160,11 @@ #: ../lollypop/pop_search.py:112 msgid "<big>No results for this search</big>" -msgstr "" +msgstr "<big>Keine Ergebnisse für diesen Suchbegriff</big>" #: ../lollypop/pop_search.py:119 msgid "<big>Search for artists, albums and tracks</big>" -msgstr "" +msgstr "<big>Nach Künstlern, Album und Titeln suchen</big>" #: ../lollypop/pop_tunein.py:92 ../lollypop/pop_tunein.py:401 msgid "Can't connect to TuneIn…"