Harmony: Music Metadata Aggregator and MusicBrainz Importer

After more than 500 commits already and over 500 imports being made during the early testing phase, the time has finally come to post this announcement…

I am proud to present you my latest project Harmony, a MusicBrainz importer which aggregates metadata from multiple sources to seed releases.

As you can see from the screenshot it supports release lookups by URL and/or GTIN (barcode). The following sources are supported and have metadata providers already implemented:

  • Deezer
  • iTunes
  • Bandcamp (thanks to @Bitmap for adding support for /track pages)
  • Beatport (thanks to @atj)

For providers with region-specific pages (currently only iTunes) it is recommended to also fill in a country code (unless the provider URL already contains one) which will be used for the lookup, external links and MBID mapping.

The amazing logo was designed by @aerozol (thank you again!) who had discussed many ideas with me and created new drafts over a few days before we finally settled on this simple but recognizable hexagon puzzle.
He also answered my user interface design and usability questions. Everything which still doesn’t look good is entirely my fault and you are welcome to help improve the UI and UX.

Disclaimer: While there are still a few things missing for me personally to start importing lots of releases with it, I feel that I won’t get to a point where I am 100% happy with it in the near future.
So why not release it now with the usual encouragement to double check data before submission and hope that people will help me improve it :smile:

For those who want to give it a try, here is the link to the main instance:

Kudos to @atj who has generously offered to host it, setup the server and automated deployments and gave me lots of feedback right from the start (back in 2023).

Since I had promised that this project will be open source, finally the link for those who want to review the code, contribute or report issues directly:

Feedback and questions are welcome in this thread, some of the answers may already be found in the README and the issues on GitHub.

Issue reports are welcome as well, but I would prefer if you could directly submit them on GitHub whenever possible.
I also want to thank all early testers, especially @chaban who provided a list of 30 observations and suggestions so far, some of them still have to be implemented :sweat_smile:

If you are referring to a specific page, please include the permalink which is displayed on release lookup pages (or just the regular link for all other cases).

Features

  • Lookup of release metadata from multiple sources by URL and/or GTIN
  • Metadata providers convert source data into a common, harmonized representation
  • Additional sources can be supported by adding more provider implementations
  • Merging of harmonized metadata from your preferred providers
  • Seeding of MusicBrainz releases using the merged metadata
  • Resolving of external entity identifiers to MBIDs
  • Automatic guessing of title language (use with care!) and script
  • Permalinks which load snapshots of the originally queried source data

In comparison to a-tisket, it additionally has the following advantages:

  • Better handling of iTunes API responses which contain video tracks and/or alternative releases
  • Detection whether iTunes API results are streamable and/or purchasable
  • A list of regions which will be ignored when determining worldwide availability (e.g. dependent islands)
  • For each release property a list of preferred providers can be specified (not yet exposed to the UI, but higher artwork quality and duration precision are automatically preferred)

You want to know why provider X (Spotify) or feature Y (automatic detection of existing releases and release groups) is missing?
The answer is that I didn’t get to it yet (or it is currently out of scope) and this is your chance to implement it (if it is already on my list) or to request it :wink:

52 Likes

All I have to say to this is: Aaaalways, I wanna be with you / And import stuff with you / And live with Harmony, Harmony, oh love :notes:

Oh, and good job, I guess! :smiley:

11 Likes

Love it! Thanks for developing this!

2 Likes

I’m a Spotify main so I don’t really have an use rn.

I’ll see to learn about the project and help implement it. If I got time.

5 Likes

Amazing work! :tada: :tada: :tada:

It might not have every platform under the sun (yet), but so great to have a codebase that others can help improve. Really looking forward to using it and watching it grow! It’s already in my toolkit (in tandem with atisket, so I can add Spotify links as well).

10 Likes

Looks interesting. Tried it and it works well. Seeding album arts is still a pain but I don’t see this changing anytime soon unless the seeder api on musicbrainz changes.
I don’t understand how Bandcamp is supposed to work… Maybe I am missing something.

It works with URLs only

3 Likes

