{"id":19596,"date":"2026-09-17T14:21:23","date_gmt":"2026-09-17T12:21:23","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/toolbox\/isrc-iswc-barcode-lookup-musicbrainz\/"},"modified":"2026-09-17T16:52:06","modified_gmt":"2026-09-17T14:52:06","slug":"isrc-iswc-barcode-lookup-musicbrainz","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/isrc-iswc-barcode-lookup-musicbrainz\/","title":{"rendered":"ISRC, ISWC and Barcode Lookup: recordings, works and releases in MusicBrainz"},"content":{"rendered":"<div class=\"lw-mbq\" id=\"mbq-wurzel\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<style>\n.lw-mbq { --mbq-warn: #e8a33d; }\n:root[data-theme=\"light\"] .lw-mbq { --mbq-warn: #8f5300; }\n.lw-mbq .mbq-feld { width: 100%; box-sizing: border-box; padding: 10px 12px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; font-size: 1rem; }\n.lw-mbq .mbq-reihe { display: flex; flex-wrap: wrap; gap: 8px 10px; align-items: center; margin: 12px 0 0; }\n.lw-mbq .mbq-knopf { background: var(--accent, #2ba6df); color: var(--on-accent, #0b1114); border: none; padding: 11px 22px; border-radius: 6px; font-weight: 700; cursor: pointer; }\n.lw-mbq .mbq-knopf[disabled] { opacity: 0.6; cursor: default; }\n.lw-mbq .mbq-bsp { background: transparent; color: var(--text-secondary, #a0a0b0); border: 1px solid var(--border, #2a2a35); padding: 6px 10px; border-radius: 6px; cursor: pointer; font-family: monospace; font-size: 0.82rem; }\n.lw-mbq .mbq-klein { font-size: 0.84rem; color: var(--text-secondary, #a0a0b0); line-height: 1.55; }\n.lw-mbq .mbq-erkannt { font-size: 0.86rem; margin: 8px 0 0; min-height: 1.3em; line-height: 1.5; }\n.lw-mbq .mbq-ok { color: var(--ok, #7ee787); }\n.lw-mbq .mbq-fehler { color: var(--fail, #ff7b72); }\n.lw-mbq .mbq-warn { color: var(--mbq-warn); }\n.lw-mbq .mbq-kopf { display: flex; flex-wrap: wrap; gap: 4px 14px; align-items: baseline; margin: 0 0 8px; }\n.lw-mbq .mbq-typ { font-size: 0.74rem; text-transform: uppercase; letter-spacing: 0.4px; color: var(--text-secondary, #a0a0b0); }\n.lw-mbq .mbq-code { font-family: monospace; font-size: 1.12rem; font-weight: 700; color: var(--text-primary, #e8e8ee); word-break: break-all; }\n.lw-mbq .mbq-summe { font-weight: 700; font-size: 0.95rem; color: var(--text-primary, #e8e8ee); }\n.lw-mbq .mbq-karte { background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-left-width: 3px; border-radius: 8px; padding: 12px 14px; margin: 0 0 10px; }\n.lw-mbq .mbq-karte.mbq-stufe-gut { border-left-color: var(--ok, #7ee787); }\n.lw-mbq .mbq-karte.mbq-stufe-mittel { border-left-color: var(--mbq-warn); }\n.lw-mbq .mbq-karte.mbq-stufe-info { border-left-color: var(--text-secondary, #a0a0b0); }\n.lw-mbq .mbq-stufe { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.5px; font-weight: 700; margin: 0 0 3px; }\n.lw-mbq .mbq-titel { font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 1rem; overflow-wrap: anywhere; }\n.lw-mbq .mbq-unter { color: var(--text-secondary, #a0a0b0); font-size: 0.88rem; margin: 2px 0 4px; overflow-wrap: anywhere; }\n.lw-mbq table { border-collapse: collapse; width: 100%; font-size: 0.86rem; margin-top: 6px; }\n.lw-mbq th, .lw-mbq td { text-align: left; padding: 5px 12px 5px 0; border-bottom: 1px solid var(--border, #2a2a35); vertical-align: top; }\n.lw-mbq table.mbq-kv th { color: var(--text-secondary, #a0a0b0); font-weight: 400; white-space: nowrap; width: 1%; }\n.lw-mbq table.mbq-kv td { overflow-wrap: anywhere; }\n.lw-mbq table.mbq-liste th { color: var(--text-secondary, #a0a0b0); font-weight: 700; font-size: 0.74rem; text-transform: uppercase; letter-spacing: 0.4px; white-space: nowrap; }\n.lw-mbq td { color: var(--text-primary, #e8e8ee); }\n.lw-mbq .mbq-mono { font-family: monospace; }\n.lw-mbq .mbq-rollbar { overflow-x: auto; }\n.lw-mbq .mbq-rollbar table { min-width: 560px; }\n.lw-mbq .mbq-h { font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.98rem; margin: 22px 0 8px; }\n.lw-mbq .mbq-h2 { font-weight: 700; color: var(--text-secondary, #a0a0b0); font-size: 0.84rem; margin: 12px 0 2px; }\n.lw-mbq a { color: var(--accent, #2ba6df); }\n<\/style>\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 18px;\">Whether an ISRC really belongs to the right recording only shows up in a database. The lookup checks an ISRC, ISWC, UPC or EAN against MusicBrainz, the open music database: for an ISRC the recordings with their releases and linked work, for an ISWC the works with their writers, for a barcode the releases. Codes used more than once stand out at a glance.<\/p>\n<p>    <label for=\"mbq-code\" class=\"mbq-klein\" style=\"display: block; margin-bottom: 6px;\">ISRC, ISWC, UPC or EAN (hyphens, dots and spaces are ignored)<\/label><br \/>\n    <input id=\"mbq-code\" class=\"mbq-feld\" type=\"text\" maxlength=\"80\" spellcheck=\"false\" autocomplete=\"off\" placeholder=\"e.g. GBDUW0000059\"><\/p>\n<div id=\"mbq-erkannt\" data-mp-mask class=\"mbq-erkannt\" aria-live=\"polite\"><\/div>\n<div class=\"mbq-reihe\">\n        <button id=\"mbq-knopf\" type=\"button\" class=\"mbq-knopf\">Look up in MusicBrainz<\/button><br \/>\n        <span class=\"mbq-klein\">Examples:<\/span><br \/>\n        <button type=\"button\" class=\"mbq-bsp\" data-code=\"GBDUW0000059\">GBDUW0000059<\/button><br \/>\n        <button type=\"button\" class=\"mbq-bsp\" data-code=\"T-071.495.166-2\">T-071.495.166-2<\/button><br \/>\n        <button type=\"button\" class=\"mbq-bsp\" data-code=\"724384960629\">724384960629<\/button>\n    <\/div>\n<p class=\"mbq-klein\" style=\"margin: 14px 0 0;\">On click, reCAPTCHA by Google checks the request. The server of this website sends only the code to MusicBrainz, not the IP address; for the limit of 20 lookups per hour it counts only the IP address. Neither the code nor the answers from MusicBrainz are stored.<\/p>\n<div id=\"mbq-ausgabe\" data-mp-mask style=\"margin-top: 18px;\" aria-live=\"polite\"><\/div>\n<div class=\"mbq-h\">How the lookup works<\/div>\n<p class=\"mbq-klein\" style=\"margin: 0 0 6px;\">ISRC: MusicBrainz first returns the recordings that carry the code. For the first three, the lookup loads their releases, all ISRCs of the recording and the linked work with its ISWC. MusicBrainz returns at most 25 releases per lookup.<\/p>\n<p class=\"mbq-klein\" style=\"margin: 0 0 6px;\">ISWC: MusicBrainz returns the works with this ISWC, the linked people with their role and, where entered, the work identifiers of collecting societies.<\/p>\n<p class=\"mbq-klein\" style=\"margin: 0 0 6px;\">UPC and EAN: MusicBrainz finds barcodes only through its search. Only releases whose barcode matches exactly are counted; a UPC-A is also searched with a leading zero.<\/p>\n<p class=\"mbq-klein\" style=\"margin: 0 0 6px;\">Structure, IFPI prefix list and check digits in detail: <a href=\"\/blog\/en\/toolbox\/isrc-upc-ean-iswc-validator\/\">ISRC, UPC\/EAN and ISWC Validator<\/a><\/p>\n<p class=\"mbq-klein\" style=\"margin: 16px 0 0;\">Authoritative databases of the issuing bodies: <a href=\"https:\/\/isrcsearch.ifpi.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">ISRC Search (IFPI)<\/a> \u00b7 <a href=\"https:\/\/iswcnet.cisac.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">ISWC Network (CISAC)<\/a><\/p>\n<p class=\"mbq-klein\" style=\"margin: 10px 0 0;\">Sources: <a href=\"https:\/\/musicbrainz.org\/doc\/MusicBrainz_API\" target=\"_blank\" rel=\"noopener noreferrer\">MusicBrainz API<\/a> \u00b7 <a href=\"https:\/\/musicbrainz.org\/doc\/MusicBrainz_API\/Rate_Limiting\" target=\"_blank\" rel=\"noopener noreferrer\">MusicBrainz API: Rate Limiting<\/a> \u00b7 <a href=\"https:\/\/musicbrainz.org\/doc\/MusicBrainz_Database\" target=\"_blank\" rel=\"noopener noreferrer\">MusicBrainz Database (core data, CC0)<\/a> \u00b7 <a href=\"https:\/\/musicbrainz.org\/doc\/Style\/Recording\" target=\"_blank\" rel=\"noopener noreferrer\">MusicBrainz Style: Recording<\/a> \u00b7 <a href=\"https:\/\/isrc.ifpi.org\/faqs\" target=\"_blank\" rel=\"noopener noreferrer\">ISRC FAQ (IFPI)<\/a> \u00b7 <a href=\"https:\/\/isrc.ifpi.org\/images\/downloads\/ISRC_Handbook.pdf\" target=\"_blank\" rel=\"noopener noreferrer\">ISRC Handbook, 4th Edition (IFPI)<\/a> \u00b7 <a href=\"https:\/\/www.iswc.org\/iswc\" target=\"_blank\" rel=\"noopener noreferrer\">The ISWC (CISAC)<\/a><\/p>\n<p class=\"mbq-klein\" style=\"font-size: 0.8rem; margin: 14px 0 0;\">MusicBrainz is an open database maintained by volunteers; its core data is released under CC0. A code missing there may still have been issued, and entries can contain mistakes. The authoritative sources are the issuing ISRC agency, the ISWC agency and the distributor.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"sprache\":\"en\",\"locale\":\"en-GB\",\"einleitung\":\"Whether an ISRC really belongs to the right recording only shows up in a database. The lookup checks an ISRC, ISWC, UPC or EAN against MusicBrainz, the open music database: for an ISRC the recordings with their releases and linked work, for an ISWC the works with their writers, for a barcode the releases. Codes used more than once stand out at a glance.\",\"label_code\":\"ISRC, ISWC, UPC or EAN (hyphens, dots and spaces are ignored)\",\"platzhalter\":\"e.g. GBDUW0000059\",\"knopf\":\"Look up in MusicBrainz\",\"beispiele\":\"Examples:\",\"datenschutz\":\"On click, reCAPTCHA by Google checks the request. The server of this website sends only the code to MusicBrainz, not the IP address; for the limit of 20 lookups per hour it counts only the IP address. Neither the code nor the answers from MusicBrainz are stored.\",\"laeuft\":\"Querying MusicBrainz \u2026\",\"erkannt_isrc\":\"ISRC recognised: {anzeige}\",\"erkannt_iswc\":\"ISWC recognised: {anzeige}\",\"erkannt_upc\":\"UPC-A recognised: {anzeige}; 0{anzeige} is searched as well\",\"erkannt_ean\":\"EAN-13 recognised: {anzeige}\",\"grund_unbekannt\":\"No ISRC, ISWC, UPC or EAN recognised. An ISRC has 12 characters such as GBDUW0000059, an ISWC has the form T-071.495.166-2, a UPC has 12 digits and an EAN 13.\",\"grund_laenge\":\"{n} digits match neither UPC-A (12) nor EAN-13 (13).\",\"grund_pruefziffer\":\"The check digit of {anzeige} does not match; it has to be {soll}. The mistake is usually in one of the other digits; only codes with a valid check digit are looked up.\",\"grund_iswc_null\":\"The work identifier 000000000 is not permitted in an ISWC.\",\"typ_isrc\":\"ISRC\",\"typ_iswc\":\"ISWC\",\"typ_upc\":\"UPC-A\",\"typ_ean\":\"EAN-13\",\"summe_aufnahmen_0\":\"no recording in MusicBrainz\",\"summe_aufnahmen_1\":\"1 recording\",\"summe_aufnahmen_n\":\"{n} recordings\",\"summe_werke_0\":\"no work in MusicBrainz\",\"summe_werke_1\":\"1 work\",\"summe_werke_n\":\"{n} works\",\"summe_releases_0\":\"no release in MusicBrainz\",\"summe_releases_1\":\"1 release\",\"summe_releases_n\":\"{n} releases\",\"zeile_quelle\":\"In MusicBrainz\",\"link_quelle\":\"Open page\",\"zeile_stand\":\"Data as of\",\"aus_speicher\":\"from the cache\",\"zeile_limit\":\"Lookups left this hour\",\"h_befunde\":\"Notes\",\"h_aufnahmen\":\"Recordings\",\"h_werke\":\"Works\",\"h_releases\":\"Releases\",\"stufe_mittel\":\"Check\",\"stufe_info\":\"Note\",\"stufe_gut\":\"In order\",\"feld_laenge\":\"Length\",\"feld_erst\":\"First release\",\"feld_isrcs\":\"ISRCs of the recording\",\"feld_werk\":\"Work\",\"feld_video\":\"Video\",\"ja\":\"yes\",\"ohne_details\":\"Releases and work were not loaded for this recording.\",\"ohne_titel\":\"(untitled)\",\"feld_iswcs\":\"ISWCs\",\"feld_urheber\":\"Writers\",\"feld_kennungen\":\"Identifiers\",\"feld_sprachen\":\"Language\",\"kennungen_mehr\":\"and {n} more\",\"releases_anzahl\":\"Releases with this recording: {n}\",\"releases_grenze\":\"Releases with this recording: at least {n}. MusicBrainz returns at most 25 per lookup; all of them are listed on the recording page.\",\"sp_titel\":\"Title\",\"sp_kuenstler\":\"Artist\",\"sp_datum\":\"Date\",\"sp_land\":\"Country\",\"sp_label\":\"Label \u00b7 catalogue no.\",\"sp_format\":\"Format\",\"sp_titelzahl\":\"Tracks\",\"sp_status\":\"Status\",\"sp_barcode\":\"Barcode\",\"land_XE\":\"Europe\",\"land_XW\":\"worldwide\",\"land_XU\":\"unknown\",\"sprache_zxx\":\"no lyrics\",\"sprache_mul\":\"multiple languages\",\"rolle_writer\":\"writer\",\"rolle_composer\":\"composer\",\"rolle_lyricist\":\"lyricist\",\"rolle_arranger\":\"arranger\",\"rolle_translator\":\"translator\",\"rolle_librettist\":\"librettist\",\"rolle_orchestrator\":\"orchestrator\",\"status_official\":\"official\",\"status_promotion\":\"promotion\",\"status_bootleg\":\"bootleg\",\"status_pseudo_release\":\"pseudo-release\",\"status_withdrawn\":\"withdrawn\",\"status_cancelled\":\"cancelled\",\"art_album\":\"album\",\"art_single\":\"single\",\"art_ep\":\"EP\",\"art_broadcast\":\"broadcast\",\"art_other\":\"other\",\"werktyp_song\":\"Song\",\"werktyp_soundtrack\":\"Soundtrack\",\"werktyp_symphony\":\"Symphony\",\"werktyp_opera\":\"Opera\",\"werktyp_musical\":\"Musical\",\"werktyp_concerto\":\"Concerto\",\"werktyp_sonata\":\"Sonata\",\"werktyp_suite\":\"Suite\",\"befund_isrc_nicht_gefunden\":\"No entry in MusicBrainz || MusicBrainz does not know the ISRC {code}. That does not make it invalid: the database is maintained by volunteers, and an ISRC is only in it if someone entered it or imported it from a CD or a streaming service.\",\"befund_isrc_eine_aufnahme\":\"Exactly one recording || In MusicBrainz exactly one recording carries this ISRC. That is how it is meant to be: according to IFPI, an ISRC must not be re-used under any circumstances.\",\"befund_isrc_mehrere_aufnahmen\":\"{n} recordings with the same ISRC || According to IFPI, an ISRC must not be re-used under any circumstances, and remixes or edits need a code of their own. Several matches point to a re-issued code, a wrong assignment when the data was entered, or duplicate entries in MusicBrainz; the titles and lengths of the recordings usually show which case applies. If an ISRC has really been assigned to two recordings, Annex A.13.3 of the ISRC Handbook requires a new ISRC for one or both.\",\"befund_aufnahme_video\":\"Entered as a video: {titel} || According to IFPI, a music video and a sound recording are different recordings even with the same audio, and each needs its own ISRC.\",\"befund_aufnahme_mehrere_isrcs\":\"{n} ISRCs on one recording: {titel} || MusicBrainz links the recording to {liste}. MusicBrainz treats remastered versions as the same recording, while according to the ISRC Handbook a remaster only needs a new code if it involves creative input. If a recording was given several ISRCs by mistake, the registrant selects one as preferred under Annex A.13.2 and stops using the others.\",\"befund_aufnahme_ohne_werk\":\"No work linked: {titel} || In MusicBrainz no work is linked to this recording, so this route does not lead to an ISWC. The ISWC identifies the composition, not the recording.\",\"befund_werk_ohne_iswc\":\"Work without an ISWC: {titel} || The linked work has no ISWC in MusicBrainz. Either none has been allocated, or it has not been entered.\",\"befund_details_unvollstaendig\":\"Details incomplete || MusicBrainz was busy while releases and works were being loaded. Recordings without these details: {n}. A new lookup in a few minutes fetches them.\",\"befund_details_gekappt\":\"Details for the first {max} recordings || Releases and works are loaded for at most {max} of {n} recordings, so that MusicBrainz is not burdened with follow-up requests.\",\"befund_iswc_nicht_gefunden\":\"No entry in MusicBrainz || MusicBrainz does not know the ISWC {code}. That says nothing about its validity: works and ISWCs are entered by volunteers.\",\"befund_iswc_ein_werk\":\"Exactly one work || In MusicBrainz exactly one work carries this ISWC. That is how it is meant to be: according to the ISWC agency, an ISWC uniquely identifies each musical work.\",\"befund_iswc_mehrere_werke\":\"{n} works with the same ISWC || An ISWC identifies exactly one musical work. Several matches point to duplicate work entries in MusicBrainz or a wrongly assigned ISWC.\",\"befund_werk_mehrere_iswcs\":\"{n} ISWCs on one work: {titel} || MusicBrainz links the work to {liste}. According to the ISWC agency, ISWCs assigned in error can now be merged or separated.\",\"befund_werk_ohne_urheber\":\"No writers entered: {titel} || In MusicBrainz no person is linked to this work for music or lyrics.\",\"befund_barcode_nicht_gefunden\":\"No release with this barcode || MusicBrainz has no release with {code}. For a UPC-A, and for an EAN-13 with a leading zero, the other spelling is searched as well. That does not make the barcode invalid; structure and check digit are covered by the code validator.\",\"befund_barcode_ein_release\":\"Exactly one release || In MusicBrainz exactly one release carries this barcode.\",\"befund_barcode_mehrere_releases\":\"{n} releases with the same barcode || This happens, for example, when editions for different countries carry the same number. Country, date and catalogue number in the table show the differences.\",\"befund_barcode_mehr_treffer\":\"More than {max} matches || The search returns at most {max} releases; the rest are on the MusicBrainz search page.\",\"fehler_methode\":\"Wrong request method.\",\"fehler_eingabe\":\"The request could not be read.\",\"fehler_kein_token\":\"The lookup could not be started because reCAPTCHA did not load.\",\"fehler_captcha\":\"reCAPTCHA classified the request as automated. Reloading the page normally helps.\",\"fehler_pruefdienst\":\"The reCAPTCHA service could not be reached.\",\"fehler_aufbau\":\"The service is not configured correctly. The fault is on this side.\",\"fehler_zaehler\":\"The rate counter is unavailable, so nothing was looked up.\",\"fehler_zu_viele\":\"The limit of {limit} lookups per hour for this address has been reached.\",\"fehler_code\":\"The code could not be read.\",\"fehler_ausgelastet\":\"MusicBrainz is busy and declined the request. A new lookup in a few minutes usually works.\",\"fehler_netz\":\"The service could not be reached.\",\"fehler_musicbrainz\":\"MusicBrainz answered unexpectedly (status {status}).\",\"fehler_antwort\":\"The answer could not be read.\",\"fehler_abgeschaltet\":\"The lookup is currently switched off.\",\"fehler_unbekannt\":\"Something went wrong that has no message of its own.\",\"h_ablauf\":\"How the lookup works\",\"erkl_isrc\":\"ISRC: MusicBrainz first returns the recordings that carry the code. For the first three, the lookup loads their releases, all ISRCs of the recording and the linked work with its ISWC. MusicBrainz returns at most 25 releases per lookup.\",\"erkl_iswc\":\"ISWC: MusicBrainz returns the works with this ISWC, the linked people with their role and, where entered, the work identifiers of collecting societies.\",\"erkl_barcode\":\"UPC and EAN: MusicBrainz finds barcodes only through its search. Only releases whose barcode matches exactly are counted; a UPC-A is also searched with a leading zero.\",\"erkl_pruefer\":\"Structure, IFPI prefix list and check digits in detail:\",\"link_pruefer\":\"ISRC, UPC\\\/EAN and ISWC Validator\",\"url_pruefer\":\"\\\/blog\\\/en\\\/toolbox\\\/isrc-upc-ean-iswc-validator\\\/\",\"offiziell\":\"Authoritative databases of the issuing bodies:\",\"quellen_titel\":\"Sources\",\"grenze\":\"MusicBrainz is an open database maintained by volunteers; its core data is released under CC0. A code missing there may still have been issued, and entries can contain mistakes. The authoritative sources are the issuing ISRC agency, the ISWC agency and the distributor.\"};<\/p>\n<p>    var ENDPUNKT = '\/lw-mbabfrage.php';\n    var SITEKEY = '6LcrPkEtAAAAAPo1QCOf-IIM2fCL0UfdJz4y2iSY';\n    var MB = 'https:\/\/musicbrainz.org\/';\n    var STUFEN = ['mittel', 'info', 'gut'];\n    var ISRC = \/^[A-Z]{2}[A-Z0-9]{3}\\d{7}$\/;\n    var ISWC_FORM = \/^T-\\d{3}\\.\\d{3}\\.\\d{3}-\\d$\/;\n    var SPRACHCODES = { eng: 'en', deu: 'de', ger: 'de', pol: 'pl', fra: 'fr', fre: 'fr', spa: 'es', ita: 'it', por: 'pt', nld: 'nl', dut: 'nl',\n        swe: 'sv', nor: 'no', dan: 'da', fin: 'fi', jpn: 'ja', kor: 'ko', zho: 'zh', chi: 'zh', rus: 'ru', ukr: 'uk', ces: 'cs', cze: 'cs',\n        tur: 'tr', ell: 'el', gre: 'el', hun: 'hu', ron: 'ro', rum: 'ro', ara: 'ar', heb: 'he', hin: 'hi', lat: 'la', gle: 'ga', cym: 'cy', wel: 'cy' };<\/p>\n<p>    \/\/ --- Texte ------------------------------------------------------------------\n    function text(schluessel, daten) {\n        var t = T[schluessel];\n        if (typeof t !== 'string') { return null; }\n        return t.replace(\/\\{([a-z_0-9]+)\\}\/g, function (m, k) {\n            return (daten && daten[k] !== undefined && daten[k] !== null) ? String(daten[k]) : m;\n        });\n    }<\/p>\n<p>    \/\/ --- Codes lesen: dieselben Regeln wie lw_mb_code_lesen() auf dem Server -------\n    function gs1Pruefziffer(ohne) {\n        var summe = 0;\n        for (var i = ohne.length - 1, faktor = 3; i >= 0; i--, faktor = faktor === 3 ? 1 : 3) {\n            summe += (ohne.charCodeAt(i) - 48) * faktor;\n        }\n        return (10 - summe % 10) % 10;\n    }\n    function iswcPruefziffer(neun) {\n        var summe = 1;\n        for (var i = 0; i < 9; i++) { summe += (i + 1) * (neun.charCodeAt(i) - 48); }\n        return (10 - summe % 10) % 10;\n    }\n    function lesen(roh) {\n        var aus = { typ: null, code: null, anzeige: null, fehler: null, soll: null, n: null };\n        if (typeof roh !== 'string' || roh.trim() === '' || roh.length > 80) { aus.fehler = 'unbekannt'; return aus; }\n        var gross = roh.trim().toUpperCase();\n        var trenner = \/[\\s.\\-_\\u2010-\\u2015]\/g;\n        var voll = gross.replace(trenner, '');\n        var gekuerzt = gross.replace(\/^(ISRC|ISWC|UPC|EAN|GTIN)[\\s:\\-]*\/, '').replace(trenner, '');\n        \/\/ Vorsaetze fallen weg - ausser die Eingabe ist mit ihnen schon ein gueltig geformter Code\n        var c = \/^(T\\d{10}|\\d{12,13}|[A-Z]{2}[A-Z0-9]{3}\\d{7})$\/.test(voll) ? voll : gekuerzt;\n        if (c === '') { aus.fehler = 'unbekannt'; return aus; }\n        if (\/^T\\d{10}$\/.test(c)) {\n            var neun = c.slice(1, 10), gegeben = c.charCodeAt(10) - 48;\n            aus.typ = 'iswc';\n            aus.anzeige = 'T-' + neun.slice(0, 3) + '.' + neun.slice(3, 6) + '.' + neun.slice(6, 9) + '-' + gegeben;\n            if (neun === '000000000') { aus.fehler = 'iswc_null'; return aus; }\n            var soll = iswcPruefziffer(neun);\n            if (gegeben !== soll) { aus.fehler = 'pruefziffer'; aus.soll = soll; return aus; }\n            aus.code = c;\n            return aus;\n        }\n        if (\/^\\d+$\/.test(c)) {\n            var n = c.length;\n            if (n !== 12 && n !== 13) { aus.fehler = 'laenge'; aus.n = n; return aus; }\n            aus.typ = n === 12 ? 'upc' : 'ean';\n            aus.anzeige = c;\n            var soll2 = gs1Pruefziffer(c.slice(0, -1));\n            if (c.charCodeAt(n - 1) - 48 !== soll2) { aus.fehler = 'pruefziffer'; aus.soll = soll2; return aus; }\n            aus.code = c;\n            return aus;\n        }\n        if (ISRC.test(c)) {\n            aus.typ = 'isrc';\n            aus.code = c;\n            aus.anzeige = c.slice(0, 2) + '-' + c.slice(2, 5) + '-' + c.slice(5, 7) + '-' + c.slice(7);\n            return aus;\n        }\n        aus.fehler = 'unbekannt';\n        return aus;\n    }<\/p>\n<p>    \/\/ --- Antwort des Servers pruefen ----------------------------------------------\n    function liste(w) { return Array.isArray(w) ? w : []; }\n    function zahl(w) { return (typeof w === 'number' && isFinite(w)) ? w : null; }\n    function zk(w, max) { return typeof w === 'string' ? w.slice(0, max || 300) : ''; }\n    function muster(w, re) { return (typeof w === 'string' && re.test(w)) ? w : ''; }\n    function mbUrl(w) { return (typeof w === 'string' && w.indexOf(MB) === 0 && !\/[\\s\"'<>\\\\]\/.test(w)) ? w : ''; }\n    function codes(w, re) {\n        var aus = [];\n        liste(w).forEach(function (x) { if (typeof x === 'string' && re.test(x) && aus.indexOf(x) === -1 && aus.length < 20) { aus.push(x); } });\n        return aus;\n    }\n    var DATUM = \/^\\d{4}(-\\d{2}(-\\d{2})?)?$\/;\n    var SCHLUESSEL = \/^[a-z0-9_]{1,40}$\/;\n\n    function release(r) {\n        r = (r &#038;&#038; typeof r === 'object') ? r : {};\n        return {\n            titel: zk(r.titel), kuenstler: zk(r.kuenstler), datum: muster(r.datum, DATUM), land: muster(r.land, \/^[A-Z]{2}$\/),\n            status: muster(r.status, SCHLUESSEL), barcode: muster(r.barcode, \/^\\d{1,20}$\/),\n            labels: liste(r.labels).filter(function (x) { return typeof x === 'string'; }).map(function (x) { return x.slice(0, 200); }).slice(0, 3),\n            formate: zk(r.formate, 120), titelzahl: zahl(r.titelzahl), art: muster(r.art, SCHLUESSEL), url: mbUrl(r.url)\n        };\n    }\n    function aufnahme(a) {\n        a = (a &#038;&#038; typeof a === 'object') ? a : {};\n        return {\n            titel: zk(a.titel), kuenstler: zk(a.kuenstler), zusatz: zk(a.zusatz, 200), laengeMs: zahl(a.laenge_ms),\n            erst: muster(a.erstveroeffentlichung, DATUM), video: a.video === true, url: mbUrl(a.url), details: a.details === true,\n            isrcs: codes(a.isrcs, ISRC),\n            werke: liste(a.werke).slice(0, 10).map(function (w) {\n                w = (w &#038;&#038; typeof w === 'object') ? w : {};\n                return { titel: zk(w.titel), iswcs: codes(w.iswcs, ISWC_FORM), url: mbUrl(w.url) };\n            }),\n            releases: liste(a.releases).slice(0, 25).map(release),\n            releasesGesamt: zahl(a.releases_gesamt) || 0, releasesGrenze: a.releases_grenze === true\n        };\n    }\n    function werk(w) {\n        w = (w &#038;&#038; typeof w === 'object') ? w : {};\n        return {\n            titel: zk(w.titel), zusatz: zk(w.zusatz, 200), typ: muster(w.typ, SCHLUESSEL),\n            sprachen: codes(w.sprachen, \/^[a-z]{3}$\/), iswcs: codes(w.iswcs, ISWC_FORM),\n            urheber: liste(w.urheber).slice(0, 20).map(function (u) {\n                u = (u &#038;&#038; typeof u === 'object') ? u : {};\n                return { name: zk(u.name, 120), rolle: muster(u.rolle, SCHLUESSEL) };\n            }).filter(function (u) { return u.name !== ''; }),\n            kennungen: liste(w.kennungen).slice(0, 12).map(function (k) {\n                k = (k &#038;&#038; typeof k === 'object') ? k : {};\n                return { typ: zk(k.typ, 60), wert: zk(k.wert, 60) };\n            }).filter(function (k) { return k.typ !== '' &#038;&#038; k.wert !== ''; }),\n            kennungenGesamt: zahl(w.kennungen_gesamt) || 0, url: mbUrl(w.url)\n        };\n    }\n    function befund(b) {\n        b = (b &#038;&#038; typeof b === 'object') ? b : {};\n        var daten = {};\n        if (b.daten &#038;&#038; typeof b.daten === 'object') {\n            Object.keys(b.daten).forEach(function (k) {\n                var v = b.daten[k];\n                if (typeof v === 'string') { daten[k] = v.slice(0, 400); } else if (zahl(v) !== null) { daten[k] = v; }\n            });\n        }\n        return { key: muster(b.key, \/^[a-z_]{1,40}$\/), stufe: STUFEN.indexOf(b.stufe) === -1 ? 'info' : b.stufe, daten: daten };\n    }\n    function fehlerObjekt(a) {\n        return { fehler: String(a.fehler || 'antwort').slice(0, 40), grund: muster(a.grund, SCHLUESSEL) || null, soll: zahl(a.soll), n: zahl(a.n),\n            limit: zahl(a.limit), status: zahl(a.status), anzeige: zk(a.anzeige, 40) };\n    }\n    function bewerten(antwort) {\n        var a = (antwort &#038;&#038; typeof antwort === 'object') ? antwort : {};\n        if (a.fehler) { return fehlerObjekt(a); }\n        var typ = ['isrc', 'iswc', 'upc', 'ean'].indexOf(a.typ) === -1 ? null : a.typ;\n        if (!typ) { return fehlerObjekt({ fehler: 'antwort' }); }\n        return {\n            fehler: null, typ: typ, anzeige: zk(a.anzeige, 40), quelle: mbUrl(a.quelle),\n            aufnahmen: liste(a.aufnahmen).slice(0, 25).map(aufnahme), aufnahmenGesamt: zahl(a.aufnahmen_gesamt) || 0,\n            werke: liste(a.werke).slice(0, 10).map(werk), werkeGesamt: zahl(a.werke_gesamt) || 0,\n            releases: liste(a.releases).slice(0, 25).map(release), releasesGesamt: zahl(a.releases_gesamt) || 0,\n            befunde: liste(a.befunde).map(befund).filter(function (b) { return b.key !== ''; }),\n            zwischengespeichert: a.zwischengespeichert === true, stand: zahl(a.stand), dauer: zahl(a.dauer_ms), limitRest: zahl(a.limit_rest)\n        };\n    }\n\n    \/\/ --- Anzeigehilfen -------------------------------------------------------------\n    function dauer(ms) {\n        if (typeof ms !== 'number' || !isFinite(ms) || ms <= 0) { return ''; }\n        var s = Math.round(ms \/ 1000), h = Math.floor(s \/ 3600), m = Math.floor((s % 3600) \/ 60), r = s % 60;\n        var rr = (r < 10 ? '0' : '') + r;\n        return h > 0 ? h + ':' + (m < 10 ? '0' : '') + m + ':' + rr : m + ':' + rr;\n    }\n    function namen(typ, code) {\n        try {\n            if (typeof Intl !== 'undefined' &#038;&#038; Intl.DisplayNames) {\n                var n = new Intl.DisplayNames([T.sprache], { type: typ }).of(code);\n                if (n &#038;&#038; n !== code) { return n; }\n            }\n        } catch (e) { \/* unbekannter Code *\/ }\n        return null;\n    }\n    function landName(code) {\n        if (!code) { return ''; }\n        return text('land_' + code) || namen('region', code) || code;\n    }\n    function sprachName(code) {\n        return text('sprache_' + code) || (SPRACHCODES[code] ? namen('language', SPRACHCODES[code]) : null) || code;\n    }\n    function rolleName(r) { return text('rolle_' + r) || String(r).replace(\/_\/g, ' '); }\n    function statusName(s) { return s ? (text('status_' + s) || s.replace(\/_\/g, ' ')) : ''; }\n    function artName(s) { return s ? (text('art_' + s) || s.replace(\/_\/g, ' ')) : ''; }\n    function zeitpunkt(ts) {\n        if (ts === null) { return ''; }\n        try { return new Date(ts * 1000).toLocaleString(T.locale, { dateStyle: 'medium', timeStyle: 'short' }); } catch (e) { return new Date(ts * 1000).toISOString(); }\n    }\n    function summe(b) {\n        var n = b.typ === 'isrc' ? b.aufnahmenGesamt : (b.typ === 'iswc' ? b.werkeGesamt : b.releasesGesamt);\n        var art = b.typ === 'isrc' ? 'aufnahmen' : (b.typ === 'iswc' ? 'werke' : 'releases');\n        return text('summe_' + art + '_' + (n === 0 ? '0' : (n === 1 ? '1' : 'n')), { n: n });\n    }\n\n    \/\/ --- Darstellung ---------------------------------------------------------------\n    function neu(tag, klasse, inhalt) {\n        var x = document.createElement(tag);\n        if (klasse) { x.className = klasse; }\n        if (inhalt !== undefined &#038;&#038; inhalt !== null) { x.textContent = inhalt; }\n        return x;\n    }\n    function verweis(url, inhalt, klasse) {\n        if (!mbUrl(url)) { return neu('span', klasse || '', inhalt); }\n        var a = neu('a', klasse || '', inhalt);\n        a.href = url;\n        a.target = '_blank';\n        a.rel = 'noopener noreferrer';\n        return a;\n    }\n    function kvTabelle(zeilen) {\n        var tab = neu('table', 'mbq-kv');\n        zeilen.forEach(function (z) {\n            if (z[1] === '' || z[1] === null || z[1] === undefined) { return; }\n            var tr = neu('tr');\n            tr.appendChild(neu('th', '', z[0]));\n            var td = neu('td', z[2] || '');\n            if (typeof z[1] === 'string') { td.textContent = z[1]; } else { td.appendChild(z[1]); }\n            tr.appendChild(td);\n            tab.appendChild(tr);\n        });\n        return tab;\n    }\n    function codeVerweise(liste, pfad) {\n        var span = neu('span', 'mbq-mono');\n        liste.forEach(function (c, i) {\n            if (i) { span.appendChild(document.createTextNode(', ')); }\n            span.appendChild(verweis(MB + pfad + c, c));\n        });\n        return span;\n    }\n    function befundKarte(f) {\n        var k = neu('div', 'mbq-karte mbq-stufe-' + f.stufe);\n        var roh = text('befund_' + f.key, f.daten) || f.key;\n        var teile = roh.split(' || ');\n        k.appendChild(neu('div', 'mbq-stufe ' + (f.stufe === 'gut' ? 'mbq-ok' : (f.stufe === 'mittel' ? 'mbq-warn' : 'mbq-klein')), T['stufe_' + f.stufe]));\n        k.appendChild(neu('div', 'mbq-titel', teile[0]));\n        if (teile[1]) { k.appendChild(neu('div', 'mbq-klein', teile[1])); }\n        return k;\n    }\n    function releaseTabelle(releases, mitBarcodeSpalten) {\n        var huelle = neu('div', 'mbq-rollbar');\n        var tab = neu('table', 'mbq-liste');\n        var kopf = neu('tr');\n        var spalten = mitBarcodeSpalten\n            ? [T.sp_titel, T.sp_kuenstler, T.sp_datum, T.sp_land, T.sp_label, T.sp_format, T.sp_titelzahl, T.sp_status]\n            : [T.sp_titel, T.sp_datum, T.sp_land, T.sp_status, T.sp_barcode];\n        spalten.forEach(function (s) { kopf.appendChild(neu('th', '', s)); });\n        tab.appendChild(kopf);\n        releases.forEach(function (r) {\n            var tr = neu('tr');\n            var t1 = neu('td');\n            t1.appendChild(verweis(r.url, r.titel || T.ohne_titel));\n            tr.appendChild(t1);\n            if (mitBarcodeSpalten) { tr.appendChild(neu('td', '', r.kuenstler)); }\n            tr.appendChild(neu('td', 'mbq-mono', r.datum || '\u2013'));\n            tr.appendChild(neu('td', '', r.land ? landName(r.land) : '\u2013'));\n            if (mitBarcodeSpalten) {\n                tr.appendChild(neu('td', '', r.labels.length ? r.labels.join(' \/ ') : '\u2013'));\n                tr.appendChild(neu('td', '', r.formate || '\u2013'));\n                tr.appendChild(neu('td', 'mbq-mono', r.titelzahl !== null ? String(r.titelzahl) : '\u2013'));\n                tr.appendChild(neu('td', '', [statusName(r.status), artName(r.art)].filter(Boolean).join(' \u00b7 ') || '\u2013'));\n            } else {\n                tr.appendChild(neu('td', '', statusName(r.status) || '\u2013'));\n                tr.appendChild(neu('td', 'mbq-mono', r.barcode || '\u2013'));\n            }\n            tab.appendChild(tr);\n        });\n        huelle.appendChild(tab);\n        return huelle;\n    }\n    function aufnahmeKarte(a) {\n        var k = neu('div', 'mbq-karte');\n        var titel = neu('div', 'mbq-titel');\n        titel.appendChild(verweis(a.url, a.titel || T.ohne_titel));\n        k.appendChild(titel);\n        var unter = [a.kuenstler, a.zusatz].filter(Boolean).join(' \u00b7 ');\n        if (unter) { k.appendChild(neu('div', 'mbq-unter', unter)); }\n        var werkZelle = '';\n        if (a.werke.length) {\n            werkZelle = neu('span');\n            a.werke.forEach(function (w, i) {\n                if (i) { werkZelle.appendChild(document.createTextNode('; ')); }\n                werkZelle.appendChild(verweis(w.url, w.titel || T.ohne_titel));\n                if (w.iswcs.length) {\n                    werkZelle.appendChild(document.createTextNode(' \u00b7 '));\n                    werkZelle.appendChild(codeVerweise(w.iswcs, 'iswc\/'));\n                }\n            });\n        }\n        k.appendChild(kvTabelle([\n            [T.feld_laenge, dauer(a.laengeMs), 'mbq-mono'],\n            [T.feld_erst, a.erst, 'mbq-mono'],\n            [T.feld_isrcs, a.isrcs.length ? codeVerweise(a.isrcs, 'isrc\/') : ''],\n            [T.feld_werk, werkZelle],\n            [T.feld_video, a.video ? T.ja : '']\n        ]));\n        if (!a.details) {\n            k.appendChild(neu('p', 'mbq-klein', T.ohne_details));\n            return k;\n        }\n        if (a.releases.length) {\n            k.appendChild(neu('div', 'mbq-h2', text(a.releasesGrenze ? 'releases_grenze' : 'releases_anzahl', { n: a.releasesGesamt })));\n            k.appendChild(releaseTabelle(a.releases, false));\n        }\n        return k;\n    }\n    function werkKarte(w) {\n        var k = neu('div', 'mbq-karte');\n        var titel = neu('div', 'mbq-titel');\n        titel.appendChild(verweis(w.url, w.titel || T.ohne_titel));\n        k.appendChild(titel);\n        var unter = [w.typ ? (text('werktyp_' + w.typ) || w.typ.replace(\/_\/g, ' ')) : '', w.zusatz].filter(Boolean).join(' \u00b7 ');\n        if (unter) { k.appendChild(neu('div', 'mbq-unter', unter)); }\n        var urheber = w.urheber.map(function (u) { return u.name + (u.rolle ? ' (' + rolleName(u.rolle) + ')' : ''); }).join('; ');\n        var kennungen = w.kennungen.map(function (x) { return x.typ + ': ' + x.wert; }).join('; ');\n        if (kennungen &#038;&#038; w.kennungenGesamt > w.kennungen.length) {\n            kennungen += ' ' + text('kennungen_mehr', { n: w.kennungenGesamt - w.kennungen.length });\n        }\n        k.appendChild(kvTabelle([\n            [T.feld_iswcs, w.iswcs.length ? codeVerweise(w.iswcs, 'iswc\/') : ''],\n            [T.feld_sprachen, w.sprachen.map(sprachName).join(', ')],\n            [T.feld_urheber, urheber],\n            [T.feld_kennungen, kennungen]\n        ]));\n        return k;\n    }<\/p>\n<p>    function darstellen(b, ziel) {\n        ziel.textContent = '';\n        if (b.fehler) {\n            var txt = null;\n            if (b.fehler === 'code' && b.grund) { txt = text('grund_' + b.grund, { soll: b.soll, n: b.n, anzeige: b.anzeige }); }\n            if (b.fehler === 'zu_viele') { txt = text('fehler_zu_viele', { limit: b.limit !== null ? b.limit : '?' }); }\n            if (b.fehler === 'musicbrainz') { txt = text('fehler_musicbrainz', { status: b.status !== null ? b.status : '?' }); }\n            if (txt === null) { txt = text('fehler_' + b.fehler) || T.fehler_unbekannt; }\n            ziel.appendChild(neu('p', 'mbq-klein mbq-warn', txt));\n            return;\n        }\n        var kopf = neu('div', 'mbq-kopf');\n        kopf.appendChild(neu('span', 'mbq-typ', T['typ_' + b.typ]));\n        kopf.appendChild(neu('span', 'mbq-code', b.anzeige));\n        kopf.appendChild(neu('span', 'mbq-summe', summe(b)));\n        ziel.appendChild(kopf);<\/p>\n<p>        var stand = zeitpunkt(b.stand);\n        if (stand && b.zwischengespeichert) { stand += ' \u00b7 ' + T.aus_speicher; }\n        ziel.appendChild(kvTabelle([\n            [T.zeile_quelle, b.quelle ? verweis(b.quelle, T.link_quelle) : ''],\n            [T.zeile_stand, stand],\n            [T.zeile_limit, b.limitRest !== null ? String(b.limitRest) : '']\n        ]));<\/p>\n<p>        if (b.befunde.length) {\n            ziel.appendChild(neu('div', 'mbq-h', T.h_befunde));\n            STUFEN.forEach(function (s) {\n                b.befunde.forEach(function (f) { if (f.stufe === s) { ziel.appendChild(befundKarte(f)); } });\n            });\n        }\n        if (b.typ === 'isrc' && b.aufnahmen.length) {\n            ziel.appendChild(neu('div', 'mbq-h', T.h_aufnahmen));\n            b.aufnahmen.forEach(function (a) { ziel.appendChild(aufnahmeKarte(a)); });\n        }\n        if (b.typ === 'iswc' && b.werke.length) {\n            ziel.appendChild(neu('div', 'mbq-h', T.h_werke));\n            b.werke.forEach(function (w) { ziel.appendChild(werkKarte(w)); });\n        }\n        if ((b.typ === 'upc' || b.typ === 'ean') && b.releases.length) {\n            ziel.appendChild(neu('div', 'mbq-h', T.h_releases));\n            ziel.appendChild(releaseTabelle(b.releases, true));\n        }\n    }<\/p>\n<p>    function erkanntText(e) {\n        if (e.fehler) {\n            return { klasse: 'mbq-warn', text: text('grund_' + e.fehler, { soll: e.soll, n: e.n, anzeige: e.anzeige }) || T.fehler_unbekannt };\n        }\n        return { klasse: 'mbq-ok', text: text('erkannt_' + e.typ, { anzeige: e.anzeige }) };\n    }<\/p>\n<p>    \/\/ --- reCAPTCHA und Abruf -------------------------------------------------------\n    function skriptLaden() {\n        return new Promise(function (auf) {\n            if (window.grecaptcha) { auf(true); return; }\n            var s = document.createElement('script');\n            s.src = 'https:\/\/www.google.com\/recaptcha\/api.js?render=' + SITEKEY;\n            s.onload = function () { auf(true); };\n            s.onerror = function () { auf(false); };\n            document.head.appendChild(s);\n            setTimeout(function () { auf(!!window.grecaptcha); }, 8000);\n        });\n    }\n    function tokenHolen() {\n        return skriptLaden().then(function (da) {\n            if (!da || !window.grecaptcha || !window.grecaptcha.ready) { return null; }\n            return new Promise(function (auf) {\n                var fertig = false;\n                function einmal(w) { if (!fertig) { fertig = true; auf(w); } }\n                setTimeout(function () { einmal(null); }, 12000);\n                try {\n                    window.grecaptcha.ready(function () {\n                        if (fertig) { return; }\n                        if (!window.grecaptcha.execute) { einmal(null); return; }\n                        window.grecaptcha.execute(SITEKEY, { action: 'mbabfrage' }).then(function (t) { einmal(t || null); }, function () { einmal(null); });\n                    });\n                } catch (e) { einmal(null); }\n            });\n        }, function () { return null; });\n    }\n    function abfragen(code) {\n        return tokenHolen().then(function (token) {\n            return fetch(ENDPUNKT, { method: 'POST', headers: { 'Content-Type': 'application\/json' }, body: JSON.stringify({ code: code, token: token || '' }) })\n                .then(function (r) { return r.json().then(function (j) { return j; }, function () { return { fehler: 'antwort' }; }); }, function () { return { fehler: 'netz' }; });\n        });\n    }<\/p>\n<p>    \/** #code=... oder ?code=... aus der Adresse, etwa vom Code-Pruefer; gefragt wird erst beim Klick. *\/\n    function vorbelegen(suche) {\n        try {\n            var w = new URLSearchParams(String(suche || '').replace(\/^[#?]\/, '')).get('code');\n            return (typeof w === 'string' && w.length <= 80) ? w : null;\n        } catch (e) { return null; }\n    }\n\n    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.MBQ = {\n        T: T, ENDPUNKT: ENDPUNKT, lesen: lesen, bewerten: bewerten, darstellen: darstellen, text: text, dauer: dauer,\n        landName: landName, sprachName: sprachName, rolleName: rolleName, statusName: statusName, vorbelegen: vorbelegen,\n        erkanntText: erkanntText, gs1Pruefziffer: gs1Pruefziffer, iswcPruefziffer: iswcPruefziffer\n    };\n\n    var feld = document.getElementById('mbq-code'), knopf = document.getElementById('mbq-knopf');\n    var erkannt = document.getElementById('mbq-erkannt'), ausgabe = document.getElementById('mbq-ausgabe');\n    if (!feld || !knopf || !erkannt || !ausgabe) { return; }\n\n    function zeigeErkannt() {\n        erkannt.textContent = '';\n        erkannt.className = 'mbq-erkannt';\n        if (feld.value.trim() === '') { return; }\n        var gelesen = lesen(feld.value);\n        \/\/ Waehrend des Tippens keine Meldung fuer ein noch unvollstaendiges Stueck\n        if ((gelesen.fehler === 'unbekannt' || gelesen.fehler === 'laenge') &#038;&#038; feld.value.replace(\/[\\s.\\-_]\/g, '').length < 12) { return; }\n        var e = erkanntText(gelesen);\n        erkannt.className = 'mbq-erkannt ' + e.klasse;\n        erkannt.textContent = e.text;\n    }\n    var warten = null;\n    feld.addEventListener('input', function () { clearTimeout(warten); warten = setTimeout(zeigeErkannt, 250); });\n    feld.addEventListener('keydown', function (ev) { if (ev.key === 'Enter') { ev.preventDefault(); knopf.click(); } });\n    Array.prototype.forEach.call(document.querySelectorAll('#mbq-wurzel .mbq-bsp'), function (b) {\n        b.addEventListener('click', function () { feld.value = b.getAttribute('data-code') || ''; zeigeErkannt(); feld.focus(); });\n    });\n\n    var laeuft = false;\n    knopf.addEventListener('click', function () {\n        if (laeuft) { return; }\n        zeigeErkannt();\n        var e = lesen(feld.value);\n        if (e.fehler) {\n            darstellen(bewerten({ fehler: 'code', grund: e.fehler, soll: e.soll, n: e.n, anzeige: e.anzeige }), ausgabe);\n            return;\n        }\n        laeuft = true;\n        knopf.disabled = true;\n        ausgabe.textContent = '';\n        ausgabe.appendChild(neu('p', 'mbq-klein', T.laeuft));\n        abfragen(e.code).then(function (a) {\n            darstellen(bewerten(a), ausgabe);\n            laeuft = false; knopf.disabled = false;\n        }, function () {\n            darstellen(bewerten({ fehler: 'netz' }), ausgabe);\n            laeuft = false; knopf.disabled = false;\n        });\n    });\n\n    var vor = vorbelegen(window.location.hash) || vorbelegen(window.location.search);\n    if (vor) { feld.value = vor; zeigeErkannt(); }\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Looks up an ISRC, ISWC, UPC or EAN in MusicBrainz: recordings with artist, length, releases and linked work, works with writers and collecting society IDs, releases with label, catalogue number and format, plus notes on codes that are used more than once.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":38,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92901],"class_list":["post-19596","page","type-page","status-publish","hentry","tag-music-production"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>ISRC, ISWC and Barcode Lookup: recordings, works and releases in MusicBrainz - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/isrc-iswc-barcode-lookup-musicbrainz\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ISRC, ISWC and Barcode Lookup: recordings, works and releases in MusicBrainz - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Looks up an ISRC, ISWC, UPC or EAN in MusicBrainz: recordings with artist, length, releases and linked work, works with writers and collecting society IDs, releases with label, catalogue number and format, plus notes on codes that are used more than once.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/isrc-iswc-barcode-lookup-musicbrainz\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-17T14:52:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/isrc-iswc-barcode-lookup-musicbrainz\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/isrc-iswc-barcode-lookup-musicbrainz\\\/\",\"name\":\"ISRC, ISWC and Barcode Lookup: recordings, works and releases in MusicBrainz - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-17T12:21:23+00:00\",\"dateModified\":\"2026-09-17T14:52:06+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/isrc-iswc-barcode-lookup-musicbrainz\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/isrc-iswc-barcode-lookup-musicbrainz\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/isrc-iswc-barcode-lookup-musicbrainz\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"ISRC, ISWC and Barcode Lookup: recordings, works and releases in MusicBrainz\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ISRC, ISWC and Barcode Lookup: recordings, works and releases in MusicBrainz - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/isrc-iswc-barcode-lookup-musicbrainz\/","og_locale":"en_US","og_type":"article","og_title":"ISRC, ISWC and Barcode Lookup: recordings, works and releases in MusicBrainz - Lukas Wojcik - Blog","og_description":"Looks up an ISRC, ISWC, UPC or EAN in MusicBrainz: recordings with artist, length, releases and linked work, works with writers and collecting society IDs, releases with label, catalogue number and format, plus notes on codes that are used more than once.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/isrc-iswc-barcode-lookup-musicbrainz\/","og_site_name":"Lukas Wojcik - Blog","article_modified_time":"2026-09-17T14:52:06+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/isrc-iswc-barcode-lookup-musicbrainz\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/isrc-iswc-barcode-lookup-musicbrainz\/","name":"ISRC, ISWC and Barcode Lookup: recordings, works and releases in MusicBrainz - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-17T12:21:23+00:00","dateModified":"2026-09-17T14:52:06+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/isrc-iswc-barcode-lookup-musicbrainz\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/isrc-iswc-barcode-lookup-musicbrainz\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/isrc-iswc-barcode-lookup-musicbrainz\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/"},{"@type":"ListItem","position":3,"name":"ISRC, ISWC and Barcode Lookup: recordings, works and releases in MusicBrainz"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/19596","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=19596"}],"version-history":[{"count":5,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/19596\/revisions"}],"predecessor-version":[{"id":19886,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/19596\/revisions\/19886"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/38"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=19596"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=19596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}