{"action":"created","comment":{"url":"https://api.github.com/repos/musicbrainz/picard/pulls/comments/30682187","id":30682187,"diff_hunk":"@@ -1062,3 +1065,451 @@ def _test_cover_art_types_only_front(self, filename, expect):\n             self.assertEqual(expect, found)\n         finally:\n             self._tear_down()\n+\n+class PaddingTester(unittest.TestCase):\n+\n+    @contextmanager\n+    def tempcopy(self, filename):\n+        fdesc, fname = mkstemp(suffix=os.path.splitext(filename)[1])\n+        os.close(fdesc)\n+        shutil.copy2(filename, fname)\n+        self.tmps.append(fname)\n+        (yield fname)\n+\n+    @contextmanager\n+    def tagcoverartimage(self, src, tag='a', types=[u'front'], is_front=True, support_types=True, comment='No comment'):\n+        with self.tempcopy(src) as fpic:\n+            with open(fpic, 'rb') as f:\n+                (yield TagCoverArtImage(fpic, tag, types, is_front, support_types, comment, f.read()))\n+\n+    def assertIsFile(self, path, msg=None):\n+        if msg is None:\n+            msg = \"{0} is not a file.\".format(path)\n+        self.assertTrue(os.path.isfile(path), msg)\n+\n+    def assertFilteredTagDictEqual(self, first, second, msg=None):\n+        filter_m = lambda m: {k: v for k, v in m.iteritems() if not k.startswith(\"~\")}\n+        self.assertEqual(filter_m(first), filter_m(second), msg)\n+\n+    def _assertPicNumber(self, comparator, comparator_word, metadata, expected, msg=None):\n+        found = len(metadata.images)\n+        if msg is None:\n+            msg = \"Number of picture should be {0} {1} but is {2}.\".format(comparator_word, expected, found)\n+        comparator(found, expected, msg)\n+\n+    def assertPicNumberEqual(self, metadata, expected, msg=None):\n+        self._assertPicNumber(lambda x, y, z: self.assertEqual(x, y, z), \"equal to\", metadata, expected, msg)\n+    \n+    def assertPicNumberGreater(self, metadata, expected, msg=None):\n+        self._assertPicNumber(lambda x, y, z: self.assertGreater(x, y, z), \"greater than\", metadata, expected, msg)\n+\n+    def assertPicNumberGreaterEqual(self, metadata, expected, msg=None):\n+        self._assertPicNumber(lambda x, y, z: self.assertGreaterEqual(x, y, z), \"greater than or equal to\", metadata, expected, msg)\n+\n+    def assertPicNumberLess(self, metadata, expected, msg=None):\n+        self._assertPicNumber(lambda x, y, z: self.assertLess(x, y, z), \"less than\", metadata, expected, msg)\n+\n+    def assertPicNumberLessEqual(self, metadata, expected, msg=None):\n+        self._assertPicNumber(lambda x, y, z: self.assertLessEqual(x, y, z), \"less than or equal to\", metadata, expected, msg)\n+\n+    def _assertFileSize(self, comparator, comparator_word, fname, expected, msg=None):\n+        self.assertIsFile(fname, msg)\n+        size = os.path.getsize(fname)\n+        if msg is None:\n+            msg = \"File size should be {0} {1} but is {2}.\".format(comparator_word, expected, size)\n+        comparator(size, expected, msg)\n+\n+    def assertFileSizeEqual(self, fname, expected, msg=None):\n+        self._assertFileSize(lambda x, y, z : self.assertEqual(x, y, z), \"equal to\", fname, expected, msg)\n+\n+    def assertFileSizeGreater(self, fname, expected, msg=None):\n+        self._assertFileSize(lambda x, y, z : self.assertGreater(x, y, z), \"greater than\", fname, expected, msg)\n+\n+    def assertFileSizeGreaterEqual(self, fname, expected, msg=None):\n+        self._assertFileSize(lambda x, y, z : self.assertGreaterEqual(x, y, z), \"greater than or equal to\", fname, expected, msg)\n+\n+    def assertFileSizeLess(self, fname, expected, msg=None):\n+        self._assertFileSize(lambda x, y, z : self.assertLess(x, y, z), \"less than\", fname, expected, msg)\n+\n+    def assertFileSizeLessEqual(self, fname, expected, msg=None):\n+        self._assertFileSize(lambda x, y, z : self.assertLessEqual(x, y, z), \"less than or equal to\", fname, expected, msg)\n+\n+    def decomposeFile(self, fname):\n+        size = os.path.getsize(fname)\n+        pf = picard.formats.open(fname)\n+        metadata = pf._load(fname)\n+        nb_pics = len(metadata.images)\n+        return (pf, size, metadata, nb_pics)\n+\n+    def assertEmbedPicture(self, faudio, fpicture):\n+        with self.tempcopy(faudio) as aud:\n+            with self.tagcoverartimage(src=fpicture) as pic:\n+                (paud_0, size_0, metadata_0, nb_pics_0) = self.decomposeFile(aud)\n+                metadata_1 = Metadata()\n+                metadata_1.copy(metadata_0)\n+                metadata_1.append_image(pic)\n+                paud_0._save(aud, metadata_1)\n+                (_, _, metadata_2, _) = self.decomposeFile(aud)\n+                self.assertFilteredTagDictEqual(metadata_1, metadata_2)\n+                self.assertPicNumberEqual(metadata_2, nb_pics_0 + 1)\n+                self.assertFileSizeGreater(aud, size_0)\n+\n+    def assertCreatePaddingFromRemovingPicture(self, faudio, fpicture):\n+        with self.tempcopy(faudio) as aud:\n+            with self.tagcoverartimage(src=fpicture) as pic:\n+                (paud_0, size_0, metadata_0, nb_pics_0) = self.decomposeFile(aud)\n+                metadata_1 = Metadata()\n+                metadata_1.copy(metadata_0)\n+                metadata_1.append_image(pic)\n+                paud_0._save(aud, metadata_1)\n+                (paud_2, size_2, metadata_2, nb_pics_2) = self.decomposeFile(aud)\n+                self.assertFilteredTagDictEqual(metadata_1, metadata_2)\n+                self.assertPicNumberEqual(metadata_2, nb_pics_0 + 1)\n+                self.assertFileSizeGreater(aud, size_0)\n+                config.setting.update({'clear_existing_tags': True})\n+                paud_2._save(aud, metadata_0)\n+                (_, _, metadata_3, _) = self.decomposeFile(aud)\n+                self.assertFilteredTagDictEqual(metadata_3, metadata_0)\n+                self.assertPicNumberEqual(metadata_3, nb_pics_0)\n+                self.assertPicNumberEqual(metadata_3, nb_pics_2 - 1)\n+                self.assertFileSizeEqual(aud, size_2)\n+\n+    def assertCreateThenRemovePaddingFromRemovingPicture(self, faudio, fpicture):\n+        with self.tempcopy(faudio) as aud:\n+            with self.tagcoverartimage(src=fpicture) as pic:\n+                (paud_0, size_0, metadata_0, nb_pics_0) = self.decomposeFile(aud)\n+                metadata_1 = Metadata()\n+                metadata_1.copy(metadata_0)\n+                metadata_1.append_image(pic)\n+                paud_0._save(aud, metadata_1)\n+                (paud_2, size_2, metadata_2, nb_pics_2) = self.decomposeFile(aud)\n+                self.assertFilteredTagDictEqual(metadata_1, metadata_2)\n+                self.assertPicNumberEqual(metadata_2, nb_pics_0 + 1)\n+                self.assertFileSizeGreater(aud, size_0)\n+                config.setting.update({'clear_existing_tags': True})\n+                paud_2._save(aud, metadata_0)\n+                (paud_3, size_3, metadata_3, nb_pics_3) = self.decomposeFile(aud)\n+                self.assertFilteredTagDictEqual(metadata_3, metadata_0)\n+                self.assertPicNumberEqual(metadata_3, nb_pics_0)\n+                self.assertPicNumberEqual(metadata_3, nb_pics_2 - 1)\n+                self.assertFileSizeEqual(aud, size_2)\n+                config.setting.update({'remove_extra_padding': True})\n+                paud_3._save(aud, metadata_0)\n+                (_, _, metadata_4, _) = self.decomposeFile(aud)\n+                self.assertFilteredTagDictEqual(metadata_4, metadata_0)\n+                self.assertFilteredTagDictEqual(metadata_4, metadata_3)\n+                self.assertPicNumberEqual(metadata_4, nb_pics_0)\n+                self.assertPicNumberEqual(metadata_4, nb_pics_3)\n+                self.assertPicNumberEqual(metadata_4, nb_pics_2 - 1)\n+                self.assertFileSizeLess(aud, size_3)\n+\n+    def assertRemoveExtraPaddingDoesNotThrowException(self, f):\n+        with self.tempcopy(f) as ff:\n+            config.setting.update({'clear_existing_tags': True})\n+            config.setting.update({'remove_extra_padding': True})\n+            pff = picard.formats.open(ff)\n+            metadata = pff._load(ff)","path":"test/test_formats.py","position":162,"original_position":162,"commit_id":"419c08ba0a2066406af298b3f393971757b97c14","original_commit_id":"419c08ba0a2066406af298b3f393971757b97c14","user":{"login":"zas","id":151042,"avatar_url":"https://avatars.githubusercontent.com/u/151042?v=3","gravatar_id":"","url":"https://api.github.com/users/zas","html_url":"https://github.com/zas","followers_url":"https://api.github.com/users/zas/followers","following_url":"https://api.github.com/users/zas/following{/other_user}","gists_url":"https://api.github.com/users/zas/gists{/gist_id}","starred_url":"https://api.github.com/users/zas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zas/subscriptions","organizations_url":"https://api.github.com/users/zas/orgs","repos_url":"https://api.github.com/users/zas/repos","events_url":"https://api.github.com/users/zas/events{/privacy}","received_events_url":"https://api.github.com/users/zas/received_events","type":"User","site_admin":false},"body":"AttributeError: 'NoneType' object has no attribute '_load' repeated when running tests.","created_at":"2015-05-20T08:58:21Z","updated_at":"2015-05-20T08:58:21Z","html_url":"https://github.com/musicbrainz/picard/pull/395#discussion_r30682187","pull_request_url":"https://api.github.com/repos/musicbrainz/picard/pulls/395","_links":{"self":{"href":"https://api.github.com/repos/musicbrainz/picard/pulls/comments/30682187"},"html":{"href":"https://github.com/musicbrainz/picard/pull/395#discussion_r30682187"},"pull_request":{"href":"https://api.github.com/repos/musicbrainz/picard/pulls/395"}}},"pull_request":{"url":"https://api.github.com/repos/musicbrainz/picard/pulls/395","id":27572313,"html_url":"https://github.com/musicbrainz/picard/pull/395","diff_url":"https://github.com/musicbrainz/picard/pull/395.diff","patch_url":"https://github.com/musicbrainz/picard/pull/395.patch","issue_url":"https://api.github.com/repos/musicbrainz/picard/issues/395","number":395,"state":"open","locked":false,"title":"[PICARD-695] Tags are not properly cleared for some files even with the clear metadata option.","user":{"login":"NCenerar","id":9783288,"avatar_url":"https://avatars.githubusercontent.com/u/9783288?v=3","gravatar_id":"","url":"https://api.github.com/users/NCenerar","html_url":"https://github.com/NCenerar","followers_url":"https://api.github.com/users/NCenerar/followers","following_url":"https://api.github.com/users/NCenerar/following{/other_user}","gists_url":"https://api.github.com/users/NCenerar/gists{/gist_id}","starred_url":"https://api.github.com/users/NCenerar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NCenerar/subscriptions","organizations_url":"https://api.github.com/users/NCenerar/orgs","repos_url":"https://api.github.com/users/NCenerar/repos","events_url":"https://api.github.com/users/NCenerar/events{/privacy}","received_events_url":"https://api.github.com/users/NCenerar/received_events","type":"User","site_admin":false},"body":"Hello, I notice that in some case, the metadata were not competetly cleared even with the option enabled.\r\nBy saving the file without any metadata before saving with the metadata, it seems to work. I would like to provide the mp3 to illustrate the problem but the file is too big...\r\n\r\nThank you for your work, it is great ;)","created_at":"2015-01-18T15:03:26Z","updated_at":"2015-05-20T08:58:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a9df7359c09c0b30954faa0ce4cade89cd7333c6","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/musicbrainz/picard/pulls/395/commits","review_comments_url":"https://api.github.com/repos/musicbrainz/picard/pulls/395/comments","review_comment_url":"https://api.github.com/repos/musicbrainz/picard/pulls/comments{/number}","comments_url":"https://api.github.com/repos/musicbrainz/picard/issues/395/comments","statuses_url":"https://api.github.com/repos/musicbrainz/picard/statuses/419c08ba0a2066406af298b3f393971757b97c14","head":{"label":"NCenerar:patch_clear_metadata","ref":"patch_clear_metadata","sha":"419c08ba0a2066406af298b3f393971757b97c14","user":{"login":"NCenerar","id":9783288,"avatar_url":"https://avatars.githubusercontent.com/u/9783288?v=3","gravatar_id":"","url":"https://api.github.com/users/NCenerar","html_url":"https://github.com/NCenerar","followers_url":"https://api.github.com/users/NCenerar/followers","following_url":"https://api.github.com/users/NCenerar/following{/other_user}","gists_url":"https://api.github.com/users/NCenerar/gists{/gist_id}","starred_url":"https://api.github.com/users/NCenerar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NCenerar/subscriptions","organizations_url":"https://api.github.com/users/NCenerar/orgs","repos_url":"https://api.github.com/users/NCenerar/repos","events_url":"https://api.github.com/users/NCenerar/events{/privacy}","received_events_url":"https://api.github.com/users/NCenerar/received_events","type":"User","site_admin":false},"repo":{"id":27531526,"name":"picard","full_name":"NCenerar/picard","owner":{"login":"NCenerar","id":9783288,"avatar_url":"https://avatars.githubusercontent.com/u/9783288?v=3","gravatar_id":"","url":"https://api.github.com/users/NCenerar","html_url":"https://github.com/NCenerar","followers_url":"https://api.github.com/users/NCenerar/followers","following_url":"https://api.github.com/users/NCenerar/following{/other_user}","gists_url":"https://api.github.com/users/NCenerar/gists{/gist_id}","starred_url":"https://api.github.com/users/NCenerar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NCenerar/subscriptions","organizations_url":"https://api.github.com/users/NCenerar/orgs","repos_url":"https://api.github.com/users/NCenerar/repos","events_url":"https://api.github.com/users/NCenerar/events{/privacy}","received_events_url":"https://api.github.com/users/NCenerar/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/NCenerar/picard","description":"MusicBrainz Picard","fork":true,"url":"https://api.github.com/repos/NCenerar/picard","forks_url":"https://api.github.com/repos/NCenerar/picard/forks","keys_url":"https://api.github.com/repos/NCenerar/picard/keys{/key_id}","collaborators_url":"https://api.github.com/repos/NCenerar/picard/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/NCenerar/picard/teams","hooks_url":"https://api.github.com/repos/NCenerar/picard/hooks","issue_events_url":"https://api.github.com/repos/NCenerar/picard/issues/events{/number}","events_url":"https://api.github.com/repos/NCenerar/picard/events","assignees_url":"https://api.github.com/repos/NCenerar/picard/assignees{/user}","branches_url":"https://api.github.com/repos/NCenerar/picard/branches{/branch}","tags_url":"https://api.github.com/repos/NCenerar/picard/tags","blobs_url":"https://api.github.com/repos/NCenerar/picard/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/NCenerar/picard/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/NCenerar/picard/git/refs{/sha}","trees_url":"https://api.github.com/repos/NCenerar/picard/git/trees{/sha}","statuses_url":"https://api.github.com/repos/NCenerar/picard/statuses/{sha}","languages_url":"https://api.github.com/repos/NCenerar/picard/languages","stargazers_url":"https://api.github.com/repos/NCenerar/picard/stargazers","contributors_url":"https://api.github.com/repos/NCenerar/picard/contributors","subscribers_url":"https://api.github.com/repos/NCenerar/picard/subscribers","subscription_url":"https://api.github.com/repos/NCenerar/picard/subscription","commits_url":"https://api.github.com/repos/NCenerar/picard/commits{/sha}","git_commits_url":"https://api.github.com/repos/NCenerar/picard/git/commits{/sha}","comments_url":"https://api.github.com/repos/NCenerar/picard/comments{/number}","issue_comment_url":"https://api.github.com/repos/NCenerar/picard/issues/comments{/number}","contents_url":"https://api.github.com/repos/NCenerar/picard/contents/{+path}","compare_url":"https://api.github.com/repos/NCenerar/picard/compare/{base}...{head}","merges_url":"https://api.github.com/repos/NCenerar/picard/merges","archive_url":"https://api.github.com/repos/NCenerar/picard/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/NCenerar/picard/downloads","issues_url":"https://api.github.com/repos/NCenerar/picard/issues{/number}","pulls_url":"https://api.github.com/repos/NCenerar/picard/pulls{/number}","milestones_url":"https://api.github.com/repos/NCenerar/picard/milestones{/number}","notifications_url":"https://api.github.com/repos/NCenerar/picard/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/NCenerar/picard/labels{/name}","releases_url":"https://api.github.com/repos/NCenerar/picard/releases{/id}","created_at":"2014-12-04T08:46:23Z","updated_at":"2014-12-04T08:46:25Z","pushed_at":"2015-02-08T11:08:40Z","git_url":"git://github.com/NCenerar/picard.git","ssh_url":"git@github.com:NCenerar/picard.git","clone_url":"https://github.com/NCenerar/picard.git","svn_url":"https://github.com/NCenerar/picard","homepage":"http://musicbrainz.org/doc/MusicBrainz_Picard","size":19997,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"musicbrainz:master","ref":"master","sha":"d58c2b27cd3a6f14a65400324ccaf17780e02431","user":{"login":"musicbrainz","id":412454,"avatar_url":"https://avatars.githubusercontent.com/u/412454?v=3","gravatar_id":"","url":"https://api.github.com/users/musicbrainz","html_url":"https://github.com/musicbrainz","followers_url":"https://api.github.com/users/musicbrainz/followers","following_url":"https://api.github.com/users/musicbrainz/following{/other_user}","gists_url":"https://api.github.com/users/musicbrainz/gists{/gist_id}","starred_url":"https://api.github.com/users/musicbrainz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/musicbrainz/subscriptions","organizations_url":"https://api.github.com/users/musicbrainz/orgs","repos_url":"https://api.github.com/users/musicbrainz/repos","events_url":"https://api.github.com/users/musicbrainz/events{/privacy}","received_events_url":"https://api.github.com/users/musicbrainz/received_events","type":"User","site_admin":false},"repo":{"id":2218679,"name":"picard","full_name":"musicbrainz/picard","owner":{"login":"musicbrainz","id":412454,"avatar_url":"https://avatars.githubusercontent.com/u/412454?v=3","gravatar_id":"","url":"https://api.github.com/users/musicbrainz","html_url":"https://github.com/musicbrainz","followers_url":"https://api.github.com/users/musicbrainz/followers","following_url":"https://api.github.com/users/musicbrainz/following{/other_user}","gists_url":"https://api.github.com/users/musicbrainz/gists{/gist_id}","starred_url":"https://api.github.com/users/musicbrainz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/musicbrainz/subscriptions","organizations_url":"https://api.github.com/users/musicbrainz/orgs","repos_url":"https://api.github.com/users/musicbrainz/repos","events_url":"https://api.github.com/users/musicbrainz/events{/privacy}","received_events_url":"https://api.github.com/users/musicbrainz/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/musicbrainz/picard","description":"MusicBrainz Picard","fork":false,"url":"https://api.github.com/repos/musicbrainz/picard","forks_url":"https://api.github.com/repos/musicbrainz/picard/forks","keys_url":"https://api.github.com/repos/musicbrainz/picard/keys{/key_id}","collaborators_url":"https://api.github.com/repos/musicbrainz/picard/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/musicbrainz/picard/teams","hooks_url":"https://api.github.com/repos/musicbrainz/picard/hooks","issue_events_url":"https://api.github.com/repos/musicbrainz/picard/issues/events{/number}","events_url":"https://api.github.com/repos/musicbrainz/picard/events","assignees_url":"https://api.github.com/repos/musicbrainz/picard/assignees{/user}","branches_url":"https://api.github.com/repos/musicbrainz/picard/branches{/branch}","tags_url":"https://api.github.com/repos/musicbrainz/picard/tags","blobs_url":"https://api.github.com/repos/musicbrainz/picard/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/musicbrainz/picard/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/musicbrainz/picard/git/refs{/sha}","trees_url":"https://api.github.com/repos/musicbrainz/picard/git/trees{/sha}","statuses_url":"https://api.github.com/repos/musicbrainz/picard/statuses/{sha}","languages_url":"https://api.github.com/repos/musicbrainz/picard/languages","stargazers_url":"https://api.github.com/repos/musicbrainz/picard/stargazers","contributors_url":"https://api.github.com/repos/musicbrainz/picard/contributors","subscribers_url":"https://api.github.com/repos/musicbrainz/picard/subscribers","subscription_url":"https://api.github.com/repos/musicbrainz/picard/subscription","commits_url":"https://api.github.com/repos/musicbrainz/picard/commits{/sha}","git_commits_url":"https://api.github.com/repos/musicbrainz/picard/git/commits{/sha}","comments_url":"https://api.github.com/repos/musicbrainz/picard/comments{/number}","issue_comment_url":"https://api.github.com/repos/musicbrainz/picard/issues/comments{/number}","contents_url":"https://api.github.com/repos/musicbrainz/picard/contents/{+path}","compare_url":"https://api.github.com/repos/musicbrainz/picard/compare/{base}...{head}","merges_url":"https://api.github.com/repos/musicbrainz/picard/merges","archive_url":"https://api.github.com/repos/musicbrainz/picard/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/musicbrainz/picard/downloads","issues_url":"https://api.github.com/repos/musicbrainz/picard/issues{/number}","pulls_url":"https://api.github.com/repos/musicbrainz/picard/pulls{/number}","milestones_url":"https://api.github.com/repos/musicbrainz/picard/milestones{/number}","notifications_url":"https://api.github.com/repos/musicbrainz/picard/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/musicbrainz/picard/labels{/name}","releases_url":"https://api.github.com/repos/musicbrainz/picard/releases{/id}","created_at":"2011-08-16T22:30:23Z","updated_at":"2015-05-19T18:17:19Z","pushed_at":"2015-05-20T08:21:26Z","git_url":"git://github.com/musicbrainz/picard.git","ssh_url":"git@github.com:musicbrainz/picard.git","clone_url":"https://github.com/musicbrainz/picard.git","svn_url":"https://github.com/musicbrainz/picard","homepage":"http://musicbrainz.org/doc/MusicBrainz_Picard","size":40234,"stargazers_count":499,"watchers_count":499,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":112,"mirror_url":null,"open_issues_count":18,"forks":112,"open_issues":18,"watchers":499,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/musicbrainz/picard/pulls/395"},"html":{"href":"https://github.com/musicbrainz/picard/pull/395"},"issue":{"href":"https://api.github.com/repos/musicbrainz/picard/issues/395"},"comments":{"href":"https://api.github.com/repos/musicbrainz/picard/issues/395/comments"},"review_comments":{"href":"https://api.github.com/repos/musicbrainz/picard/pulls/395/comments"},"review_comment":{"href":"https://api.github.com/repos/musicbrainz/picard/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/musicbrainz/picard/pulls/395/commits"},"statuses":{"href":"https://api.github.com/repos/musicbrainz/picard/statuses/419c08ba0a2066406af298b3f393971757b97c14"}}}}