nuclear icon indicating copy to clipboard operation
nuclear copied to clipboard

Better handling of albums with multiple CDs

Open Lucki opened this issue 1 year ago • 5 comments

When an album has multiple CDs the current display of them is a bit visually unpleasing. All tracks are displayed in a list where multiple tracks have the same number:

Screenshot

grafik

Possible improvements I can imagine:

  • Keep a single list and prepend the CD number to the track number, maybe something like this: 1#01
  • One list for each CD

Lollypop example using multiple lists

grafik

Lucki avatar Aug 15 '24 21:08 Lucki

Thanks for providing examples and describing this in detail.

Here's an example of what musicbrainz returns when we're looking up this album.

So for every release group there's an array under the key "media" (pasted below). Each element of this array is a separate disc, so it's possible to keep this information in Nuclear and display it appropriately, we just need to change the internal release schema. Other metadata providers, like Discogs and Spotify also return this information.

[
    {
        "track-offset": 0,
        "position": 1,
        "title": "Viscera Cleanup Detail: The Soundtrack",
        "track-count": 15,
        "format-id": "907a28d9-b3b2-3ef6-89a8-7b18d91d4794",
        "tracks": [
            {
                "title": "Bongo in the Congo",
                "number": "1",
                "recording": {
                    "title": "Bongo in the Congo",
                    "id": "272d4382-3245-4973-bf28-b15733a3bb1b",
                    "genres": [],
                    "video": false,
                    "length": 137000,
                    "disambiguation": "",
                    "first-release-date": "2015-07-17"
                },
                "id": "68b219c3-bbbe-485d-875e-83ff24cb9415",
                "length": 137000,
                "position": 1
            },
            {
                "position": 2,
                "length": 139000,
                "id": "03d05dff-9759-467c-a32d-376c2ce3a43d",
                "recording": {
                    "disambiguation": "",
                    "genres": [],
                    "video": false,
                    "length": 139000,
                    "first-release-date": "2015-07-17",
                    "id": "2779a924-d901-430d-b353-bf951a0c99ff",
                    "title": "Squeaky Clean"
                },
                "title": "Squeaky Clean",
                "number": "2"
            },
            {
                "length": 125000,
                "position": 3,
                "title": "Goo",
                "number": "3",
                "id": "ded0055f-dba1-4498-a5a1-f07224e790e7",
                "recording": {
                    "first-release-date": "2015-07-17",
                    "length": 125000,
                    "genres": [],
                    "video": false,
                    "disambiguation": "",
                    "title": "Goo",
                    "id": "c4fecb5e-e133-4de2-81af-0acd85eb94ca"
                }
            },
            {
                "position": 4,
                "length": 124000,
                "recording": {
                    "disambiguation": "",
                    "video": false,
                    "genres": [],
                    "length": 124000,
                    "first-release-date": "2015-07-17",
                    "id": "daf619b7-cd81-4882-bba6-b1906571ca9d",
                    "title": "Monkeyfire"
                },
                "id": "462d8c3c-431a-4fc0-bcbb-6bbf13b91ecf",
                "number": "4",
                "title": "Monkeyfire"
            },
            {
                "recording": {
                    "id": "dcdbc181-3483-4391-9a4c-6475c6a1b587",
                    "title": "Shrieker",
                    "disambiguation": "",
                    "genres": [],
                    "video": false,
                    "length": 127000,
                    "first-release-date": "2015-07-17"
                },
                "id": "34437ee6-dcca-4280-a6cc-6c9c21b99a00",
                "title": "Shrieker",
                "number": "5",
                "position": 5,
                "length": 127000
            },
            {
                "length": 137000,
                "position": 6,
                "number": "6",
                "title": "Spaced Out",
                "id": "7fbb0798-b9c6-4ab9-9207-8dc27b90eb03",
                "recording": {
                    "title": "Spaced Out",
                    "id": "0b496a40-80aa-4181-8650-4b39e6e3be4e",
                    "length": 137000,
                    "genres": [],
                    "video": false,
                    "disambiguation": "",
                    "first-release-date": "2015-07-17"
                }
            },
            {
                "recording": {
                    "title": "Polka 2180",
                    "id": "8520d0e5-d8fb-473e-98df-728d0770f02b",
                    "first-release-date": "2015-07-17",
                    "length": 141000,
                    "genres": [],
                    "video": false,
                    "disambiguation": ""
                },
                "id": "22071ee7-97a6-485c-a59e-c0fc4feb00e5",
                "number": "7",
                "title": "Polka 2180",
                "position": 7,
                "length": 141000
            },
            {
                "length": 130000,
                "position": 8,
                "title": "The Ballad of Rick Rodney; Space-Pirate",
                "number": "8",
                "recording": {
                    "title": "The Ballad of Rick Rodney; Space-Pirate",
                    "id": "00ee4fa7-f90f-4c21-bad3-b749b386e1b0",
                    "first-release-date": "2015-07-17",
                    "genres": [],
                    "video": false,
                    "length": 130000,
                    "disambiguation": ""
                },
                "id": "b557a3e8-3e8a-4f06-9b4a-e853929da359"
            },
            {
                "id": "65c248b5-6924-4cd6-9acf-443bd4cfa986",
                "recording": {
                    "disambiguation": "",
                    "genres": [],
                    "video": false,
                    "length": 137000,
                    "first-release-date": "2015-07-17",
                    "id": "82075e0b-2fb4-4f20-a401-ac12b843387a",
                    "title": "Chemical Roach"
                },
                "title": "Chemical Roach",
                "number": "9",
                "position": 9,
                "length": 137000
            },
            {
                "title": "Karoshi Ghost",
                "number": "10",
                "id": "fcd1c83d-166b-44eb-add6-658df54a3190",
                "recording": {
                    "length": 133000,
                    "genres": [],
                    "video": false,
                    "disambiguation": "",
                    "first-release-date": "2015-07-17",
                    "title": "Karoshi Ghost",
                    "id": "46031554-3cc5-4644-8f15-0051ba1d1823"
                },
                "length": 133000,
                "position": 10
            },
            {
                "title": "Cleanup Menu",
                "number": "11",
                "recording": {
                    "disambiguation": "",
                    "length": 189000,
                    "genres": [],
                    "video": false,
                    "first-release-date": "2015-07-17",
                    "id": "c0b685d5-ba94-42ba-9cc1-b5609e75592e",
                    "title": "Cleanup Menu"
                },
                "id": "fd012f50-dd50-4695-b8d8-9963183b9ff1",
                "length": 189000,
                "position": 11
            },
            {
                "length": 161000,
                "position": 12,
                "title": "Darkwash",
                "number": "12",
                "recording": {
                    "disambiguation": "",
                    "genres": [],
                    "video": false,
                    "length": 161000,
                    "first-release-date": "2015-07-17",
                    "id": "f73ed66c-e25b-42b7-aab1-f54e79866873",
                    "title": "Darkwash"
                },
                "id": "5b008897-122c-410d-9162-5fd62d4e60ab"
            },
            {
                "length": 136000,
                "position": 13,
                "number": "13",
                "title": "Booom!",
                "id": "55ab2099-e466-4aca-b780-02997305c75c",
                "recording": {
                    "title": "Booom!",
                    "id": "3ea9a270-530c-411a-a91d-7622647ca32b",
                    "first-release-date": "2015-07-17",
                    "video": false,
                    "genres": [],
                    "length": 136000,
                    "disambiguation": ""
                }
            },
            {
                "position": 14,
                "length": 140000,
                "id": "98bdf531-77d4-4c19-b482-ac2147e32ded",
                "recording": {
                    "id": "278cb277-cb9f-40a4-914d-89f5f6ac35fa",
                    "title": "PowahPlant",
                    "disambiguation": "",
                    "video": false,
                    "genres": [],
                    "length": 140000,
                    "first-release-date": "2015-07-17"
                },
                "title": "PowahPlant",
                "number": "14"
            },
            {
                "position": 15,
                "length": 139000,
                "recording": {
                    "video": false,
                    "genres": [],
                    "length": 139000,
                    "disambiguation": "",
                    "first-release-date": "2015-07-17",
                    "title": "Neutronium Sandwich",
                    "id": "4fbe45d7-025f-40ad-a7ae-4cf6750c48c7"
                },
                "id": "f6c294a3-4370-45fd-8ac6-82d28406aa87",
                "number": "15",
                "title": "Neutronium Sandwich"
            }
        ],
        "format": "Digital Media"
    },
    {
        "track-count": 5,
        "format-id": "907a28d9-b3b2-3ef6-89a8-7b18d91d4794",
        "tracks": [
            {
                "position": 1,
                "length": 79000,
                "recording": {
                    "first-release-date": "2015-07-17",
                    "disambiguation": "",
                    "length": 79000,
                    "genres": [],
                    "video": false,
                    "id": "361859c1-85a8-4933-97ec-6782979d3bda",
                    "title": "Workshop Cleanup"
                },
                "id": "8ec41900-68a1-43ed-92eb-1c99d726a45b",
                "title": "Workshop Cleanup",
                "number": "1"
            },
            {
                "length": 98000,
                "position": 2,
                "number": "2",
                "title": "March of the Elves",
                "id": "0f3e75c5-5c48-4b78-a323-fde562e7e872",
                "recording": {
                    "title": "March of the Elves",
                    "id": "79191f8e-f815-4181-bde2-a09416d2fef7",
                    "first-release-date": "2015-07-17",
                    "length": 98000,
                    "genres": [],
                    "video": false,
                    "disambiguation": ""
                }
            },
            {
                "length": 102000,
                "position": 3,
                "title": "Whiskey and a Shotgun",
                "number": "3",
                "recording": {
                    "id": "e714c6d1-bdf4-4e2e-902f-04776534394e",
                    "title": "Whiskey and a Shotgun",
                    "disambiguation": "",
                    "length": 102000,
                    "genres": [],
                    "video": false,
                    "first-release-date": "2015-07-17"
                },
                "id": "ce5902e0-6f6a-4ef8-990e-1f4373a5bd17"
            },
            {
                "position": 4,
                "length": 119000,
                "id": "b78f63ed-bb0b-436e-b8cb-2852c1b8c959",
                "recording": {
                    "title": "Red Snow",
                    "id": "6fff9c27-be19-4196-b1db-3274e0a667ba",
                    "length": 119000,
                    "genres": [],
                    "video": false,
                    "disambiguation": "",
                    "first-release-date": "2015-07-17"
                },
                "number": "4",
                "title": "Red Snow"
            },
            {
                "number": "5",
                "title": "Ghost of Christmas SLASHED!",
                "recording": {
                    "title": "Ghost of Christmas SLASHED!",
                    "id": "49667117-e30d-448d-8a6f-e0ecacc0e800",
                    "first-release-date": "2015-07-17",
                    "length": 118000,
                    "video": false,
                    "genres": [],
                    "disambiguation": ""
                },
                "id": "b52683c6-452f-43cc-a4ec-2307f824f6c8",
                "length": 118000,
                "position": 5
            }
        ],
        "format": "Digital Media",
        "track-offset": 0,
        "position": 2,
        "title": "Viscera Cleanup Detail: Santa’s Rampage"
    },
    {
        "format-id": "907a28d9-b3b2-3ef6-89a8-7b18d91d4794",
        "track-count": 6,
        "tracks": [
            {
                "number": "1",
                "title": "Grave of Maggots",
                "recording": {
                    "video": false,
                    "genres": [],
                    "length": 156000,
                    "disambiguation": "",
                    "first-release-date": "2015-07-17",
                    "title": "Grave of Maggots",
                    "id": "09e4aa6e-4471-4e0c-a060-3961006d3f60"
                },
                "id": "b101f77a-fb6b-428d-9f76-5a2636507048",
                "length": 156000,
                "position": 1
            },
            {
                "title": "Zombie Horde",
                "number": "2",
                "id": "1ba0dfcf-8d7f-41b9-aacd-c484388d5308",
                "recording": {
                    "first-release-date": "2015-07-17",
                    "disambiguation": "",
                    "video": false,
                    "genres": [],
                    "length": 147000,
                    "id": "aa53e395-f89c-40d0-a215-f696e82c380a",
                    "title": "Zombie Horde"
                },
                "length": 147000,
                "position": 2
            },
            {
                "position": 3,
                "length": 136000,
                "id": "b95a88f5-2fa7-472a-83ff-0586dc4c0b5c",
                "recording": {
                    "first-release-date": "2015-07-17",
                    "video": false,
                    "genres": [],
                    "length": 136000,
                    "disambiguation": "",
                    "title": "Bonesong",
                    "id": "7aaee690-34d5-4fe4-8388-7da550054cad"
                },
                "number": "3",
                "title": "Bonesong"
            },
            {
                "position": 4,
                "length": 127000,
                "recording": {
                    "title": "The Final Destination",
                    "id": "b8caab4f-3503-4327-ba4b-c902b47467ef",
                    "video": false,
                    "genres": [],
                    "length": 127000,
                    "disambiguation": "",
                    "first-release-date": "2015-07-17"
                },
                "id": "72b1ee81-7dd6-4bd1-9860-618f57010593",
                "title": "The Final Destination",
                "number": "4"
            },
            {
                "length": 141000,
                "position": 5,
                "title": "It Came From the Pumpkin Patch",
                "number": "5",
                "recording": {
                    "disambiguation": "",
                    "length": 141000,
                    "video": false,
                    "genres": [],
                    "first-release-date": "2015-07-17",
                    "id": "85458eb5-df7c-4804-9edf-d8aa32eab43d",
                    "title": "It Came From the Pumpkin Patch"
                },
                "id": "74254745-10ce-45b3-bd7a-35e428ec5015"
            },
            {
                "length": 161000,
                "position": 6,
                "title": "Hell’s Bell’s",
                "number": "6",
                "recording": {
                    "title": "Hell’s Bell’s",
                    "id": "e64347c2-a87b-41b8-89e8-2fde4f75bbf4",
                    "genres": [],
                    "video": false,
                    "length": 161000,
                    "disambiguation": "",
                    "first-release-date": "2015-07-17"
                },
                "id": "aa7dc4f1-6213-42ba-af7b-5d7ffc3bd0d5"
            }
        ],
        "format": "Digital Media",
        "position": 3,
        "track-offset": 0,
        "title": "Viscera Cleanup Detail Presents: House of Horror"
    },
    {
        "title": "Viscera Cleanup Detail Presents: The Vulcan Affair",
        "track-offset": 0,
        "position": 4,
        "format": "Digital Media",
        "format-id": "907a28d9-b3b2-3ef6-89a8-7b18d91d4794",
        "track-count": 8,
        "tracks": [
            {
                "length": 162000,
                "position": 1,
                "number": "1",
                "title": "The D# is for Danger",
                "id": "2a3821c3-6f93-4cfd-9a52-e5fdc7f53d32",
                "recording": {
                    "id": "dbe4485f-e3e4-4c21-b224-dd89df176f8d",
                    "title": "The D# is for Danger",
                    "disambiguation": "",
                    "length": 162000,
                    "genres": [],
                    "video": false,
                    "first-release-date": "2015-07-17"
                }
            },
            {
                "position": 2,
                "length": 153000,
                "id": "2e0cc9d2-c3e9-473a-8c5c-63227e6d2482",
                "recording": {
                    "first-release-date": "2015-07-17",
                    "length": 153000,
                    "genres": [],
                    "video": false,
                    "disambiguation": "",
                    "title": "Oil Drums",
                    "id": "7de33d72-9139-4109-9fc4-7192866ed9dd"
                },
                "title": "Oil Drums",
                "number": "2"
            },
            {
                "length": 166000,
                "position": 3,
                "title": "Water Re-Tension",
                "number": "3",
                "id": "216d600d-8d70-4a38-a263-f6c657505745",
                "recording": {
                    "title": "Water Re-Tension",
                    "id": "da735097-a2f9-488b-aa6f-f90b361299e7",
                    "first-release-date": "2015-07-17",
                    "length": 166000,
                    "video": false,
                    "genres": [],
                    "disambiguation": ""
                }
            },
            {
                "position": 4,
                "length": 148000,
                "id": "d44972eb-e896-46bc-8778-a09e2ac4a95f",
                "recording": {
                    "title": "Running Man",
                    "id": "77b6fc1f-186a-4867-8116-abf5c1fd26ac",
                    "length": 148000,
                    "video": false,
                    "genres": [],
                    "disambiguation": "",
                    "first-release-date": "2015-07-17"
                },
                "number": "4",
                "title": "Running Man"
            },
            {
                "number": "5",
                "title": "Shaken. Stirred. Blended. Consumed.",
                "recording": {
                    "id": "65157209-4016-4072-9913-169654117251",
                    "title": "Shaken. Stirred. Blended. Consumed.",
                    "disambiguation": "",
                    "genres": [],
                    "video": false,
                    "length": 138000,
                    "first-release-date": "2015-07-17"
                },
                "id": "6d6878c6-6536-4054-b71c-b3277a6834a3",
                "length": 138000,
                "position": 5
            },
            {
                "length": 149000,
                "position": 6,
                "number": "6",
                "title": "Spy in the Ointment",
                "id": "7738ad0b-825a-4bbf-9be6-70929e40e487",
                "recording": {
                    "title": "Spy in the Ointment",
                    "id": "ba11a56a-6056-49f6-85c6-7affb72d3b71",
                    "first-release-date": "2015-07-17",
                    "length": 149000,
                    "genres": [],
                    "video": false,
                    "disambiguation": ""
                }
            },
            {
                "position": 7,
                "length": 147000,
                "id": "5aafabf0-16c8-4fcd-b1d3-9e3e1b893d6c",
                "recording": {
                    "first-release-date": "2015-07-17",
                    "disambiguation": "",
                    "length": 147000,
                    "video": false,
                    "genres": [],
                    "id": "5266a1d3-e7b0-4605-a803-785d38539c99",
                    "title": "String Theory"
                },
                "title": "String Theory",
                "number": "7"
            },
            {
                "id": "87baed9d-181f-4c0f-9cce-6cbd25340133",
                "recording": {
                    "id": "7f7313a9-eed7-4e90-b0e2-ab2d03e04259",
                    "title": "Master of the Rodents",
                    "disambiguation": "",
                    "length": 160000,
                    "genres": [],
                    "video": false,
                    "first-release-date": "2015-07-17"
                },
                "title": "Master of the Rodents",
                "number": "8",
                "position": 8,
                "length": 160000
            }
        ]
    }
]

nukeop avatar Aug 15 '24 23:08 nukeop

Looking at the structure, it looks like an "album" is just "a collection of playlists". Maybe there's some possibility to recycle existing $things. Although this a rather naive view without code-insight or particular deep music knowledge.

Lucki avatar Aug 16 '24 12:08 Lucki

May I work on this?

kedij777 avatar Nov 12 '24 23:11 kedij777

What's your idea for this?

nukeop avatar Nov 12 '24 23:11 nukeop

@rishiral and I see two methods:

  1. Display tracks under a "Disc #" heading like the example Lucki provided - "Lollypop example using multiple lists". We prefer this method as it's aesthetically appealing.
  2. Just increment the track number and treat all tracks as if they are part of one disc (this seems to be the way that iTuenesMusic and playlist are handling in the source code). An example screenshot of this can be found below image

The disc number is provided directly in the Spotify API response. For MusicBrainz and other APIs, however, we may need to implement a workaround, as they don’t provide it directly.

kedij777 avatar Nov 13 '24 00:11 kedij777