Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package picard for openSUSE:Factory checked 
in at 2021-10-13 18:06:20
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/picard (Old)
 and      /work/SRC/openSUSE:Factory/.picard.new.2443 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "picard"

Wed Oct 13 18:06:20 2021 rev:54 rq:925045 version:2.6.4

Changes:
--------
--- /work/SRC/openSUSE:Factory/picard/picard.changes    2021-06-11 
00:19:15.197377336 +0200
+++ /work/SRC/openSUSE:Factory/.picard.new.2443/picard.changes  2021-10-13 
18:10:44.811712890 +0200
@@ -1,0 +2,15 @@
+Wed Oct 13 08:19:10 UTC 2021 - Michael Vetter <[email protected]>
+
+- Update to 2.6.4:
+  * PICARD-2199 - Saving ID3 ratings fails, if rating e-mail contains
+    non latin-1 characters
+  * PICARD-2200 - Copy and pasting function names from inline scripting
+    docs can copy Unicode left-to-right mark
+  * PICARD-2230 - Picard fails to start on Windows if the hostname
+    contains non-ASCII characters and browser integration is enabled
+  * PICARD-2269 - "TypeError: arguments did not match any overloaded
+    call" with Python 3.10
+  * PICARD-2274 - Picard 2.6.3 crashes when track is removed or moved
+    during lookup
+
+-------------------------------------------------------------------

Old:
----
  picard-2.6.3.tar.gz

New:
----
  picard-2.6.4.tar.gz

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

Other differences:
------------------
++++++ picard.spec ++++++
--- /var/tmp/diff_new_pack.8kHfn5/_old  2021-10-13 18:10:45.291713643 +0200
+++ /var/tmp/diff_new_pack.8kHfn5/_new  2021-10-13 18:10:45.291713643 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           picard
-Version:        2.6.3
+Version:        2.6.4
 Release:        0
 Summary:        The Next Generation MusicBrainz Tagger
 License:        GPL-2.0-or-later