I know that there are still improvements planned ahead, so it might take some time before I finally adopt it as my default importer, but I greatly appreciate your work so far. I especially love how much faster it is even with an iTunes/Apple lookup (which was greatly slowing down a-tisket in comparison) already implemented.

Mostly looking forward to the addition of support for Spotify. Also, seeing this part at the opening post:

I wonder if addition of video tracks on iTunes/Apple releases is also being considered. I can see that currently they are (similarly to a-tisket, but unlike the much simpler MusicBrainz: Import from iTunes usersciprt) filtered out from import, at least it seems like this is intentional looking at the code (lines 143-146).

3 Likes

It is intended to make Apple releases compatible with other sources sharing the same GTIN, otherwise Harmony would reject combining them because of a track count difference.
I don’t know if they are really part of the release as such or whether Apple just includes them next to the audio tracks simply because it also has them, so I would welcome a ticket with examples of various flavours: Releases which are Apple exclusive, releases which are offered by other sources with/without the videos under the same GTIN, video tracks which are music video versions of album tracks, videos which feature completely different songs etc, whatever of these exists.
That would make it simpler to come to a well reasoned conclusion how these videos should be handled. For now I think the benefit of combining the release without videos with other sources justifies the current behaviour.

3 Likes

From my experience, I don’t think this was ever the case. At least the handful of digital releases with video tracks that I worked with were all Apple exclusive, each one with a unique GTIN that couldn’t be found on other providers. Here’s a few examples:

3 Likes

This release has Japanese and transliterated titles depending on your language settings:

The API returns transliterated titles for me:

