nukeop / nuclear

Streaming music player that finds free music for you
https://nuclearplayer.com
GNU Affero General Public License v3.0
12.24k stars 1.07k forks source link

Better handling of albums with multiple CDs #1671

Open Lucki opened 3 months ago

Lucki commented 3 months ago

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](https://github.com/user-attachments/assets/829153df-535b-4d0d-9364-58b9f134deac)

Possible improvements I can imagine:


Lollypop example using multiple lists ![grafik](https://github.com/user-attachments/assets/405b7ef4-281a-4aa9-8271-6c2448e2005e)
nukeop commented 3 months ago

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
            }
        ]
    }
]
Lucki commented 3 months ago

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.

kedij777 commented 2 weeks ago

May I work on this?

nukeop commented 2 weeks ago

What's your idea for this?

kedij777 commented 2 weeks ago

@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.