++++++ picard-2.6.3.tar.gz -> picard-2.6.4.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/picard-release-2.6.3/NEWS.md 
new/picard-release-2.6.4/NEWS.md
--- old/picard-release-2.6.3/NEWS.md    2021-06-06 12:45:12.000000000 +0200
+++ new/picard-release-2.6.4/NEWS.md    2021-10-06 07:50:29.000000000 +0200
@@ -1,3 +1,14 @@
+# Version 2.6.4 - 2021-10-06
+
+## Bugfixes
+
+- [PICARD-2199](https://tickets.metabrainz.org/browse/PICARD-2199) - Saving 
ID3 ratings fails, if rating e-mail contains non latin-1 characters
+- [PICARD-2200](https://tickets.metabrainz.org/browse/PICARD-2200) - Copy and 
pasting function names from inline scripting docs can copy Unicode 
left-to-right mark
+- [PICARD-2230](https://tickets.metabrainz.org/browse/PICARD-2230) - Picard 
fails to start on Windows if the hostname contains non-ASCII characters and 
browser integration is enabled
+- [PICARD-2269](https://tickets.metabrainz.org/browse/PICARD-2269) - 
"TypeError: arguments did not match any overloaded call" with Python 3.10
+- [PICARD-2274](https://tickets.metabrainz.org/browse/PICARD-2274) - Picard 
2.6.3 crashes when track is removed or moved during lookup
+
+
 # Version 2.6.3 - 2021-06-07
 
 ## Bugfixes
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/picard-release-2.6.3/picard/__init__.py 
new/picard-release-2.6.4/picard/__init__.py
--- old/picard-release-2.6.3/picard/__init__.py 2021-06-06 12:45:12.000000000 
+0200
+++ new/picard-release-2.6.4/picard/__init__.py 2021-10-06 07:50:29.000000000 
+0200
@@ -41,7 +41,7 @@
 PICARD_DISPLAY_NAME = "MusicBrainz Picard"
 PICARD_APP_ID = "org.musicbrainz.Picard"
 PICARD_DESKTOP_NAME = PICARD_APP_ID + ".desktop"
-PICARD_VERSION = Version(2, 6, 3, 'final', 0)
+PICARD_VERSION = Version(2, 6, 4, 'final', 0)
 
 
 # optional build version
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/picard-release-2.6.3/picard/browser/browser.py 
new/picard-release-2.6.4/picard/browser/browser.py
--- old/picard-release-2.6.3/picard/browser/browser.py  2021-06-06 
12:45:12.000000000 +0200
+++ new/picard-release-2.6.4/picard/browser/browser.py  2021-10-06 
07:50:29.000000000 +0200
@@ -106,26 +106,32 @@
         else:
             host_address = '0.0.0.0'  # nosec
 
-        for port in range(config.setting["browser_integration_port"], 65535):
-            try:
-                self.server = ThreadingHTTPServer((host_address, port), 
RequestHandler)
-            except OSError:
-                continue
-            log.info("Starting the browser integration (%s:%d)", host_address, 
port)
-            self.listen_port_changed.emit(port)
-            threading.Thread(target=self.server.serve_forever).start()
-            break
-        else:
-            log.error("Failed finding an available port for the browser 
integration.")
-            self.stop()
+        try:
+            for port in range(config.setting["browser_integration_port"], 
65535):
+                try:
+                    self.server = ThreadingHTTPServer((host_address, port), 
RequestHandler)
+                except OSError:
+                    continue
+                log.info("Starting the browser integration (%s:%d)", 
host_address, port)
+                self.listen_port_changed.emit(port)
+                threading.Thread(target=self.server.serve_forever).start()
+                break
+            else:
+                log.error("Failed finding an available port for the browser 
integration.")
+                self.stop()
+        except Exception:
+            log.error("Failed starting the browser integration on %s", 
host_address, exc_info=True)
 
     def stop(self):
         if self.server:
-            log.info("Stopping the browser integration")
-            self.server.shutdown()
-            self.server.server_close()
-            self.server = None
-            self.listen_port_changed.emit(self.port)
+            try:
+                log.info("Stopping the browser integration")
+                self.server.shutdown()
+                self.server.server_close()
+                self.server = None
+                self.listen_port_changed.emit(self.port)
+            except Exception:
+                log.error("Failed stopping the browser integration", 
exc_info=True)
         else:
             log.debug("Browser integration inactive, no need to stop")
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/picard-release-2.6.3/picard/formats/id3.py 
new/picard-release-2.6.4/picard/formats/id3.py
--- old/picard-release-2.6.3/picard/formats/id3.py      2021-06-06 
12:45:12.000000000 +0200
+++ new/picard-release-2.6.4/picard/formats/id3.py      2021-10-06 
07:50:29.000000000 +0200
@@ -259,7 +259,7 @@
         tags = file.tags or {}
         config = get_config()
         itunes_compatible = config.setting['itunes_compatible_grouping']
-        rating_user_email = config.setting['rating_user_email']
+        rating_user_email = id3text(config.setting['rating_user_email'], 0)
         rating_steps = config.setting['rating_steps']
         # upgrade custom 2.3 frames to 2.4
         for old, new in self.__upgrade.items():
@@ -458,9 +458,10 @@
             elif name == 'musicbrainz_recordingid':
                 tags.add(id3.UFID(owner='http://musicbrainz.org', 
data=bytes(values[0], 'ascii')))
             elif name == '~rating':
+                rating_email = id3text(config.setting['rating_user_email'], 0)
                 # Search for an existing POPM frame to get the current 
playcount
                 for frame in tags.values():
-                    if frame.FrameID == 'POPM' and frame.email == 
config.setting['rating_user_email']:
+                    if frame.FrameID == 'POPM' and frame.email == rating_email:
                         count = getattr(frame, 'count', 0)
                         break
                 else:
@@ -468,7 +469,7 @@
 
                 # Convert rating to range between 0 and 255
                 rating = int(round(float(values[0]) * 255 / 
(config.setting['rating_steps'] - 1)))
-                tags.add(id3.POPM(email=config.setting['rating_user_email'], 
rating=rating, count=count))
+                tags.add(id3.POPM(email=rating_email, rating=rating, 
count=count))
             elif name == 'grouping':
                 if config.setting['itunes_compatible_grouping']:
                     tags.add(id3.GRP1(encoding=encoding, text=values))
@@ -581,7 +582,7 @@
                     tags.delall(real_name)
                     tags.delall('TXXX:' + self.__rtranslate_freetext[name])
                 elif real_name == 'POPM':
-                    user_email = config.setting['rating_user_email']
+                    user_email = id3text(config.setting['rating_user_email'], 
0)
                     for key, frame in list(tags.items()):
                         if frame.FrameID == 'POPM' and frame.email == 
user_email:
                             del tags[key]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/picard-release-2.6.3/picard/ui/coverartbox.py 
new/picard-release-2.6.4/picard/ui/coverartbox.py
--- old/picard-release-2.6.3/picard/ui/coverartbox.py   2021-06-06 
12:45:12.000000000 +0200
+++ new/picard-release-2.6.4/picard/ui/coverartbox.py   2021-10-06 
07:50:29.000000000 +0200
@@ -135,7 +135,7 @@
             event.acceptProposedAction()
 
     def scaled(self, *dimensions):
-        return (self.pixel_ratio * dimension for dimension in dimensions)
+        return (round(self.pixel_ratio * dimension) for dimension in 
dimensions)
 
     def show(self):
         self.set_data(self.data, True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/picard-release-2.6.3/picard/ui/itemviews.py 
new/picard-release-2.6.4/picard/ui/itemviews.py
--- old/picard-release-2.6.3/picard/ui/itemviews.py     2021-06-06 
12:45:12.000000000 +0200
+++ new/picard-release-2.6.4/picard/ui/itemviews.py     2021-10-06 
07:50:29.000000000 +0200
@@ -139,9 +139,9 @@
     c1 = (basecolor.red(), basecolor.green(), basecolor.blue())
     c2 = (223, 125, 125)
     return QtGui.QColor(
-        c2[0] + (c1[0] - c2[0]) * similarity,
-        c2[1] + (c1[1] - c2[1]) * similarity,
-        c2[2] + (c1[2] - c2[2]) * similarity)
+        int(c2[0] + (c1[0] - c2[0]) * similarity),
+        int(c2[1] + (c1[1] - c2[1]) * similarity),
+        int(c2[2] + (c1[2] - c2[2]) * similarity))
 
 
 class MainPanel(QtWidgets.QSplitter):
@@ -902,9 +902,10 @@
         return super().setText(column, text)
 
     def __lt__(self, other):
-        if not self.sortable:
+        tree_widget = self.treeWidget()
+        if not self.sortable or not tree_widget:
             return False
-        column = self.treeWidget().sortColumn()
+        column = tree_widget.sortColumn()
         return self.sortkey(column) < other.sortkey(column)
 
     def sortkey(self, column):
@@ -991,11 +992,13 @@
                 # insertChildren behaves differently if sorting is disabled / 
enabled, which results
                 # in different sort order of tracks in unsorted state. As we 
sort the tracks later
                 # anyway make sure sorting is disabled here.
-                tree_view = self.treeWidget()
-                sorting_enabled = tree_view.isSortingEnabled()
-                tree_view.setSortingEnabled(False)
+                tree_widget = self.treeWidget()
+                if tree_widget:
+                    sorting_enabled = tree_widget.isSortingEnabled()
+                    tree_widget.setSortingEnabled(False)
                 self.insertChildren(oldnum, items)
-                tree_view.setSortingEnabled(sorting_enabled)
+                if tree_widget:
+                    tree_widget.setSortingEnabled(sorting_enabled)
                 for item in items:  # Update after insertChildren so that 
setExpanded works
                     item.update(update_album=False)
         if album.errors:
@@ -1033,7 +1036,10 @@
 class NatAlbumItem(AlbumItem):
     def __lt__(self, other):
         # Always show NAT entry on top
-        order = self.treeWidget().header().sortIndicatorOrder()
+        tree_widget = self.treeWidget()
+        if not tree_widget:
+            return True
+        order = tree_widget.header().sortIndicatorOrder()
         return order == QtCore.Qt.AscendingOrder
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/picard-release-2.6.3/picard/ui/options/scripting.py 
new/picard-release-2.6.4/picard/ui/options/scripting.py
--- old/picard-release-2.6.3/picard/ui/options/scripting.py     2021-06-06 
12:45:12.000000000 +0200
+++ new/picard-release-2.6.4/picard/ui/options/scripting.py     2021-10-06 
07:50:29.000000000 +0200
@@ -146,7 +146,8 @@
         }
         # Scripting code is always left-to-right. Qt does not support the dir
         # attribute on inline tags, insert explicit left-right-marks instead.
-        html = html.replace('<code>', '<code>&#8206;')
+        if text_direction == 'rtl':
+            html = html.replace('<code>', '<code>&#8206;')
         self.ui.textBrowser.setHtml(html)
         self.ui.buttonBox.rejected.connect(self.close)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/picard-release-2.6.3/picard/util/__init__.py 
new/picard-release-2.6.4/picard/util/__init__.py
--- old/picard-release-2.6.3/picard/util/__init__.py    2021-06-06 
12:45:12.000000000 +0200
+++ new/picard-release-2.6.4/picard/util/__init__.py    2021-10-06 
07:50:29.000000000 +0200
@@ -355,7 +355,7 @@
             else:
                 decorator.args = args
                 decorator.kwargs = kwargs
-                QtCore.QTimer.singleShot(r, later)
+                QtCore.QTimer.singleShot(int(r), later)
                 decorator.is_ticking = True
             mutex.unlock()
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/picard-release-2.6.3/test/formats/test_id3.py 
new/picard-release-2.6.4/test/formats/test_id3.py
--- old/picard-release-2.6.3/test/formats/test_id3.py   2021-06-06 
12:45:12.000000000 +0200
+++ new/picard-release-2.6.4/test/formats/test_id3.py   2021-10-06 
07:50:29.000000000 +0200
@@ -516,6 +516,15 @@
             loaded_metadata = save_and_load_metadata(self.filename, metadata)
             self.assertNotIn('website', loaded_metadata)
 
+        @skipUnlessTestfile
+        def test_rating_email_non_latin1(self):
+            for rating in range(6):
+                config.setting['rating_user_email'] = 'foo???'
+                rating = '3'
+                metadata = Metadata({'~rating': rating})
+                loaded_metadata = save_and_load_metadata(self.filename, 
metadata)
+                self.assertEqual(loaded_metadata['~rating'], rating, '~rating: 
%r != %r' % (loaded_metadata['~rating'], rating))
+
 
 class MP3Test(CommonId3Tests.Id3TestCase):
     testfile = 'test.mp3'

Reply via email to