/album/277679572
{
  "id": 277679572,
  "title": "Jazz Mesen 2",
  "upc": "4538182785072",
  "link": "https://www.deezer.com/album/277679572",
  "share": "https://www.deezer.com/album/277679572?utm_source=deezer&utm_content=album-277679572&utm_term=0_1717685938&utm_medium=web",
  "cover": "https://api.deezer.com/album/277679572/image",
  "cover_small": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/56x56-000000-80-0-0.jpg",
  "cover_medium": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/250x250-000000-80-0-0.jpg",
  "cover_big": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/500x500-000000-80-0-0.jpg",
  "cover_xl": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/1000x1000-000000-80-0-0.jpg",
  "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
  "genre_id": 129,
  "genres": {
    "data": [
      {
        "id": 129,
        "name": "Jazz",
        "picture": "https://api.deezer.com/genre/129/image",
        "type": "genre"
      }
    ]
  },
  "label": "JUNONSAISAIRECORDS",
  "nb_tracks": 9,
  "duration": 2309,
  "fans": 8,
  "release_date": "2018-12-19",
  "record_type": "album",
  "available": true,
  "tracklist": "https://api.deezer.com/album/277679572/tracks",
  "explicit_lyrics": false,
  "explicit_content_lyrics": 0,
  "explicit_content_cover": 2,
  "contributors": [
    {
      "id": 1233747,
      "name": "Jabberloop",
      "link": "https://www.deezer.com/artist/1233747",
      "share": "https://www.deezer.com/artist/1233747?utm_source=deezer&utm_content=artist-1233747&utm_term=0_1717685938&utm_medium=web",
      "picture": "https://api.deezer.com/artist/1233747/image",
      "picture_small": "https://e-cdns-images.dzcdn.net/images/artist/a79b6a6697b3c3873f70b7368419bc7f/56x56-000000-80-0-0.jpg",
      "picture_medium": "https://e-cdns-images.dzcdn.net/images/artist/a79b6a6697b3c3873f70b7368419bc7f/250x250-000000-80-0-0.jpg",
      "picture_big": "https://e-cdns-images.dzcdn.net/images/artist/a79b6a6697b3c3873f70b7368419bc7f/500x500-000000-80-0-0.jpg",
      "picture_xl": "https://e-cdns-images.dzcdn.net/images/artist/a79b6a6697b3c3873f70b7368419bc7f/1000x1000-000000-80-0-0.jpg",
      "radio": true,
      "tracklist": "https://api.deezer.com/artist/1233747/top?limit=50",
      "type": "artist",
      "role": "Main"
    }
  ],
  "artist": {
    "id": 1233747,
    "name": "Jabberloop",
    "picture": "https://api.deezer.com/artist/1233747/image",
    "picture_small": "https://e-cdns-images.dzcdn.net/images/artist/a79b6a6697b3c3873f70b7368419bc7f/56x56-000000-80-0-0.jpg",
    "picture_medium": "https://e-cdns-images.dzcdn.net/images/artist/a79b6a6697b3c3873f70b7368419bc7f/250x250-000000-80-0-0.jpg",
    "picture_big": "https://e-cdns-images.dzcdn.net/images/artist/a79b6a6697b3c3873f70b7368419bc7f/500x500-000000-80-0-0.jpg",
    "picture_xl": "https://e-cdns-images.dzcdn.net/images/artist/a79b6a6697b3c3873f70b7368419bc7f/1000x1000-000000-80-0-0.jpg",
    "tracklist": "https://api.deezer.com/artist/1233747/top?limit=50",
    "type": "artist"
  },
  "type": "album",
  "tracks": {
    "data": [
      {
        "id": 1576911072,
        "readable": true,
        "title": "Will",
        "title_short": "Will",
        "title_version": "",
        "link": "https://www.deezer.com/track/1576911072",
        "duration": 283,
        "rank": 194800,
        "explicit_lyrics": false,
        "explicit_content_lyrics": 0,
        "explicit_content_cover": 2,
        "preview": "https://cdns-preview-6.dzcdn.net/stream/c-693be13a3ae7e2fb8189909f71881597-8.mp3",
        "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
        "artist": {
          "id": 1233747,
          "name": "Jabberloop",
          "tracklist": "https://api.deezer.com/artist/1233747/top?limit=50",
          "type": "artist"
        },
        "album": {
          "id": 277679572,
          "title": "Jazz Mesen 2",
          "cover": "https://api.deezer.com/album/277679572/image",
          "cover_small": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/56x56-000000-80-0-0.jpg",
          "cover_medium": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/250x250-000000-80-0-0.jpg",
          "cover_big": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/500x500-000000-80-0-0.jpg",
          "cover_xl": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/1000x1000-000000-80-0-0.jpg",
          "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
          "tracklist": "https://api.deezer.com/album/277679572/tracks",
          "type": "album"
        },
        "type": "track"
      },
      {
        "id": 1576911082,
        "readable": true,
        "title": "Honjitsu Mo Seitennari(Jazz Ver.)",
        "title_short": "Honjitsu Mo Seitennari(Jazz Ver.)",
        "title_version": "",
        "link": "https://www.deezer.com/track/1576911082",
        "duration": 271,
        "rank": 32061,
        "explicit_lyrics": false,
        "explicit_content_lyrics": 0,
        "explicit_content_cover": 2,
        "preview": "https://cdns-preview-5.dzcdn.net/stream/c-5a779be44dd470e7bb3f442d652cf11b-4.mp3",
        "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
        "artist": {
          "id": 1233747,
          "name": "Jabberloop",
          "tracklist": "https://api.deezer.com/artist/1233747/top?limit=50",
          "type": "artist"
        },
        "album": {
          "id": 277679572,
          "title": "Jazz Mesen 2",
          "cover": "https://api.deezer.com/album/277679572/image",
          "cover_small": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/56x56-000000-80-0-0.jpg",
          "cover_medium": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/250x250-000000-80-0-0.jpg",
          "cover_big": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/500x500-000000-80-0-0.jpg",
          "cover_xl": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/1000x1000-000000-80-0-0.jpg",
          "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
          "tracklist": "https://api.deezer.com/album/277679572/tracks",
          "type": "album"
        },
        "type": "track"
      },
      {
        "id": 1576911092,
        "readable": true,
        "title": "Atmosphere Entry(Jazz Ver.)",
        "title_short": "Atmosphere Entry(Jazz Ver.)",
        "title_version": "",
        "link": "https://www.deezer.com/track/1576911092",
        "duration": 363,
        "rank": 18744,
        "explicit_lyrics": false,
        "explicit_content_lyrics": 0,
        "explicit_content_cover": 2,
        "preview": "https://cdns-preview-e.dzcdn.net/stream/c-efd9be85b4ae82725d9b0bf1c1e0aa96-4.mp3",
        "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
        "artist": {
          "id": 1233747,
          "name": "Jabberloop",
          "tracklist": "https://api.deezer.com/artist/1233747/top?limit=50",
          "type": "artist"
        },
        "album": {
          "id": 277679572,
          "title": "Jazz Mesen 2",
          "cover": "https://api.deezer.com/album/277679572/image",
          "cover_small": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/56x56-000000-80-0-0.jpg",
          "cover_medium": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/250x250-000000-80-0-0.jpg",
          "cover_big": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/500x500-000000-80-0-0.jpg",
          "cover_xl": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/1000x1000-000000-80-0-0.jpg",
          "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
          "tracklist": "https://api.deezer.com/album/277679572/tracks",
          "type": "album"
        },
        "type": "track"
      },
      {
        "id": 1576911102,
        "readable": true,
        "title": "Takarajima",
        "title_short": "Takarajima",
        "title_version": "",
        "link": "https://www.deezer.com/track/1576911102",
        "duration": 256,
        "rank": 991,
        "explicit_lyrics": false,
        "explicit_content_lyrics": 0,
        "explicit_content_cover": 2,
        "preview": "https://cdns-preview-2.dzcdn.net/stream/c-2ca49c5d5ba5cb6887e6501a754b9b32-4.mp3",
        "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
        "artist": {
          "id": 1233747,
          "name": "Jabberloop",
          "tracklist": "https://api.deezer.com/artist/1233747/top?limit=50",
          "type": "artist"
        },
        "album": {
          "id": 277679572,
          "title": "Jazz Mesen 2",
          "cover": "https://api.deezer.com/album/277679572/image",
          "cover_small": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/56x56-000000-80-0-0.jpg",
          "cover_medium": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/250x250-000000-80-0-0.jpg",
          "cover_big": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/500x500-000000-80-0-0.jpg",
          "cover_xl": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/1000x1000-000000-80-0-0.jpg",
          "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
          "tracklist": "https://api.deezer.com/album/277679572/tracks",
          "type": "album"
        },
        "type": "track"
      },
      {
        "id": 1576911112,
        "readable": true,
        "title": "Goshu-Ondo",
        "title_short": "Goshu-Ondo",
        "title_version": "",
        "link": "https://www.deezer.com/track/1576911112",
        "duration": 102,
        "rank": 21295,
        "explicit_lyrics": false,
        "explicit_content_lyrics": 0,
        "explicit_content_cover": 2,
        "preview": "https://cdns-preview-d.dzcdn.net/stream/c-d2c0371829b40f17303d450bda3b052d-4.mp3",
        "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
        "artist": {
          "id": 1233747,
          "name": "Jabberloop",
          "tracklist": "https://api.deezer.com/artist/1233747/top?limit=50",
          "type": "artist"
        },
        "album": {
          "id": 277679572,
          "title": "Jazz Mesen 2",
          "cover": "https://api.deezer.com/album/277679572/image",
          "cover_small": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/56x56-000000-80-0-0.jpg",
          "cover_medium": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/250x250-000000-80-0-0.jpg",
          "cover_big": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/500x500-000000-80-0-0.jpg",
          "cover_xl": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/1000x1000-000000-80-0-0.jpg",
          "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
          "tracklist": "https://api.deezer.com/album/277679572/tracks",
          "type": "album"
        },
        "type": "track"
      },
      {
        "id": 1576911122,
        "readable": true,
        "title": "Source of Spring(Jazz Ver.)",
        "title_short": "Source of Spring(Jazz Ver.)",
        "title_version": "",
        "link": "https://www.deezer.com/track/1576911122",
        "duration": 234,
        "rank": 16428,
        "explicit_lyrics": false,
        "explicit_content_lyrics": 0,
        "explicit_content_cover": 2,
        "preview": "https://cdns-preview-8.dzcdn.net/stream/c-81a2aa03c7bdf3d8cd2398b836687e2c-4.mp3",
        "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
        "artist": {
          "id": 1233747,
          "name": "Jabberloop",
          "tracklist": "https://api.deezer.com/artist/1233747/top?limit=50",
          "type": "artist"
        },
        "album": {
          "id": 277679572,
          "title": "Jazz Mesen 2",
          "cover": "https://api.deezer.com/album/277679572/image",
          "cover_small": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/56x56-000000-80-0-0.jpg",
          "cover_medium": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/250x250-000000-80-0-0.jpg",
          "cover_big": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/500x500-000000-80-0-0.jpg",
          "cover_xl": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/1000x1000-000000-80-0-0.jpg",
          "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
          "tracklist": "https://api.deezer.com/album/277679572/tracks",
          "type": "album"
        },
        "type": "track"
      },
      {
        "id": 1576911132,
        "readable": true,
        "title": "Sore Sore(Jazz Ver.)",
        "title_short": "Sore Sore(Jazz Ver.)",
        "title_version": "",
        "link": "https://www.deezer.com/track/1576911132",
        "duration": 289,
        "rank": 24946,
        "explicit_lyrics": false,
        "explicit_content_lyrics": 0,
        "explicit_content_cover": 2,
        "preview": "https://cdns-preview-f.dzcdn.net/stream/c-f49997814da470d2c864b7d954d7d3ac-4.mp3",
        "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
        "artist": {
          "id": 1233747,
          "name": "Jabberloop",
          "tracklist": "https://api.deezer.com/artist/1233747/top?limit=50",
          "type": "artist"
        },
        "album": {
          "id": 277679572,
          "title": "Jazz Mesen 2",
          "cover": "https://api.deezer.com/album/277679572/image",
          "cover_small": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/56x56-000000-80-0-0.jpg",
          "cover_medium": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/250x250-000000-80-0-0.jpg",
          "cover_big": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/500x500-000000-80-0-0.jpg",
          "cover_xl": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/1000x1000-000000-80-0-0.jpg",
          "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
          "tracklist": "https://api.deezer.com/album/277679572/tracks",
          "type": "album"
        },
        "type": "track"
      },
      {
        "id": 1576911142,
        "readable": true,
        "title": "Behind the Wind(Jazz Ver.)",
        "title_short": "Behind the Wind(Jazz Ver.)",
        "title_version": "",
        "link": "https://www.deezer.com/track/1576911142",
        "duration": 311,
        "rank": 20945,
        "explicit_lyrics": false,
        "explicit_content_lyrics": 0,
        "explicit_content_cover": 2,
        "preview": "https://cdns-preview-2.dzcdn.net/stream/c-2bce608fc344ced6d6623b3a06b9cae1-4.mp3",
        "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
        "artist": {
          "id": 1233747,
          "name": "Jabberloop",
          "tracklist": "https://api.deezer.com/artist/1233747/top?limit=50",
          "type": "artist"
        },
        "album": {
          "id": 277679572,
          "title": "Jazz Mesen 2",
          "cover": "https://api.deezer.com/album/277679572/image",
          "cover_small": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/56x56-000000-80-0-0.jpg",
          "cover_medium": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/250x250-000000-80-0-0.jpg",
          "cover_big": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/500x500-000000-80-0-0.jpg",
          "cover_xl": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/1000x1000-000000-80-0-0.jpg",
          "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
          "tracklist": "https://api.deezer.com/album/277679572/tracks",
          "type": "album"
        },
        "type": "track"
      },
      {
        "id": 1576911152,
        "readable": true,
        "title": "Biwako Shukoh No Uta",
        "title_short": "Biwako Shukoh No Uta",
        "title_version": "",
        "link": "https://www.deezer.com/track/1576911152",
        "duration": 200,
        "rank": 21514,
        "explicit_lyrics": false,
        "explicit_content_lyrics": 0,
        "explicit_content_cover": 2,
        "preview": "https://cdns-preview-9.dzcdn.net/stream/c-9a43ae1961ba5878b085f087760e6b34-4.mp3",
        "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
        "artist": {
          "id": 1233747,
          "name": "Jabberloop",
          "tracklist": "https://api.deezer.com/artist/1233747/top?limit=50",
          "type": "artist"
        },
        "album": {
          "id": 277679572,
          "title": "Jazz Mesen 2",
          "cover": "https://api.deezer.com/album/277679572/image",
          "cover_small": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/56x56-000000-80-0-0.jpg",
          "cover_medium": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/250x250-000000-80-0-0.jpg",
          "cover_big": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/500x500-000000-80-0-0.jpg",
          "cover_xl": "https://e-cdns-images.dzcdn.net/images/cover/e81676c93fda9d53b5e569d1bec7372d/1000x1000-000000-80-0-0.jpg",
          "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
          "tracklist": "https://api.deezer.com/album/277679572/tracks",
          "type": "album"
        },
        "type": "track"
      }
    ]
  }
}
/album/277679572/tracks
{
  "data": [
    {
      "id": 1576911072,
      "readable": true,
      "title": "Will",
      "title_short": "Will",
      "title_version": "",
      "isrc": "JPZ921812676",
      "link": "https://www.deezer.com/track/1576911072",
      "duration": 283,
      "track_position": 1,
      "disk_number": 1,
      "rank": 194800,
      "explicit_lyrics": false,
      "explicit_content_lyrics": 0,
      "explicit_content_cover": 2,
      "preview": "https://cdns-preview-6.dzcdn.net/stream/c-693be13a3ae7e2fb8189909f71881597-8.mp3",
      "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
      "artist": {
        "id": 1233747,
        "name": "Jabberloop",
        "tracklist": "https://api.deezer.com/artist/1233747/top?limit=50",
        "type": "artist"
      },
      "type": "track"
    },
    {
      "id": 1576911082,
      "readable": true,
      "title": "Honjitsu Mo Seitennari(Jazz Ver.)",
      "title_short": "Honjitsu Mo Seitennari(Jazz Ver.)",
      "title_version": "",
      "isrc": "JPZ921812677",
      "link": "https://www.deezer.com/track/1576911082",
      "duration": 271,
      "track_position": 2,
      "disk_number": 1,
      "rank": 32061,
      "explicit_lyrics": false,
      "explicit_content_lyrics": 0,
      "explicit_content_cover": 2,
      "preview": "https://cdns-preview-5.dzcdn.net/stream/c-5a779be44dd470e7bb3f442d652cf11b-4.mp3",
      "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
      "artist": {
        "id": 1233747,
        "name": "Jabberloop",
        "tracklist": "https://api.deezer.com/artist/1233747/top?limit=50",
        "type": "artist"
      },
      "type": "track"
    },
    {
      "id": 1576911092,
      "readable": true,
      "title": "Atmosphere Entry(Jazz Ver.)",
      "title_short": "Atmosphere Entry(Jazz Ver.)",
      "title_version": "",
      "isrc": "JPZ921812678",
      "link": "https://www.deezer.com/track/1576911092",
      "duration": 363,
      "track_position": 3,
      "disk_number": 1,
      "rank": 18744,
      "explicit_lyrics": false,
      "explicit_content_lyrics": 0,
      "explicit_content_cover": 2,
      "preview": "https://cdns-preview-e.dzcdn.net/stream/c-efd9be85b4ae82725d9b0bf1c1e0aa96-4.mp3",
      "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
      "artist": {
        "id": 1233747,
        "name": "Jabberloop",
        "tracklist": "https://api.deezer.com/artist/1233747/top?limit=50",
        "type": "artist"
      },
      "type": "track"
    },
    {
      "id": 1576911102,
      "readable": true,
      "title": "Takarajima",
      "title_short": "Takarajima",
      "title_version": "",
      "isrc": "JPZ921812679",
      "link": "https://www.deezer.com/track/1576911102",
      "duration": 256,
      "track_position": 4,
      "disk_number": 1,
      "rank": 991,
      "explicit_lyrics": false,
      "explicit_content_lyrics": 0,
      "explicit_content_cover": 2,
      "preview": "https://cdns-preview-2.dzcdn.net/stream/c-2ca49c5d5ba5cb6887e6501a754b9b32-4.mp3",
      "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
      "artist": {
        "id": 1233747,
        "name": "Jabberloop",
        "tracklist": "https://api.deezer.com/artist/1233747/top?limit=50",
        "type": "artist"
      },
      "type": "track"
    },
    {
      "id": 1576911112,
      "readable": true,
      "title": "Goshu-Ondo",
      "title_short": "Goshu-Ondo",
      "title_version": "",
      "isrc": "JPZ921812684",
      "link": "https://www.deezer.com/track/1576911112",
      "duration": 102,
      "track_position": 5,
      "disk_number": 1,
      "rank": 21295,
      "explicit_lyrics": false,
      "explicit_content_lyrics": 0,
      "explicit_content_cover": 2,
      "preview": "https://cdns-preview-d.dzcdn.net/stream/c-d2c0371829b40f17303d450bda3b052d-4.mp3",
      "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
      "artist": {
        "id": 1233747,
        "name": "Jabberloop",
        "tracklist": "https://api.deezer.com/artist/1233747/top?limit=50",
        "type": "artist"
      },
      "type": "track"
    },
    {
      "id": 1576911122,
      "readable": true,
      "title": "Source of Spring(Jazz Ver.)",
      "title_short": "Source of Spring(Jazz Ver.)",
      "title_version": "",
      "isrc": "JPZ921812680",
      "link": "https://www.deezer.com/track/1576911122",
      "duration": 234,
      "track_position": 6,
      "disk_number": 1,
      "rank": 16428,
      "explicit_lyrics": false,
      "explicit_content_lyrics": 0,
      "explicit_content_cover": 2,
      "preview": "https://cdns-preview-8.dzcdn.net/stream/c-81a2aa03c7bdf3d8cd2398b836687e2c-4.mp3",
      "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
      "artist": {
        "id": 1233747,
        "name": "Jabberloop",
        "tracklist": "https://api.deezer.com/artist/1233747/top?limit=50",
        "type": "artist"
      },
      "type": "track"
    },
    {
      "id": 1576911132,
      "readable": true,
      "title": "Sore Sore(Jazz Ver.)",
      "title_short": "Sore Sore(Jazz Ver.)",
      "title_version": "",
      "isrc": "JPZ921812681",
      "link": "https://www.deezer.com/track/1576911132",
      "duration": 289,
      "track_position": 7,
      "disk_number": 1,
      "rank": 24946,
      "explicit_lyrics": false,
      "explicit_content_lyrics": 0,
      "explicit_content_cover": 2,
      "preview": "https://cdns-preview-f.dzcdn.net/stream/c-f49997814da470d2c864b7d954d7d3ac-4.mp3",
      "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
      "artist": {
        "id": 1233747,
        "name": "Jabberloop",
        "tracklist": "https://api.deezer.com/artist/1233747/top?limit=50",
        "type": "artist"
      },
      "type": "track"
    },
    {
      "id": 1576911142,
      "readable": true,
      "title": "Behind the Wind(Jazz Ver.)",
      "title_short": "Behind the Wind(Jazz Ver.)",
      "title_version": "",
      "isrc": "JPZ921812682",
      "link": "https://www.deezer.com/track/1576911142",
      "duration": 311,
      "track_position": 8,
      "disk_number": 1,
      "rank": 20945,
      "explicit_lyrics": false,
      "explicit_content_lyrics": 0,
      "explicit_content_cover": 2,
      "preview": "https://cdns-preview-2.dzcdn.net/stream/c-2bce608fc344ced6d6623b3a06b9cae1-4.mp3",
      "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
      "artist": {
        "id": 1233747,
        "name": "Jabberloop",
        "tracklist": "https://api.deezer.com/artist/1233747/top?limit=50",
        "type": "artist"
      },
      "type": "track"
    },
    {
      "id": 1576911152,
      "readable": true,
      "title": "Biwako Shukoh No Uta",
      "title_short": "Biwako Shukoh No Uta",
      "title_version": "",
      "isrc": "JPZ921812683",
      "link": "https://www.deezer.com/track/1576911152",
      "duration": 200,
      "track_position": 9,
      "disk_number": 1,
      "rank": 21514,
      "explicit_lyrics": false,
      "explicit_content_lyrics": 0,
      "explicit_content_cover": 2,
      "preview": "https://cdns-preview-9.dzcdn.net/stream/c-9a43ae1961ba5878b085f087760e6b34-4.mp3",
      "md5_image": "e81676c93fda9d53b5e569d1bec7372d",
      "artist": {
        "id": 1233747,
        "name": "Jabberloop",
        "tracklist": "https://api.deezer.com/artist/1233747/top?limit=50",
        "type": "artist"
      },
      "type": "track"
    }
  ],
  "total": 9
}```

Yet Harmony has the Japanese ones. I’m not sure what’s going on:

Edit:
The API seems to be affected by the dz_lang cookie as well…

Would it be possible for Harmony to detect copyleft licenses on Bandcamp releases and add them as external links the way the old importer script does?

5 Likes

That’s also one of the features I miss. I added Support setting CC license for Bandcamp provider · Issue #19 · kellnerd/harmony · GitHub for this. I’ll look into this.

5 Likes

A new version has been deployed today. The most interesting change is probably the new Tidal provider which has been implemented by @outsidecontext :tada:

Additionally tracks can now be marked as video tracks, which will be indicated by a video camera icon. Since it is impossible to seed this attribute with the release, remember that you have to mark the recordings as videos yourself. Currently iTunes and Tidal are the only providers which support video tracks.

Apart from that, there were also a few other minor improvements, see the full commit changelog for details if you are interested.

Then I have probably misremembered something, thank you for the examples. The latest version now includes video tracks which are returned by the iTunes API. Let’s see how good this works :smile:

P.S. I won’t do announcements every time, but at least for major changes when I find the time.

13 Likes

Now that Tidal’s been added, can you amend how Harmony handles copyright notices to include © sourced from Tidal in addition to the ℗ sourced from iTunes?

Wonderful work, it looks lovely! Love the open source nature (hope to contribute sometime), and awesome to see a Spotify importer on its way :slight_smile:

2 Likes

kellnerd added Normalize and merge copyright lines · Issue #23 · kellnerd/harmony · GitHub to track this and in general normalize the copyright entries. The Spotify provider (currently in code review) already does this and adds the symbol © or ℗ (depending on the type) if it is missing.

But for Tidal it is more complicated. There is a single copyright text field, and depending on what the artist / label entered it can contain (P) or (C) entries, and it can be with or without a symbol (ASCII or proper character).

So I’m not sure whether Harmony can or should add © or ℗ (or maybe “© + ℗”) to the string if the symbol is missing. What can definitely be done is converting the text variants (P) and (C) into symbols.

UPDATE: To make things more interesting the Tidal API documentation gives the following as an example value for the copyright string: “(p)(c) 2017 S. CARTER ENTERPRISES, LLC. MARKETED BY ROC NATION & DISTRIBUTED BY ROC NATION/UMG RECORDINGS INC.”. So they definitely consider this the place to put both (P) and/or (C).

4 Likes

Fantastic, thanks for adding Tidal. That’s my 2nd source of digital music after Bandcamp.

2 Likes

Is it supposed to seed the countries of the release events ?

In the following example

I got no entries in the MB release and I had to enter manually “[Worldwide]”

based on discussion elsewhere, I believe this is the desired solution, since that many release events gums up the servers and there’s been no agreement on whether [worldwide] is literally or figuratively Worldwide. (a-tisket has been doing it similarly for some time too, but does have an option to set [worldwide])

edit: for the record, I think I agree with you that [worldwide] doesn’t mean literally every country, otherwise we wouldn’t have any [worldwide] releases. if you wanna read the whole thread, here it is, knock yourself out~

3 Likes