├── bootstrap.css ├── bootstrap.css.map ├── favicon.svg ├── fonts.css ├── fonts ├── Inconsolata-VF.woff2 └── Inter-roman.var.woff2 ├── index.html ├── privacy.html └── seeding.html /favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 | 14 | 16 | 21 | 26 | 31 | 36 | 39 | 46 | 53 | 60 | 67 | 74 | 75 | 80 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /fonts.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: Inter; 3 | src: url("fonts/Inter-roman.var.woff2?v=3.19") format("woff2"); 4 | font-style: normal; 5 | font-weight: 100 900; 6 | font-display: fallback; 7 | } 8 | 9 | @font-face { 10 | font-family: Inconsolata; 11 | src: url("fonts/Inconsolata-VF.woff2?v=3.000") format("woff2"); 12 | font-style: normal; 13 | font-weight: 275 900; 14 | font-stretch: 50% 200%; 15 | font-display: fallback; 16 | } 17 | 18 | :root { 19 | font-size: 14px; 20 | --bs-font-sans-serif: Inter, system-ui, -apple-system, "Segoe UI", "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif; 21 | --bs-font-monospace: Inconsolata, ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Source Code Pro", "Liberation Mono", monospace; 22 | --bs-blue: #2A7BDE; 23 | --bs-red: #C01C28; 24 | --bs-yellow: #A2734C; 25 | --bs-green: #26A269; 26 | --bs-cyan: #2AA1B3; 27 | --bs-gray: #5E5C64; 28 | --bs-primary: #2A7BDE; 29 | --bs-secondary: #5E5C64; 30 | --bs-success: #26A269; 31 | --bs-info: #2AA1B3; 32 | --bs-warning: #A2734C; 33 | --bs-danger: #C01C28; 34 | --bs-body-rgb: 0, 0, 0; 35 | --bs-primary-rgb: 42, 123, 222; 36 | --bs-secondary-rgb: 94, 92, 100; 37 | --bs-success-rgb: 38, 162, 105; 38 | --bs-info-rgb: 42, 161, 179; 39 | --bs-warning-rgb: 162, 115, 76; 40 | --bs-danger-rgb: 192, 28, 40; 41 | --bs-body-color: #000; 42 | } 43 | 44 | a { 45 | color: var(--bs-blue); 46 | } 47 | 48 | a:hover { 49 | color: #12488B; 50 | } 51 | 52 | samp, samp .form-control { 53 | font-weight: 500; 54 | } 55 | 56 | code { 57 | color: #c64600; 58 | } 59 | 60 | .btn-primary { 61 | background-color: var(--bs-primary); 62 | border-color: var(--bs-primary); 63 | } 64 | .btn-primary:focus, .btn-primary:hover { 65 | background-color: #12488B; 66 | border-color: #12488B; 67 | } 68 | 69 | .form-control, .form-control:focus { 70 | color: var(--bs-body-color); 71 | } 72 | 73 | .form-control[data-check="danger"] { 74 | border-color: var(--bs-danger); 75 | } 76 | .form-control[data-check="danger"]:focus { 77 | border-color: var(--bs-danger); 78 | box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); 79 | } 80 | .form-control[data-check="warning"] { 81 | border-color: var(--bs-warning); 82 | } 83 | .form-control[data-check="warning"]:focus { 84 | border-color: var(--bs-warning); 85 | box-shadow: 0 0 0 0.25rem rgba(var(--bs-warning-rgb), 0.25); 86 | } 87 | .form-control[data-check="info"] { 88 | border-color: var(--bs-info); 89 | } 90 | .form-control[data-check="info"]:focus { 91 | border-color: var(--bs-info); 92 | box-shadow: 0 0 0 0.25rem rgba(var(--bs-info-rgb), 0.25); 93 | } 94 | .form-control[data-check="success"] { 95 | border-color: var(--bs-success); 96 | } 97 | .form-control[data-check="success"]:focus { 98 | border-color: var(--bs-success); 99 | box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); 100 | } 101 | -------------------------------------------------------------------------------- /fonts/Inconsolata-VF.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kepstin/magicisrc/ec8010ddbf1fdbfaebde58564062fb22a56d1170/fonts/Inconsolata-VF.woff2 -------------------------------------------------------------------------------- /fonts/Inter-roman.var.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kepstin/magicisrc/ec8010ddbf1fdbfaebde58564062fb22a56d1170/fonts/Inter-roman.var.woff2 -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | kepstin’s MagicISRC 7 | 8 | 9 | 10 | 882 | 896 | 902 | 928 | 1002 | 1041 | 1053 | 1056 | 1060 | 1064 | 1065 | 1069 | 1070 | 1071 | 1089 |
1090 |

kepstin’s MagicISRC

1091 |

The MagicISRC tool requires that Javascript is enabled. It runs completely in your web browser. For information about privacy and what data is stored and sent, please read the Privacy Policy.

1092 |

It's also possible that I’ve made a mistake in the code, or the page isn’t compatible with your web browser. If you’re sure Javascript is enabled and you still see this page, please file an issue on Github.

1093 |

If you use uBlock Origin to block Javascript, please ensure you clear your browser cache or reload the page while holding Shift after enabling Javascript to work around a caching issue.

1094 |
1095 | 1100 | 1104 | 1105 | 1106 | -------------------------------------------------------------------------------- /privacy.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | kepstin’s MagicISRC Privacy Policy 7 | 8 | 9 | 10 | 11 | 12 | 30 |
31 |

Privacy Policy

32 |

The goal of this application is to allow batch-submission of ISRCs to MusicBrainz while storing the minimum amount possible of personally identifiable data. No data is sent to any third parties other than MusicBrainz, and persistent data is stored in your browser only as a result of choosing to log in. Note that your login to MusicBrainz and requests to load release information or submit ISRCs are subject to the MetaBrainz Privacy Policy.

33 |

Web browser local storage

34 |

The following personal data is used by MagicISRC but is stored only in your web browser local storage. This data is never sent to the server hosting MagicISRC or to any third parties other than MusicBrainz:

35 | 39 |

Data sent to MusicBrainz

40 |

When you load a release, log in, or submit ISRCs, some data is sent to MusicBrainz. Please read the MetaBrainz Privacy Policy for details about what they do with this data. The following data may be sent to MusicBrainz:

41 | 49 |

Web access logs

50 |

Like many other web services, I keep logs of all web requests made to this service. These logs are used for diagnostic and traffic management purposes, and no information from them is sent to any third party or made available publicly. The logs are deleted after 14 days, although anonymized aggregate traffic data may be preserved indefinitely. The following personal data is logged:

51 | 59 |
60 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /seeding.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | kepstin’s MagicISRC Seeding and Importing 7 | 8 | 9 | 10 | 11 | 12 | 30 |
31 |

Seeding and Importing

32 |

I encourage people who are building ISRC scanners or importer Userscripts for music store and streaming pages to use MagicISRC as an ISRC submission UI. If you do that, then you don't need to build an OAuth authentication system for the MusicBrainz API, and as a bonus the MagicISRC page includes a built-in edit preview, and detection for common problems like duplicated/shifted ISRCs.

33 | 34 |
35 |
36 |
37 |
38 |
Apple Music Barcodes/ISRCs
39 |

Browser userscript that allows reading barcodes, ISRCs, and other metadata from Apple Music releases.

40 | Github Repository 41 |
42 |
43 |
44 |
45 |
46 |
47 |
Harmony
48 |

Music Metadata Aggregator and MusicBrainz Importer. Look up release metadata from multiple sources and import the resulting combined release into MusicBrainz.

49 | Harmony 50 | Github Repository 51 |
52 |
53 |
54 |
55 |
56 |
57 |
Your tool here
58 |

If you’re using MagicISRC to submit ISRCs to Musicbrainz in your app or userscript, please let me know so I can list it here!

59 | Open an issue on Github 60 |
61 |
62 |
63 |
64 |

Contact me by opening an issue on Github if you find errors in this list, or to request removal from the list.

65 |

Documentation

66 |

MagicISRC supports seeding by appending GET parameters to the top-level URL https://magicisrc.kepstin.ca/. This makes it easy to use from a Userscript or terminal application, since you just need to construct a link for the user to open in their web browser. The following parameters are supported.

67 |
68 |
mbid
musicbrainzid
69 |
70 |

The MusicBrainz Release ID.

71 |

If not supplied, then MagicISRC will show the “Enter a release MBID:” form. Any supplied ISRCs will be applied after the user manually enters an MBID. The value of this parameter is not required to be a bare MBID – you can use a full MusicBrainz URL, for example. MagicISRC will search for some text that’s formatted like an MBID within the provided string.

72 |

Using the parameter name musicbrainzid may be helpful in some circumstances, since the name mbid might be detected by browsers as a tracking parameter and removed from links.

73 |
74 |
isrcM-T
75 |
76 |

An ISRC, specified by Medium & Track.

77 |

If you know both which medium and which track an ISRC is for, this is the recommended parameter format. Within the name of the parameter, M is replaced with the medium index (counting from 1) and T is replaced with the track index (counting from 1). CD pregap tracks are also supported, by using 0 as the track index.

78 |

Examples:

79 |
    80 |
  • isrc1-1 Track 1 on Medium 1
  • 81 |
82 |
83 |
isrcN
84 |
85 |

An ISRC, specified by sequential position.

86 |

If you just have a list of ISRCs but you do not know how they are split between media, use this format. This parameter format is primarily supported for backwards compatibility with older ISRC submission tools – please use the Medium & Track format instead if possible. Within the name of the parameter, N is replaced with the position (counting from 1). CD pregap tracks are not supported; they will be skipped in the numbering sequence.

87 |
88 |
edit-note
89 |
90 |

An edit note to include with the ISRC addition edit.

91 |

See the MusicBrainz Edit Note documentation for detail on the use and formatting of an edit note, and How to Write Edit Notes for more information on what a good edit note should include.

92 |
93 |
94 |
95 | 100 | 101 | 102 | --------------------------------------------------------------------------------