CINXE.COM
August 2020 – MetaBrainz Blog
<!DOCTYPE html> <html lang="en" class="no-js"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="profile" href="https://gmpg.org/xfn/11"> <script>(function(html){html.className = html.className.replace(/\bno-js\b/,'js')})(document.documentElement);</script> <title>August 2020 – MetaBrainz Blog</title> <meta name='robots' content='max-image-preview:large' /> <meta name="google-site-verification" content="aHsalzSsjEz9L3kesh85sP49ooc2wS4HR-_8_wmoIJg" /> <meta name="msvalidate.01" content="9A2D04F4206FB5DA8B1A5DDDD8772245" /> <!-- Async WordPress.com Remote Login --> <script id="wpcom_remote_login_js"> var wpcom_remote_login_extra_auth = ''; function wpcom_remote_login_remove_dom_node_id( element_id ) { var dom_node = document.getElementById( element_id ); if ( dom_node ) { dom_node.parentNode.removeChild( dom_node ); } } function wpcom_remote_login_remove_dom_node_classes( class_name ) { var dom_nodes = document.querySelectorAll( '.' + class_name ); for ( var i = 0; i < dom_nodes.length; i++ ) { dom_nodes[ i ].parentNode.removeChild( dom_nodes[ i ] ); } } function wpcom_remote_login_final_cleanup() { wpcom_remote_login_remove_dom_node_classes( "wpcom_remote_login_msg" ); wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_key" ); wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_validate" ); wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_js" ); wpcom_remote_login_remove_dom_node_id( "wpcom_request_access_iframe" ); wpcom_remote_login_remove_dom_node_id( "wpcom_request_access_styles" ); } // Watch for messages back from the remote login window.addEventListener( "message", function( e ) { if ( e.origin === "https://r-login.wordpress.com" ) { var data = {}; try { data = JSON.parse( e.data ); } catch( e ) { wpcom_remote_login_final_cleanup(); return; } if ( data.msg === 'LOGIN' ) { // Clean up the login check iframe wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_key" ); var id_regex = new RegExp( /^[0-9]+$/ ); var token_regex = new RegExp( /^.*|.*|.*$/ ); if ( token_regex.test( data.token ) && id_regex.test( data.wpcomid ) ) { // We have everything we need to ask for a login var script = document.createElement( "script" ); script.setAttribute( "id", "wpcom_remote_login_validate" ); script.src = '/remote-login.php?wpcom_remote_login=validate' + '&wpcomid=' + data.wpcomid + '&token=' + encodeURIComponent( data.token ) + '&host=' + window.location.protocol + '//' + window.location.hostname + '&postid=8354' + '&is_singular='; document.body.appendChild( script ); } return; } // Safari ITP, not logged in, so redirect if ( data.msg === 'LOGIN-REDIRECT' ) { window.location = 'https://wordpress.com/log-in?redirect_to=' + window.location.href; return; } // Safari ITP, storage access failed, remove the request if ( data.msg === 'LOGIN-REMOVE' ) { var css_zap = 'html { -webkit-transition: margin-top 1s; transition: margin-top 1s; } /* 9001 */ html { margin-top: 0 !important; } * html body { margin-top: 0 !important; } @media screen and ( max-width: 782px ) { html { margin-top: 0 !important; } * html body { margin-top: 0 !important; } }'; var style_zap = document.createElement( 'style' ); style_zap.type = 'text/css'; style_zap.appendChild( document.createTextNode( css_zap ) ); document.body.appendChild( style_zap ); var e = document.getElementById( 'wpcom_request_access_iframe' ); e.parentNode.removeChild( e ); document.cookie = 'wordpress_com_login_access=denied; path=/; max-age=31536000'; return; } // Safari ITP if ( data.msg === 'REQUEST_ACCESS' ) { console.log( 'request access: safari' ); // Check ITP iframe enable/disable knob if ( wpcom_remote_login_extra_auth !== 'safari_itp_iframe' ) { return; } // If we are in a "private window" there is no ITP. var private_window = false; try { var opendb = window.openDatabase( null, null, null, null ); } catch( e ) { private_window = true; } if ( private_window ) { console.log( 'private window' ); return; } var iframe = document.createElement( 'iframe' ); iframe.id = 'wpcom_request_access_iframe'; iframe.setAttribute( 'scrolling', 'no' ); iframe.setAttribute( 'sandbox', 'allow-storage-access-by-user-activation allow-scripts allow-same-origin allow-top-navigation-by-user-activation' ); iframe.src = 'https://r-login.wordpress.com/remote-login.php?wpcom_remote_login=request_access&origin=' + encodeURIComponent( data.origin ) + '&wpcomid=' + encodeURIComponent( data.wpcomid ); var css = 'html { -webkit-transition: margin-top 1s; transition: margin-top 1s; } /* 9001 */ html { margin-top: 46px !important; } * html body { margin-top: 46px !important; } @media screen and ( max-width: 660px ) { html { margin-top: 71px !important; } * html body { margin-top: 71px !important; } #wpcom_request_access_iframe { display: block; height: 71px !important; } } #wpcom_request_access_iframe { border: 0px; height: 46px; position: fixed; top: 0; left: 0; width: 100%; min-width: 100%; z-index: 99999; background: #23282d; } '; var style = document.createElement( 'style' ); style.type = 'text/css'; style.id = 'wpcom_request_access_styles'; style.appendChild( document.createTextNode( css ) ); document.body.appendChild( style ); document.body.appendChild( iframe ); } if ( data.msg === 'DONE' ) { wpcom_remote_login_final_cleanup(); } } }, false ); // Inject the remote login iframe after the page has had a chance to load // more critical resources window.addEventListener( "DOMContentLoaded", function( e ) { var iframe = document.createElement( "iframe" ); iframe.style.display = "none"; iframe.setAttribute( "scrolling", "no" ); iframe.setAttribute( "id", "wpcom_remote_login_key" ); iframe.src = "https://r-login.wordpress.com/remote-login.php" + "?wpcom_remote_login=key" + "&origin=aHR0cHM6Ly9ibG9nLm1ldGFicmFpbnoub3Jn" + "&wpcomid=1935472" + "&time=1732906325"; document.body.appendChild( iframe ); }, false ); </script> <link rel='dns-prefetch' href='//s2.wp.com' /> <link rel='dns-prefetch' href='//s1.wp.com' /> <link rel='dns-prefetch' href='//s0.wp.com' /> <link rel="alternate" type="application/rss+xml" title="MetaBrainz Blog » Feed" href="https://blog.metabrainz.org/feed/" /> <link rel="alternate" type="application/rss+xml" title="MetaBrainz Blog » Comments Feed" href="https://blog.metabrainz.org/comments/feed/" /> <script type="text/javascript"> /* <![CDATA[ */ function addLoadEvent(func) { var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = func; } else { window.onload = function () { oldonload(); func(); } } } /* ]]> */ </script> <script> window._wpemojiSettings = {"baseUrl":"https:\/\/s0.wp.com\/wp-content\/mu-plugins\/wpcom-smileys\/twemoji\/2\/72x72\/","ext":".png","svgUrl":"https:\/\/s0.wp.com\/wp-content\/mu-plugins\/wpcom-smileys\/twemoji\/2\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/s2.wp.com\/wp-includes\/js\/wp-emoji-release.min.js?m=1719498190i&ver=6.8-alpha-59438"}}; /*! This file is auto-generated */ !function(i,n){var o,s,e;function c(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function p(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data),r=(e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0),new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data));return t.every(function(e,t){return e===r[t]})}function u(e,t,n){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\uddfa\ud83c\uddf3","\ud83c\uddfa\u200b\ud83c\uddf3")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!n(e,"\ud83d\udc26\u200d\u2b1b","\ud83d\udc26\u200b\u2b1b")}return!1}function f(e,t,n){var r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):i.createElement("canvas"),a=r.getContext("2d",{willReadFrequently:!0}),o=(a.textBaseline="top",a.font="600 32px Arial",{});return e.forEach(function(e){o[e]=t(a,e,n)}),o}function t(e){var t=i.createElement("script");t.src=e,t.defer=!0,i.head.appendChild(t)}"undefined"!=typeof Promise&&(o="wpEmojiSettingsSupports",s=["flag","emoji"],n.supports={everything:!0,everythingExceptFlag:!0},e=new Promise(function(e){i.addEventListener("DOMContentLoaded",e,{once:!0})}),new Promise(function(t){var n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"}),a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=function(e){c(n=e.data),a.terminate(),t(n)})}catch(e){}c(n=f(s,u,p))}t(n)}).then(function(e){for(var t in e)n.supports[t]=e[t],n.supports.everything=n.supports.everything&&n.supports[t],"flag"!==t&&(n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&n.supports[t]);n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&!n.supports.flag,n.DOMReady=!1,n.readyCallback=function(){n.DOMReady=!0}}).then(function(){return e}).then(function(){var e;n.supports.everything||(n.readyCallback(),(e=n.source||{}).concatemoji?t(e.concatemoji):e.wpemoji&&e.twemoji&&(t(e.twemoji),t(e.wpemoji)))}))}((window,document),window._wpemojiSettings); </script> <link crossorigin='anonymous' rel='stylesheet' id='all-css-0-1' href='https://s2.wp.com/wp-content/mu-plugins/jetpack-plugin/sun/modules/theme-tools/compat/twentysixteen.css?m=1685115060i&cssminify=yes' type='text/css' media='all' /> <style id='wp-emoji-styles-inline-css'> img.wp-smiley, img.emoji { display: inline !important; border: none !important; box-shadow: none !important; height: 1em !important; width: 1em !important; margin: 0 0.07em !important; vertical-align: -0.1em !important; background: none !important; padding: 0 !important; } </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-2-1' href='https://s1.wp.com/_static/??-eJyljssOwiAQRX/IMrY+0IXxW4BOkEqBzAwa/t7qxsRVE5c3J+fkwrN0LifBJFBi9SEx+LpMi+QXQgiP/qy02oKtIY5gY3b3LgZLhhqwtIjKMW/gv5DccF4T+lgME0oxb920XKXzFMbVX34SZCQkz1/9Ol96vRsOen86DtMLiD1qaA==&cssminify=yes' type='text/css' media='all' /> <style id='wp-block-library-inline-css'> .has-text-align-justify { text-align:justify; } .has-text-align-justify{text-align:justify;} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-4-1' href='https://s2.wp.com/_static/??-eJzTLy/QzcxLzilNSS3WzyrWz01NyUxMzUnNTc0rQeEU5CRWphbp5qSmJyZX6uVm5uklFxfr6OPTDpRD5sM02efaGpoZmFkYGRuZGmQBAHPvL0Y=&cssminify=yes' type='text/css' media='all' /> <style id='jetpack-sharing-buttons-style-inline-css'> .jetpack-sharing-buttons__services-list{display:flex;flex-direction:row;flex-wrap:wrap;gap:0;list-style-type:none;margin:5px;padding:0}.jetpack-sharing-buttons__services-list.has-small-icon-size{font-size:12px}.jetpack-sharing-buttons__services-list.has-normal-icon-size{font-size:16px}.jetpack-sharing-buttons__services-list.has-large-icon-size{font-size:24px}.jetpack-sharing-buttons__services-list.has-huge-icon-size{font-size:36px}@media print{.jetpack-sharing-buttons__services-list{display:none!important}}.editor-styles-wrapper .wp-block-jetpack-sharing-buttons{gap:0;padding-inline-start:0}ul.jetpack-sharing-buttons__services-list.has-background{padding:1.25em 2.375em} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-6-1' href='https://s2.wp.com/wp-content/plugins/coblocks/2.18.1-simple-rev.4/dist/coblocks-style.css?m=1681832297i&cssminify=yes' type='text/css' media='all' /> <style id='classic-theme-styles-inline-css'> /*! This file is auto-generated */ .wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-8-1' href='https://s1.wp.com/_static/??/wp-content/mu-plugins/core-compat/wp-mediaelement.css,/wp-content/mu-plugins/wpcom-bbpress-premium-themes.css?m=1432920480j&cssminify=yes' type='text/css' media='all' /> <style id='global-styles-inline-css'> :root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #fff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--dark-gray: #1a1a1a;--wp--preset--color--medium-gray: #686868;--wp--preset--color--light-gray: #e5e5e5;--wp--preset--color--blue-gray: #4d545c;--wp--preset--color--bright-blue: #007acc;--wp--preset--color--light-blue: #9adffd;--wp--preset--color--dark-brown: #402b30;--wp--preset--color--medium-brown: #774e24;--wp--preset--color--dark-red: #640c1f;--wp--preset--color--bright-red: #ff675f;--wp--preset--color--yellow: #ffef8e;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--font-family--albert-sans: 'Albert Sans', sans-serif;--wp--preset--font-family--alegreya: Alegreya, serif;--wp--preset--font-family--arvo: Arvo, serif;--wp--preset--font-family--bodoni-moda: 'Bodoni Moda', serif;--wp--preset--font-family--bricolage-grotesque: 'Bricolage Grotesque', sans-serif;--wp--preset--font-family--cabin: Cabin, sans-serif;--wp--preset--font-family--chivo: Chivo, sans-serif;--wp--preset--font-family--commissioner: Commissioner, sans-serif;--wp--preset--font-family--cormorant: Cormorant, serif;--wp--preset--font-family--courier-prime: 'Courier Prime', monospace;--wp--preset--font-family--crimson-pro: 'Crimson Pro', serif;--wp--preset--font-family--dm-mono: 'DM Mono', monospace;--wp--preset--font-family--dm-sans: 'DM Sans', sans-serif;--wp--preset--font-family--dm-serif-display: 'DM Serif Display', serif;--wp--preset--font-family--domine: Domine, serif;--wp--preset--font-family--eb-garamond: 'EB Garamond', serif;--wp--preset--font-family--epilogue: Epilogue, sans-serif;--wp--preset--font-family--fahkwang: Fahkwang, sans-serif;--wp--preset--font-family--figtree: Figtree, sans-serif;--wp--preset--font-family--fira-sans: 'Fira Sans', sans-serif;--wp--preset--font-family--fjalla-one: 'Fjalla One', sans-serif;--wp--preset--font-family--fraunces: Fraunces, serif;--wp--preset--font-family--gabarito: Gabarito, system-ui;--wp--preset--font-family--ibm-plex-mono: 'IBM Plex Mono', monospace;--wp--preset--font-family--ibm-plex-sans: 'IBM Plex Sans', sans-serif;--wp--preset--font-family--ibarra-real-nova: 'Ibarra Real Nova', serif;--wp--preset--font-family--instrument-serif: 'Instrument Serif', serif;--wp--preset--font-family--inter: Inter, sans-serif;--wp--preset--font-family--josefin-sans: 'Josefin Sans', sans-serif;--wp--preset--font-family--jost: Jost, sans-serif;--wp--preset--font-family--libre-baskerville: 'Libre Baskerville', serif;--wp--preset--font-family--libre-franklin: 'Libre Franklin', sans-serif;--wp--preset--font-family--literata: Literata, serif;--wp--preset--font-family--lora: Lora, serif;--wp--preset--font-family--merriweather: Merriweather, serif;--wp--preset--font-family--montserrat: Montserrat, sans-serif;--wp--preset--font-family--newsreader: Newsreader, serif;--wp--preset--font-family--noto-sans-mono: 'Noto Sans Mono', sans-serif;--wp--preset--font-family--nunito: Nunito, sans-serif;--wp--preset--font-family--open-sans: 'Open Sans', sans-serif;--wp--preset--font-family--overpass: Overpass, sans-serif;--wp--preset--font-family--pt-serif: 'PT Serif', serif;--wp--preset--font-family--petrona: Petrona, serif;--wp--preset--font-family--piazzolla: Piazzolla, serif;--wp--preset--font-family--playfair-display: 'Playfair Display', serif;--wp--preset--font-family--plus-jakarta-sans: 'Plus Jakarta Sans', sans-serif;--wp--preset--font-family--poppins: Poppins, sans-serif;--wp--preset--font-family--raleway: Raleway, sans-serif;--wp--preset--font-family--roboto: Roboto, sans-serif;--wp--preset--font-family--roboto-slab: 'Roboto Slab', serif;--wp--preset--font-family--rubik: Rubik, sans-serif;--wp--preset--font-family--rufina: Rufina, serif;--wp--preset--font-family--sora: Sora, sans-serif;--wp--preset--font-family--source-sans-3: 'Source Sans 3', sans-serif;--wp--preset--font-family--source-serif-4: 'Source Serif 4', serif;--wp--preset--font-family--space-mono: 'Space Mono', monospace;--wp--preset--font-family--syne: Syne, sans-serif;--wp--preset--font-family--texturina: Texturina, serif;--wp--preset--font-family--urbanist: Urbanist, sans-serif;--wp--preset--font-family--work-sans: 'Work Sans', sans-serif;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}.has-albert-sans-font-family{font-family: var(--wp--preset--font-family--albert-sans) !important;}.has-alegreya-font-family{font-family: var(--wp--preset--font-family--alegreya) !important;}.has-arvo-font-family{font-family: var(--wp--preset--font-family--arvo) !important;}.has-bodoni-moda-font-family{font-family: var(--wp--preset--font-family--bodoni-moda) !important;}.has-bricolage-grotesque-font-family{font-family: var(--wp--preset--font-family--bricolage-grotesque) !important;}.has-cabin-font-family{font-family: var(--wp--preset--font-family--cabin) !important;}.has-chivo-font-family{font-family: var(--wp--preset--font-family--chivo) !important;}.has-commissioner-font-family{font-family: var(--wp--preset--font-family--commissioner) !important;}.has-cormorant-font-family{font-family: var(--wp--preset--font-family--cormorant) !important;}.has-courier-prime-font-family{font-family: var(--wp--preset--font-family--courier-prime) !important;}.has-crimson-pro-font-family{font-family: var(--wp--preset--font-family--crimson-pro) !important;}.has-dm-mono-font-family{font-family: var(--wp--preset--font-family--dm-mono) !important;}.has-dm-sans-font-family{font-family: var(--wp--preset--font-family--dm-sans) !important;}.has-dm-serif-display-font-family{font-family: var(--wp--preset--font-family--dm-serif-display) !important;}.has-domine-font-family{font-family: var(--wp--preset--font-family--domine) !important;}.has-eb-garamond-font-family{font-family: var(--wp--preset--font-family--eb-garamond) !important;}.has-epilogue-font-family{font-family: var(--wp--preset--font-family--epilogue) !important;}.has-fahkwang-font-family{font-family: var(--wp--preset--font-family--fahkwang) !important;}.has-figtree-font-family{font-family: var(--wp--preset--font-family--figtree) !important;}.has-fira-sans-font-family{font-family: var(--wp--preset--font-family--fira-sans) !important;}.has-fjalla-one-font-family{font-family: var(--wp--preset--font-family--fjalla-one) !important;}.has-fraunces-font-family{font-family: var(--wp--preset--font-family--fraunces) !important;}.has-gabarito-font-family{font-family: var(--wp--preset--font-family--gabarito) !important;}.has-ibm-plex-mono-font-family{font-family: var(--wp--preset--font-family--ibm-plex-mono) !important;}.has-ibm-plex-sans-font-family{font-family: var(--wp--preset--font-family--ibm-plex-sans) !important;}.has-ibarra-real-nova-font-family{font-family: var(--wp--preset--font-family--ibarra-real-nova) !important;}.has-instrument-serif-font-family{font-family: var(--wp--preset--font-family--instrument-serif) !important;}.has-inter-font-family{font-family: var(--wp--preset--font-family--inter) !important;}.has-josefin-sans-font-family{font-family: var(--wp--preset--font-family--josefin-sans) !important;}.has-jost-font-family{font-family: var(--wp--preset--font-family--jost) !important;}.has-libre-baskerville-font-family{font-family: var(--wp--preset--font-family--libre-baskerville) !important;}.has-libre-franklin-font-family{font-family: var(--wp--preset--font-family--libre-franklin) !important;}.has-literata-font-family{font-family: var(--wp--preset--font-family--literata) !important;}.has-lora-font-family{font-family: var(--wp--preset--font-family--lora) !important;}.has-merriweather-font-family{font-family: var(--wp--preset--font-family--merriweather) !important;}.has-montserrat-font-family{font-family: var(--wp--preset--font-family--montserrat) !important;}.has-newsreader-font-family{font-family: var(--wp--preset--font-family--newsreader) !important;}.has-noto-sans-mono-font-family{font-family: var(--wp--preset--font-family--noto-sans-mono) !important;}.has-nunito-font-family{font-family: var(--wp--preset--font-family--nunito) !important;}.has-open-sans-font-family{font-family: var(--wp--preset--font-family--open-sans) !important;}.has-overpass-font-family{font-family: var(--wp--preset--font-family--overpass) !important;}.has-pt-serif-font-family{font-family: var(--wp--preset--font-family--pt-serif) !important;}.has-petrona-font-family{font-family: var(--wp--preset--font-family--petrona) !important;}.has-piazzolla-font-family{font-family: var(--wp--preset--font-family--piazzolla) !important;}.has-playfair-display-font-family{font-family: var(--wp--preset--font-family--playfair-display) !important;}.has-plus-jakarta-sans-font-family{font-family: var(--wp--preset--font-family--plus-jakarta-sans) !important;}.has-poppins-font-family{font-family: var(--wp--preset--font-family--poppins) !important;}.has-raleway-font-family{font-family: var(--wp--preset--font-family--raleway) !important;}.has-roboto-font-family{font-family: var(--wp--preset--font-family--roboto) !important;}.has-roboto-slab-font-family{font-family: var(--wp--preset--font-family--roboto-slab) !important;}.has-rubik-font-family{font-family: var(--wp--preset--font-family--rubik) !important;}.has-rufina-font-family{font-family: var(--wp--preset--font-family--rufina) !important;}.has-sora-font-family{font-family: var(--wp--preset--font-family--sora) !important;}.has-source-sans-3-font-family{font-family: var(--wp--preset--font-family--source-sans-3) !important;}.has-source-serif-4-font-family{font-family: var(--wp--preset--font-family--source-serif-4) !important;}.has-space-mono-font-family{font-family: var(--wp--preset--font-family--space-mono) !important;}.has-syne-font-family{font-family: var(--wp--preset--font-family--syne) !important;}.has-texturina-font-family{font-family: var(--wp--preset--font-family--texturina) !important;}.has-urbanist-font-family{font-family: var(--wp--preset--font-family--urbanist) !important;}.has-work-sans-font-family{font-family: var(--wp--preset--font-family--work-sans) !important;} :where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} :root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;} :where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-10-1' href='https://s2.wp.com/_static/??-eJyNjt0KwjAMRl/IGqr4dyE+inQlzm5tVpqUubc3Uy8EFbzL93FyEhiz8QMJkoBcMSFDrg3IqMXE4SaIBBcFGBKWEkZ0ihWTY2WT5l5bJ88cSFU8RCdu6ZkX8CZPdWbaQAwdSna+f2XgSnDWVWiRsIRZ8X38cP58mGWK+D+uIDRx8P3jxCkd7Xa/sXa1Puy6O8ygbnY=&cssminify=yes' type='text/css' media='all' /> <!--[if lt IE 10]> <link rel='stylesheet' id='twentysixteen-ie-css' href='https://s2.wp.com/wp-content/themes/pub/twentysixteen/css/ie.css?m=1448353951i&ver=20170530' media='all' /> <![endif]--> <!--[if lt IE 9]> <link rel='stylesheet' id='twentysixteen-ie8-css' href='https://s2.wp.com/wp-content/themes/pub/twentysixteen/css/ie8.css?m=1493067000i&ver=20170530' media='all' /> <![endif]--> <!--[if lt IE 8]> <link rel='stylesheet' id='twentysixteen-ie7-css' href='https://s2.wp.com/wp-content/themes/pub/twentysixteen/css/ie7.css?m=1448353951i&ver=20170530' media='all' /> <![endif]--> <link crossorigin='anonymous' rel='stylesheet' id='all-css-16-1' href='https://s0.wp.com/_static/??-eJx9y0EOwjAMRNELYUxEK7FBnKWNTAhK7Kh2lPb2pGyADbv5Iz1sBbywERvagzIpljqjtX5sGlcjYvSqqLYlgla85GPvA37BXKGkGiIrLjQnCX2Gt/rkPxRIIImfLAr/BNzTFJed3vLVjW4YT2fnLs8X8DhDqQ==&cssminify=yes' type='text/css' media='all' /> <style id='jetpack-global-styles-frontend-style-inline-css'> :root { --font-headings: unset; --font-base: unset; --font-headings-default: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif; --font-base-default: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-18-1' href='https://s2.wp.com/wp-content/themes/h4/global.css?m=1420737423i&cssminify=yes' type='text/css' media='all' /> <script id="wpcom-actionbar-placeholder-js-extra"> var actionbardata = {"siteID":"1935472","postID":"0","siteURL":"https:\/\/blog.metabrainz.org","xhrURL":"https:\/\/blog.metabrainz.org\/wp-admin\/admin-ajax.php","nonce":"ccf9f61fa5","isLoggedIn":"","statusMessage":"","subsEmailDefault":"instantly","proxyScriptUrl":"https:\/\/s0.wp.com\/wp-content\/js\/wpcom-proxy-request.js?ver=20211021","i18n":{"followedText":"New posts from this site will now appear in your <a href=\"https:\/\/wordpress.com\/read\">Reader<\/a>","foldBar":"Collapse this bar","unfoldBar":"Expand this bar"}}; </script> <script id="jetpack-mu-wpcom-settings-js-before"> var JETPACK_MU_WPCOM_SETTINGS = {"assetsUrl":"https:\/\/s1.wp.com\/wp-content\/mu-plugins\/jetpack-mu-wpcom-plugin\/sun\/vendor\/automattic\/jetpack-mu-wpcom\/src\/build\/"}; </script> <script crossorigin='anonymous' type='text/javascript' src='https://s0.wp.com/_static/??/wp-content/js/rlt-proxy.js,/wp-content/themes/pub/twentysixteen/js/html5.js?m=1720530689j'></script> <script id="rlt-proxy-js-after"> rltInitialize( {"token":null,"iframeOrigins":["https:\/\/widgets.wp.com"]} ); </script> <link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://musicbrainz.wordpress.com/xmlrpc.php?rsd" /> <meta name="generator" content="WordPress.com" /> <!-- Jetpack Open Graph Tags --> <meta property="og:type" content="website" /> <meta property="og:title" content="August 2020 – MetaBrainz Blog" /> <meta property="og:site_name" content="MetaBrainz Blog" /> <meta property="og:image" content="https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=150" /> <meta property="og:image:width" content="200" /> <meta property="og:image:height" content="200" /> <meta property="og:image:alt" content="" /> <meta property="og:locale" content="en_US" /> <meta name="twitter:creator" content="@MusicBrainz" /> <meta name="twitter:site" content="@MusicBrainz" /> <!-- End Jetpack Open Graph Tags --> <link rel='openid.server' href='https://blog.metabrainz.org/?openidserver=1' /> <link rel='openid.delegate' href='https://blog.metabrainz.org/' /> <link rel="search" type="application/opensearchdescription+xml" href="https://blog.metabrainz.org/osd.xml" title="MetaBrainz Blog" /> <link rel="search" type="application/opensearchdescription+xml" href="https://s1.wp.com/opensearch.xml" title="WordPress.com" /> <style>.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style> <style type="text/css"> .recentcomments a { display: inline !important; padding: 0 !important; margin: 0 !important; } table.recentcommentsavatartop img.avatar, table.recentcommentsavatarend img.avatar { border: 0px; margin: 0; } table.recentcommentsavatartop a, table.recentcommentsavatarend a { border: 0px !important; background-color: transparent !important; } td.recentcommentsavatarend, td.recentcommentsavatartop { padding: 0px 0px 1px 0px; margin: 0px; } td.recentcommentstextend { border: none !important; padding: 0px 0px 2px 10px; } .rtl td.recentcommentstextend { padding: 0px 10px 2px 0px; } td.recentcommentstexttop { border: none; padding: 0px 0px 0px 10px; } .rtl td.recentcommentstexttop { padding: 0px 10px 0px 0px; } </style> <meta name="application-name" content="MetaBrainz Blog" /><meta name="msapplication-window" content="width=device-width;height=device-height" /><meta name="msapplication-tooltip" content="MetaBrainz Foundation community blog" /><meta name="description" content="8 posts published by prabalsingh24, Shivam Kapila, ishaanshah, yvanzo, Zas, and phwolfer during August 2020" /> <link rel="icon" href="https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=32" sizes="32x32" /> <link rel="icon" href="https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=150" sizes="192x192" /> <link rel="apple-touch-icon" href="https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=150" /> <meta name="msapplication-TileImage" content="https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=150" /> </head> <body class="archive date wp-embed-responsive customizer-styles-applied group-blog hfeed jetpack-reblog-enabled"> <div id="page" class="site"> <div class="site-inner"> <a class="skip-link screen-reader-text" href="#content"> Skip to content </a> <header id="masthead" class="site-header"> <div class="site-header-main"> <div class="site-branding"> <a href="https://blog.metabrainz.org/" class="site-logo-link" rel="home" itemprop="url"></a> <p class="site-title"><a href="https://blog.metabrainz.org/" rel="home">MetaBrainz Blog</a></p> <p class="site-description">MetaBrainz Foundation community blog</p> </div><!-- .site-branding --> <button id="menu-toggle" class="menu-toggle">Menu</button> <div id="site-header-menu" class="site-header-menu"> <nav id="site-navigation" class="main-navigation" aria-label="Primary Menu"> </nav><!-- .main-navigation --> </div><!-- .site-header-menu --> </div><!-- .site-header-main --> <div class="header-image"> <a href="https://blog.metabrainz.org/" rel="home"> <img src="https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-twitter-banner-1500x500.jpg" srcset="" sizes="" width="1200" height="186" alt="MetaBrainz Blog"> </a> </div><!-- .header-image --> </header><!-- .site-header --> <div id="content" class="site-content"> <div id="primary" class="content-area"> <main id="main" class="site-main"> <header class="page-header"> <h1 class="page-title">Month: <span>August 2020</span></h1> </header><!-- .page-header --> <article id="post-8354" class="post-8354 post type-post status-publish format-standard hentry category-bookbrainz category-summer-of-code tag-bookbrainz tag-google-summer-of-code tag-google-summer-of-code-2020 tag-gsoc tag-gsoc-2020"> <header class="entry-header"> <h2 class="entry-title"><a href="https://blog.metabrainz.org/2020/08/31/gsoc-2020-user-collection-for-bookbrainz/" rel="bookmark">GSoC 2020: User Collection for BookBrainz</a></h2> </header><!-- .entry-header --> <div class="entry-content"> <p>Hi everyone, I am Prabal Singh currently studying in Indian Institute of Technology, Guwahati. This summer I participated in Google Summer of Code and developed a new feature – User Collections – for the project <a href="https://bookbrainz.org/">BookBrainz</a>.</p> <p>I was mentored by <a href="https://github.com/MonkeyDo">Nicolas Pelletier (Mr_Monkey on IRC)</a> during this period. This post summarizes my contributions to the project.</p> <a href="https://blog.metabrainz.org/2020/08/31/gsoc-2020-user-collection-for-bookbrainz/#more-8354" class="more-link">Continue reading<span class="screen-reader-text"> “GSoC 2020: User Collection for BookBrainz”</span></a> </div><!-- .entry-content --> <footer class="entry-footer"> <span class="byline"><span class="author vcard"><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://blog.metabrainz.org/author/prabalsingh24/">prabalsingh24</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://blog.metabrainz.org/2020/08/31/gsoc-2020-user-collection-for-bookbrainz/" rel="bookmark"><time class="entry-date published" datetime="2020-08-31T15:00:21+00:00">August 31, 2020</time><time class="updated" datetime="2020-08-31T13:46:00+00:00">August 31, 2020</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://blog.metabrainz.org/category/bookbrainz/" rel="category tag">BookBrainz</a>, <a href="https://blog.metabrainz.org/category/google-programs/summer-of-code/" rel="category tag">Summer of Code</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://blog.metabrainz.org/tag/bookbrainz/" rel="tag">BookBrainz</a>, <a href="https://blog.metabrainz.org/tag/google-summer-of-code/" rel="tag">Google Summer of Code</a>, <a href="https://blog.metabrainz.org/tag/google-summer-of-code-2020/" rel="tag">Google Summer of Code 2020</a>, <a href="https://blog.metabrainz.org/tag/gsoc/" rel="tag">gsoc</a>, <a href="https://blog.metabrainz.org/tag/gsoc-2020/" rel="tag">GSoC 2020</a></span><span class="comments-link"><a href="https://blog.metabrainz.org/2020/08/31/gsoc-2020-user-collection-for-bookbrainz/#respond">Leave a comment<span class="screen-reader-text"> on GSoC 2020: User Collection for BookBrainz</span></a></span> </footer><!-- .entry-footer --> </article><!-- #post-8354 --> <article id="post-8273" class="post-8273 post type-post status-publish format-standard hentry category-google-programs category-listenbrainz category-summer-of-code tag-google-summer-of-code tag-google-summer-of-code-2020 tag-gsoc tag-gsoc-2020 tag-listenbrainz"> <header class="entry-header"> <h2 class="entry-title"><a href="https://blog.metabrainz.org/2020/08/31/gsoc-2020-manage-your-listens-better-with-listenbrainz/" rel="bookmark">GSoC 2020: Manage your listens better with ListenBrainz</a></h2> </header><!-- .entry-header --> <div class="entry-content"> <p>Hey! My name is <a href="https://github.com/shivam-kapila">Shivam Kapila</a> (shivam-kapila on IRC) and I am a final year undergrad at National Institute of Technology Hamirpur. I have been working on the <a href="https://listenbrainz.org/">ListenBrainz</a> project this Summer as a participant of the <a href="https://summerofcode.withgoogle.com/">Google Summer of Code</a> program. The past four months were full of fun, hacking and loads of music!!</p> <h3 class="wp-block-heading">Landing into the MetaBrainz Community!</h3> <p>My journey with <a href="https://metabrainz.org/">MetaBrainz</a> began in late January this year, when I introduced myself to the community. My first PR <a href="https://github.com/metabrainz/listenbrainz-server/pull/718">improving the developer documentation</a> was by adding parts connected with setting up the Spark infrastructure on a local setup along with consolidating and improving bits of documentation. I delved into real code while implementing front end components for <a href="https://github.com/metabrainz/listenbrainz-server/pull/726">Deleting Listens</a>. Over the next few months, I fixed various bugs like making the <a href="https://github.com/metabrainz/listenbrainz-server/pull/738">Importer Modal</a> responsive, fixing the <a href="https://github.com/metabrainz/listenbrainz-server/pull/762">DB setup scripts</a>, fixing <a href="https://github.com/metabrainz/listenbrainz-server/pull/827">pagination issues</a> while browsing listens, handling <a href="https://github.com/metabrainz/listenbrainz-server/pull/828">stat calculation errors</a> in the Spark Reader and <a href="https://github.com/metabrainz/listenbrainz-server/pull/836">flushing user stats</a> when they delete their listens.</p> <p>As a GSoC applicant, I proposed to add various <a href="https://community.metabrainz.org/t/gsoc-2020-add-love-hate-a-recording-and-delete-a-listen-support-to-listenbrainz/469237?u=shivam-kapila">Listen Management</a> features like love/hate (aka feedback) and deleting individual listens in ListenBrainz. I also proposed a new design for the Listens page. This involved a lot of designing and research, going through UI/UX design guidelines and tuning colors, shades and shadows till we arrived at a presentable and subtle design.</p> <p>And finally I onboarded the GSoC train 🙂 .</p> <h3 class="wp-block-heading">Bonding with the community</h3> <p>I had been a part of the community since January so I was familiar with how things work in ListenBrainz. So I decided to contribute to the <a href="https://blog.metabrainz.org/2020/07/22/listenbrainz-moves-to-timescaledb/">TimescaleDB</a> migration where we moved our primary listen store from InfluxDB to TimescaleDB, opening up a ton of features for us to work on. Here is the <a href="https://github.com/metabrainz/listenbrainz-server/pull/968">final migration PR</a> containing the commits of my contribution.</p> <p>I also contributed to <a href="https://github.com/metabrainz/listenbrainz-server/pull/837">easing the testing</a> infrastructure for devs to test the patches on their local setups. Following this I <a href="https://github.com/metabrainz/listenbrainz-server/pull/861">upgraded the postgres-client</a> to PG12 version when we <a href="https://blog.metabrainz.org/2020/05/04/reminder-upgrading-to-postgresql-12-on-may-18-2020/">migrated to Postgres 12</a>. I also fixed a <a href="https://github.com/metabrainz/listenbrainz-server/pull/850">minor font bug</a> on the profile page.</p> <h3 class="wp-block-heading"><strong>The GSoC journey begins</strong></h3> <h4 class="wp-block-heading">Laying the base</h4> <p>As the official coding period began, I started working on my proposed tasks. The first question was: how to store the feedback? So I began implementing the <a href="https://github.com/metabrainz/listenbrainz-server/pull/865">database changes</a> to store the recording feedback and applying the necessary changes in production. Following this I added a <a href="https://github.com/metabrainz/listenbrainz-server/pull/866">Python module</a> to interact with the database and implemented a Pydantic model to validate the feedback records before they are stored in the database or served over the API. Then I added the necessary <a href="https://github.com/metabrainz/listenbrainz-server/pull/869">APIs to store and fetch the feedback</a> for a given user or recording. This was followed by <a href="https://github.com/metabrainz/listenbrainz-server/pull/883">improving the efficiency</a> of the DB module.</p> <p>I also worked on <a href="https://github.com/metabrainz/listenbrainz-server/pull/918">dumping the recording feedback</a> in the ListenBrainz public dumps. Since ListenBrainz had migrated the stats calculation infrastructure from Google BigQuery to Apache Spark I also removed the <a href="https://github.com/metabrainz/listenbrainz-server/pull/923">BigQuery references</a> from the ListenBrainz website. Now that the <a href="https://blog.metabrainz.org/2020/07/22/listenbrainz-moves-to-timescaledb/">timescale migration</a> work became stable, I began working on <a href="https://github.com/metabrainz/listenbrainz-server/pull/912">Delete a Listen</a> feature.</p> <h4 class="wp-block-heading">Pulling out the front end brushes</h4> <p>Now that the base was ready for us to work on, I started working on the React components so that the feedback and deletion feature could actually be presented on the website. Around the same time, the Timescale release day was also getting near, so I helped with a few tests and finished up the work for deleting listens. The front end components also started looking good and we were ready to associate the back end with them.</p> <h4 class="wp-block-heading">Rectifying & Reactifying</h4> <p>It’s high time and the final phase started. Now that we were ready with a few components we needed some tweaks in some production components to make them subtle. Hence I shot an <a href="https://github.com/metabrainz/listenbrainz-server/pull/1000">improvement PR</a> to tweak some shadows, adjust some fonts, adjust heights of the components, sticking the footer to the bottom, and reactify the loading spinner. Then came the <a href="https://github.com/metabrainz/listenbrainz-server/pull/1030">Listen Count Card</a> denoting the number of listens for a user. Following this we moved to <a href="https://github.com/metabrainz/listenbrainz-server/pull/1030">Card based design</a> for displaying listens.</p> <p>This was followed by the much awaited <a href="https://github.com/metabrainz/listenbrainz-server/pull/1043">feedback controls</a> and now we can love/hate the songs from our listen collection. Isn’t this amazing! There were some needed minor tweaks needed to handle the <a href="https://github.com/metabrainz/listenbrainz-server/pull/1047">‘playing now’ listens</a> correctly. At the same time, following the MetaBrainz guidelines to write quality code, I worked on making the <a href="https://github.com/metabrainz/listenbrainz-server/pull/1045">SQL queries more readable</a>. Then came the much awaited <a href="https://github.com/metabrainz/listenbrainz-server/pull/1049">Delete a Listen</a> feature and now we can finally get rid of the embarrassing listens!!</p> <p>I also addressed some high priority tasks like giving the users an option to download their <a href="https://github.com/metabrainz/listenbrainz-server/pull/1053">submitted feedback as JSON</a>. We noticed some UI glitches and then came three back to back PRs to update <a href="https://github.com/metabrainz/listenbrainz-server/pull/1056">feedback control shades</a>, improving the <a href="https://github.com/metabrainz/listenbrainz-server/pull/1057">listen time text</a> and smoothing up the <a href="https://github.com/metabrainz/listenbrainz-server/pull/1058">deletion animation</a>. This is how the listen list looks like:</p> <figure class="wp-block-image"><img src="https://lh6.googleusercontent.com/gUIioXUJYsxt-qkf-rP1Xfx3KWbT7HEqpppurOPugOkTP8vWUXx1U5BSfT9O94eKUpMsYyySHoeU27up5JQZKyih4sSky3t6PpNTi6Ag1JDsRnb4TXl-rdUrp2AAd1XToPTJL2Qx" alt="List of listens" /></figure> <h4 class="wp-block-heading">What’s next??</h4> <p>Oh, now comes the time when we talk about the current scenario. The tasks currently on my radar are adding <a href="https://github.com/metabrainz/listenbrainz-server/pull/1037">cover art support</a> so that the page looks more alive and <a href="https://github.com/metabrainz/listenbrainz-server/pull/1054">improving the Spotify imports</a> to only import listens that were listened by the user after the latest Spotify listen we have for them.</p> <p>After this I aim to work on the recommendation stuff that’s being actively pursued by the team. Also Mr_Monkey and me had been working on some design concepts for the All New ListenBrainz. I am pretty excited to work on it. <a href="https://community.metabrainz.org/t/the-all-new-listenbrainz/481293/8">Wanna take a sneak peek?</a></p> <h3 class="wp-block-heading">A new fam</h3> <p>The journey with MetaBrainz has been so amazing, that I am so tempted to stick here. I feel ecstatic to be a part of GSoC with the best org 🙂 . The best part is – it’s never all about code. There’s a lot to gain. Each day marked gaining maturity and thinking more and more like a real developer. I started feeling at ease with the <em>communicate → code → integrate chain</em>. It really feels fortunate to be a part of the MetaBrainz family where everyone is a ping away ❤ .</p> <p>GSoC marks the kickstart of my journey with MetaBrainz and I will be here lurking on IRC, shooting PRs to make the projects more and more awesome.</p> <h3 class="wp-block-heading">Heartiest Gratitude</h3> <ul class="wp-block-list"><li><a href="https://github.com/mayhem">Robert Kaye</a> (ruaok) for being a mentor and a companion, guiding me through the dev life and real life.</li><li><a href="https://github.com/paramsingh">Param Singh</a> (iliekcomputers) for always keeping the spirits high.</li><li><a href="https://github.com/monkeydo">Nicolas Pelletier</a> (Mr_Monkey) for guarding me against Cascading Snot Swab issues.</li><li><a href="https://github.com/alastair">Alastair Porter</a> (alastairp) for fishing out the best practices from his pool of intelligence.</li><li><a href="https://github.com/vansika">Vansika Pareek</a> (pristine___) for some awesome playlists.</li><li><a href="https://github.com/freso">Frederik “Freso” S. Olesen</a> (Freso) & <a href="https://musicbrainz.org/user/CatCat">C. “CatCat” Holm</a> (CatQuest) for the best end user perspectives and reviews.</li><li><a href="http://summerofcode.withgoogle.com/">GSoC</a> & <a href="https://metabrainz.org/">MetaBrainz</a> for such a wonderful experience.</li></ul> </div><!-- .entry-content --> <footer class="entry-footer"> <span class="byline"><span class="author vcard"><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://blog.metabrainz.org/author/shivamkapila/">Shivam Kapila</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://blog.metabrainz.org/2020/08/31/gsoc-2020-manage-your-listens-better-with-listenbrainz/" rel="bookmark"><time class="entry-date published" datetime="2020-08-31T09:00:18+00:00">August 31, 2020</time><time class="updated" datetime="2020-08-31T09:03:37+00:00">August 31, 2020</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://blog.metabrainz.org/category/google-programs/" rel="category tag">Google Programs</a>, <a href="https://blog.metabrainz.org/category/listenbrainz/" rel="category tag">ListenBrainz</a>, <a href="https://blog.metabrainz.org/category/google-programs/summer-of-code/" rel="category tag">Summer of Code</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://blog.metabrainz.org/tag/google-summer-of-code/" rel="tag">Google Summer of Code</a>, <a href="https://blog.metabrainz.org/tag/google-summer-of-code-2020/" rel="tag">Google Summer of Code 2020</a>, <a href="https://blog.metabrainz.org/tag/gsoc/" rel="tag">gsoc</a>, <a href="https://blog.metabrainz.org/tag/gsoc-2020/" rel="tag">GSoC 2020</a>, <a href="https://blog.metabrainz.org/tag/listenbrainz/" rel="tag">ListenBrainz</a></span><span class="comments-link"><a href="https://blog.metabrainz.org/2020/08/31/gsoc-2020-manage-your-listens-better-with-listenbrainz/#respond">Leave a comment<span class="screen-reader-text"> on GSoC 2020: Manage your listens better with ListenBrainz</span></a></span> </footer><!-- .entry-footer --> </article><!-- #post-8273 --> <article id="post-8228" class="post-8228 post type-post status-publish format-standard hentry category-listenbrainz category-summer-of-code tag-google-summer-of-code tag-google-summer-of-code-2020 tag-gsoc tag-listenbrainz"> <header class="entry-header"> <h2 class="entry-title"><a href="https://blog.metabrainz.org/2020/08/30/gsoc-2020-adding-statistics-and-graphs-for-listenbrainz-users-and-community/" rel="bookmark">GSoC 2020: Adding Statistics and Graphs for ListenBrainz Users and Community</a></h2> </header><!-- .entry-header --> <div class="entry-content"> <p>Hey everyone! I am <a href="https://www.github.com/ishaanshah">Ishaan Shah</a> (ishaanshah), a sophomore at International Institute of Information Technology – Hyderabad, India. This summer, I worked on <a href="https://listenbrainz.org/">ListenBrainz</a> as a participant in <a href="https://summerofcode.withgoogle.com/">Google Summer of Code ’20</a>. My project involved generating statistics and visualisations for users using Apache Spark. This blog is an overview about the work I did and my experience working with ListenBrainz.</p> <p>I started contributing to ListenBrainz in January 2020. My first PR was for <a href="https://tickets.metabrainz.org/projects/LB/issues/LB-179">LB-179</a>, a small Quality of Life improvement to the LastFM importer. My first major contribution was porting the LastFM importer to ReactJS. Over the next two months, I continued working on the frontend, where I mainly worked on improving the frontend infrastructure by adding support for <a href="https://github.com/metabrainz/listenbrainz-server/pull/739">automated testing</a>, porting the codebase to <a href="https://github.com/metabrainz/listenbrainz-server/pull/776">TypeScript</a> and standardising the frontend code using <a href="https://github.com/metabrainz/listenbrainz-server/pull/778">ESLint and Prettier</a>.</p> <p>After making a few patches, I understood how ListenBrainz worked and got comfortable with the codebase. I decided to make a proposal for adding statistics to ListenBrainz using Apache Spark. While writing the <a href="https://community.metabrainz.org/t/gsoc-2020-adding-statistics-and-graphs-for-listenbrainz-users-and-community/468540">proposal</a>, I referred to many other websites, blogs, as well as community discussions for different ideas about statistics which could be added. After some research, I narrowed down on the specific graphs and statistics that I wanted to calculate during GSoC.</p> <h3>Community Bonding Period</h3> <p>Since I had been working with the MetaBrainz community since January, I was familiar with how things worked in the community. So we decided to use the Community Bonding Period for fixing and updating the Top Artists charts for a user. The first task that I took up was to add an API endpoint for fetching the Top Artists data for a user programmatically. Until then, I had mostly spent my time working on the frontend, this task helped me in getting familiar with the backend architecture. Next, I worked on porting the Top Artist graph from <a href="https://d3js.org/">d3</a> to <a href="https://nivo.rocks/">nivo</a> – a charting library built with <a href="https://reactjs.org/">ReactJS</a> and d3. The Top Artists graph only supported All Time statistics before. I worked on adding support for more time ranges. This was the first time I worked with Apache Spark and the <a href="https://github.com/metabrainz/listenbrainz-server/pull/856"><abbr title="Pull Request">PR</abbr> for this</a> took quite some time, but it was essential that we got it right as most of the statistics we built further would use a similar workflow. After we were satisfied with the overall flow of the data from our Spark cluster to the web server, I started working on showing the stats for different time ranges on the website. Although this task seemed easy at first, it took much longer than expected. We encountered some bugs and received some user feedback when we deployed the graph to production. The rest of this period was spent on incorporating the user feedback and fixing the bugs.</p> <div class="wp-block-image"> <figure class="aligncenter size-large is-resized"><img data-attachment-id="8243" data-permalink="https://blog.metabrainz.org/rsz_1rsz_2020-08-29-135549_1905x984_scrot/" data-orig-file="https://blog.metabrainz.org/wp-content/uploads/2020/08/rsz_1rsz_2020-08-29-135549_1905x984_scrot.png" data-orig-size="1877,898" data-comments-opened="1" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="rsz_1rsz_2020-08-29-135549_1905x984_scrot" data-image-description="" data-image-caption="" data-medium-file="https://blog.metabrainz.org/wp-content/uploads/2020/08/rsz_1rsz_2020-08-29-135549_1905x984_scrot.png?w=300" data-large-file="https://blog.metabrainz.org/wp-content/uploads/2020/08/rsz_1rsz_2020-08-29-135549_1905x984_scrot.png?w=1877" class="wp-image-8243" src="https://blog.metabrainz.org/wp-content/uploads/2020/08/rsz_1rsz_2020-08-29-135549_1905x984_scrot.png?w=1877" alt="Top Artist shown on the Charts page" width="628" height="300" srcset="https://blog.metabrainz.org/wp-content/uploads/2020/08/rsz_1rsz_2020-08-29-135549_1905x984_scrot.png?w=628 628w, https://blog.metabrainz.org/wp-content/uploads/2020/08/rsz_1rsz_2020-08-29-135549_1905x984_scrot.png?w=1254 1254w, https://blog.metabrainz.org/wp-content/uploads/2020/08/rsz_1rsz_2020-08-29-135549_1905x984_scrot.png?w=128 128w, https://blog.metabrainz.org/wp-content/uploads/2020/08/rsz_1rsz_2020-08-29-135549_1905x984_scrot.png?w=300 300w, https://blog.metabrainz.org/wp-content/uploads/2020/08/rsz_1rsz_2020-08-29-135549_1905x984_scrot.png?w=768 768w, https://blog.metabrainz.org/wp-content/uploads/2020/08/rsz_1rsz_2020-08-29-135549_1905x984_scrot.png?w=1024 1024w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /> <figcaption>Top Artists</figcaption> </figure> </div> <h3>First Coding Period</h3> <p>We now had a somewhat stable pipeline for calculating the stats and sending them to the server. I started working on the backend for Top Releases stats for a user. We ran into memory issues when calculating these stats on the cluster, so I spent some time finding the cause of the issue and realised that we were collecting the results all at once which was causing the driver to run out of memory. I fixed this by collecting the results for each user separately and tweaking some RabbitMQ parameters to make sure that messages aren’t dropped while sending them to the server (<a href="https://github.com/metabrainz/listenbrainz-server/pull/897"><abbr title="Pull Request">PR</abbr> #897</a>). After this, I added Top Recordings for a user. Now we had a brand new <a href="https://listenbrainz.org/user/ishaanshah/charts?page=1&range=all_time&entity=artist">Charts page</a> that displayed the user’s Top Artists/Releases/Recordings for different time ranges. Next I started working on temporal statistics for a user i.e, number of listens in a past time range. The <a href="https://github.com/metabrainz/listenbrainz-server/commit/b06d63764a7c12088dee95b6166e3abab75c5f01#diff-91aa3459caf2af49942256cc434174acR43">query that I wrote for calculating this data</a> turned out to be pretty inefficient for larger datasets. So I ended up writing two versions of the same query: one for large datasets and one for smaller ones. While working on displaying these stats on the frontend, I tried various representations of the data. I finally settled on displaying the data as bar graphs, as shown <a href="https://listenbrainz.org/user/ishaanshah/reports?range=week#listening-activity">on this report view</a>.</p> <div class="wp-block-image"> <figure class="aligncenter size-large is-resized"><img data-attachment-id="8234" data-permalink="https://blog.metabrainz.org/2020-08-27-221344_1145x480_scrot/" data-orig-file="https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-27-221344_1145x480_scrot.png" data-orig-size="1145,480" data-comments-opened="1" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="2020-08-27-221344_1145x480_scrot" data-image-description="" data-image-caption="" data-medium-file="https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-27-221344_1145x480_scrot.png?w=300" data-large-file="https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-27-221344_1145x480_scrot.png?w=1145" class="wp-image-8234" src="https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-27-221344_1145x480_scrot.png?w=1145" alt="Listening Activity shown on Reports page" width="628" height="263" srcset="https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-27-221344_1145x480_scrot.png?w=628 628w, https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-27-221344_1145x480_scrot.png?w=128 128w, https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-27-221344_1145x480_scrot.png?w=300 300w, https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-27-221344_1145x480_scrot.png?w=768 768w, https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-27-221344_1145x480_scrot.png?w=1024 1024w, https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-27-221344_1145x480_scrot.png 1145w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /> <figcaption>Listening Activity</figcaption> </figure> </div> <h3>Second Coding Period</h3> <p>I added two more graphs in this period: <a href="https://listenbrainz.org/user/ishaanshah/reports?range=week#daily-activity">Daily Activity</a> and <a href="https://listenbrainz.org/user/ishaanshah/reports?range=week#artist-origin">Artist Origins</a>. The Daily Activity graph shows the number of listens a user has at a particular time of the day. I implemented the <a href="https://github.com/metabrainz/listenbrainz-server/pull/966/files#diff-505daa520513bcb6722d6aadaadf53a4R43">query for calculating this data in a slightly different way</a> compared to the Listening Activity query. This change improved the query speed significantly. I had some trouble finding a correct way to represent this data. My mentor helped me in this by suggesting the usage of a Heatmap, and the results turned out to be pretty good.</p> <div class="wp-block-image"> <figure class="aligncenter size-large is-resized"><img data-attachment-id="8250" data-permalink="https://blog.metabrainz.org/2020-08-28-193236_1190x482_scrot/" data-orig-file="https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-28-193236_1190x482_scrot.png" data-orig-size="1161,473" data-comments-opened="1" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="2020-08-28-193236_1190x482_scrot" data-image-description="" data-image-caption="" data-medium-file="https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-28-193236_1190x482_scrot.png?w=300" data-large-file="https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-28-193236_1190x482_scrot.png?w=1161" class="wp-image-8250" src="https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-28-193236_1190x482_scrot.png" alt="Daily Activity shown on Reports page" width="628" height="255" srcset="https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-28-193236_1190x482_scrot.png?w=626&h=255 626w, https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-28-193236_1190x482_scrot.png?w=128&h=52 128w, https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-28-193236_1190x482_scrot.png?w=300&h=122 300w, https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-28-193236_1190x482_scrot.png?w=768&h=313 768w, https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-28-193236_1190x482_scrot.png?w=1024&h=417 1024w, https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-28-193236_1190x482_scrot.png 1161w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /> <figcaption>Daily Activity</figcaption> </figure> </div> <p>Next, we worked on the Artist Origins graph, which provides an insight into the geographical diversity of a user’s musical taste. I had a lot of help from the ListenBrainz team for this graph and I couldn’t have done this graph without their help. This was by far the most interesting stat that I worked on during the project. Furthermore it laid a general framework to calculate statistics using the data from <a href="https://musicbrainz.org/">MusicBrainz</a>. After deploying this map on production, we received feedback from the users that the map looked plain for most of them and there wasn’t much colour difference between different regions. This happened because people generally tend to listen more songs from their home country, so there is a huge difference between the country with maximum artists and average number artists from other countries. We fixed this issue by changing the colour scale from linear to logarithmic.</p> <figure class="wp-block-image size-large"><img data-attachment-id="8255" data-permalink="https://blog.metabrainz.org/artist-origin-feedback-1/" data-orig-file="https://blog.metabrainz.org/wp-content/uploads/2020/08/artist-origin-feedback-1.png" data-orig-size="839,465" data-comments-opened="1" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="artist-origin-feedback" data-image-description="" data-image-caption="" data-medium-file="https://blog.metabrainz.org/wp-content/uploads/2020/08/artist-origin-feedback-1.png?w=300" data-large-file="https://blog.metabrainz.org/wp-content/uploads/2020/08/artist-origin-feedback-1.png?w=839" loading="lazy" width="839" height="465" class="wp-image-8255" src="https://blog.metabrainz.org/wp-content/uploads/2020/08/artist-origin-feedback-1.png" alt="Comparison between linear and log scale in Artist Origins Map" srcset="https://blog.metabrainz.org/wp-content/uploads/2020/08/artist-origin-feedback-1.png 839w, https://blog.metabrainz.org/wp-content/uploads/2020/08/artist-origin-feedback-1.png?w=128&h=71 128w, https://blog.metabrainz.org/wp-content/uploads/2020/08/artist-origin-feedback-1.png?w=300&h=166 300w, https://blog.metabrainz.org/wp-content/uploads/2020/08/artist-origin-feedback-1.png?w=768&h=426 768w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /></figure> <h3>Final Coding Period</h3> <p>We now turned our attention towards calculating some stats for the whole website. We decided to make a graph for the Top Artists over different time ranges. We thought that this would be relatively easy given that we had already done something similar for individual users before. However we hit an unexpected bump; the data we were calculating was not accurate, mainly because of various different sources of the artists and some minor changes in the artists’ name or metadata resulted in a different entry with a different listen count for the same artist. Moreover, we found a couple of users spamming our website for self promotion and we did not have a solid way to deal with this. Around this time, my college resumed and the amount of time I could dedicate to LB reduced severely. So we decided to use the remaining time to work on improving the frequency at which stats are updated. I have an <a href="https://github.com/metabrainz/listenbrainz-server/pull/1052">open PR (#1052)</a> for doing this at the time of me writing this blog and we should be able to implement this functionality in the near future.</p> <div class="wp-block-image"> <figure class="aligncenter size-large is-resized"><img data-attachment-id="8258" data-permalink="https://blog.metabrainz.org/2020-08-27-221912_1151x651_scrot/" data-orig-file="https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-27-221912_1151x651_scrot.png" data-orig-size="1151,651" data-comments-opened="1" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="2020-08-27-221912_1151x651_scrot" data-image-description="" data-image-caption="" data-medium-file="https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-27-221912_1151x651_scrot.png?w=300" data-large-file="https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-27-221912_1151x651_scrot.png?w=1151" loading="lazy" class="wp-image-8258" src="https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-27-221912_1151x651_scrot.png?w=1151" alt="Artist Origins shown on reports page" width="629" height="355" srcset="https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-27-221912_1151x651_scrot.png?w=629 629w, https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-27-221912_1151x651_scrot.png?w=128 128w, https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-27-221912_1151x651_scrot.png?w=300 300w, https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-27-221912_1151x651_scrot.png?w=768 768w, https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-27-221912_1151x651_scrot.png?w=1024 1024w, https://blog.metabrainz.org/wp-content/uploads/2020/08/2020-08-27-221912_1151x651_scrot.png 1151w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /> <figcaption>Artist Origins</figcaption> </figure> </div> <h3>Experience</h3> <p>The past 4 months have taught me a lot of things. I learnt new technical concepts everyday. I started writing code as a developer rather than a programmer. I understood the importance of proper unit and integration testing (even though it was my least favourite part while adding a new functionality). I also found it much easier to talk and interact with people both online and in real life. Frequent deployments of new features to production helped us a lot. We were able to catch bugs when we still had some context over the code written and also received feedback from the users about how we could improve the new features added. It also kept me motivated to keep working on new graphs and statistics and gave me a sense of satisfaction when I saw them on the production server. I also learnt that things don’t always go the way we expect them to. More often than not, you will run into some bumps while adding new features so it is better to keep some extra time to deal with these issues.</p> <p>GSoC gave me a wonderful opportunity to work with some amazing people from all over the globe. I was not able to complete all the graphs that I had planned for this summer, but I do plan to continue working on ListenBrainz to add more statistics and new features.</p> <h3>Special Thanks</h3> <ul class="wp-block-list" id="block-7bbace3d-d5ac-45e0-acc5-d4d47d16a218"> <li><a href="https://github.com/paramsingh">Param Singh</a> (iliekcomputers) for being an amazing mentor and helping me whenever I was stuck on an issue.</li> <li><a href="https://github.com/mayhem">Robert Kaye</a> (ruaok) for providing some really insightful feedback and the MusicBrainz data that was required for calculating the Artist Origin map.</li> <li><a href="https://github.com/monkeydo">Nicolas Pelletier</a> (Mr_Monkey) for helping me with the frontend for the user Charts page and providing some amazing tips for ReactJS.</li> </ul> </div><!-- .entry-content --> <footer class="entry-footer"> <span class="byline"><span class="author vcard"><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://blog.metabrainz.org/author/ishaannshah/">ishaanshah</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://blog.metabrainz.org/2020/08/30/gsoc-2020-adding-statistics-and-graphs-for-listenbrainz-users-and-community/" rel="bookmark"><time class="entry-date published" datetime="2020-08-30T11:00:10+00:00">August 30, 2020</time><time class="updated" datetime="2020-08-30T10:01:46+00:00">August 30, 2020</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://blog.metabrainz.org/category/listenbrainz/" rel="category tag">ListenBrainz</a>, <a href="https://blog.metabrainz.org/category/google-programs/summer-of-code/" rel="category tag">Summer of Code</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://blog.metabrainz.org/tag/google-summer-of-code/" rel="tag">Google Summer of Code</a>, <a href="https://blog.metabrainz.org/tag/google-summer-of-code-2020/" rel="tag">Google Summer of Code 2020</a>, <a href="https://blog.metabrainz.org/tag/gsoc/" rel="tag">gsoc</a>, <a href="https://blog.metabrainz.org/tag/listenbrainz/" rel="tag">ListenBrainz</a></span><span class="comments-link"><a href="https://blog.metabrainz.org/2020/08/30/gsoc-2020-adding-statistics-and-graphs-for-listenbrainz-users-and-community/#comments">3 Comments<span class="screen-reader-text"> on GSoC 2020: Adding Statistics and Graphs for ListenBrainz Users and Community</span></a></span> </footer><!-- .entry-footer --> </article><!-- #post-8228 --> <article id="post-8207" class="post-8207 post type-post status-publish format-standard hentry category-development category-musicbrainz category-server category-updates category-virtual-machine tag-changelog tag-musicbrainz"> <header class="entry-header"> <h2 class="entry-title"><a href="https://blog.metabrainz.org/2020/08/24/musicbrainz-server-update-2020-08-24/" rel="bookmark">MusicBrainz Server update, 2020-08-24</a></h2> </header><!-- .entry-header --> <div class="entry-content"> <p>The summer heat is still with us, and also hot out of the oven is a new MusicBrainz server update! This time we have a fair amount of fixes for the “Set cover art” page (which allows you to select a specific cover art from releases to represent a release group). Some other improvements have been made, some small bugs fixed, and the conversion to React marches on firmly.</p> <p>A recent change had standardized all edit listings to 100 edits per page (it used to be 25 in some places and 100 in others before that). We’re lowering that to 50 with this update to try and make the edit lists a bit less overwhelming but still not too short that related edits get split over too many pages. Do let us know whether it feels better!</p> <p>Finally, we disabled URLs marked as ended (since they are often squatted and full of ads) and URLs from domains reported as (hopefully temporarily) compromised. You can still copy the URL itself if you want to check it through the <a href="http://web.archive.org/">Wayback Machine</a> to try and find out what is/was there!</p> <p>A new release of MusicBrainz Docker is also available that matches this update of MusicBrainz Server. See the <a href="https://github.com/metabrainz/musicbrainz-docker/releases/tag/v-2020-08-24">release notes</a> for update instructions.</p> <p>Thanks to jesus2099 for contributing code. Thanks to bsammon, hibiscuskazeneko, lotheric, mrclon, murdos, nikki, sothotalker, tigerman325, tularion, and yindesu for having reported bugs and suggested improvements. Thanks to Besnik and salorock for updating the translations. And thanks to all others who tested the <a href="https://beta.musicbrainz.org/">beta version</a>!</p> <p>The git tag is <code><a href="https://github.com/metabrainz/musicbrainz-server/releases/tag/v-2020-08-24">v-2020-08-24</a></code>.</p> <h2 class="wp-block-heading">Bug</h2> <ul class="wp-block-list"><li>[<a href="https://tickets.metabrainz.org/browse/MBS-5611">MBS-5611</a>] – Not all releases are shown when selecting release group cover art</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-5612">MBS-5612</a>] – Set cover art for release group page displays releases in a random order</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-7793">MBS-7793</a>] – Set release group cover art page fails to display as a grid</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-8016">MBS-8016</a>] – Dates and countries are missing from the set cover art page</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-9420">MBS-9420</a>] – “Found in X user collections” displays incorrectly from “Split into separate artists” screen</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10721">MBS-10721</a>] – Editing AC for track without a title entered shows [removed]</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10901">MBS-10901</a>] – undef error – TypeError: Cannot read property ‘linkTypeID’ of undefined</li></ul> <h2 class="wp-block-heading">Improvement</h2> <ul class="wp-block-list"><li>[<a href="https://tickets.metabrainz.org/browse/MBS-5588">MBS-5588</a>] – Make release box clickable without button to select release-group front cover</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-8356">MBS-8356</a>] – Show barcode on set RG cover art page</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10376">MBS-10376</a>] – Indicate current image on RG Set cover art page</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10377">MBS-10377</a>] – Label fields clearly on Set cover art page</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10948">MBS-10948</a>] – Allow Baidu Baike links for Labels</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10992">MBS-10992</a>] – Skip creating hyperlink for “ended” URL relationship</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10998">MBS-10998</a>] – Update the WhoSampled logo used in the sidebar</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-11004">MBS-11004</a>] – Allow “La Boîte aux paroles” links for labels</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-11012">MBS-11012</a>] – Update the Kickstarter logo used in the sidebar</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-11025">MBS-11025</a>] – Update the SoundCloud logo used in the sidebar</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-11049">MBS-11049</a>] – Disable external links to websites reported as compromised</li></ul> <h2 class="wp-block-heading">React Conversion Task</h2> <ul class="wp-block-list"><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10965">MBS-10965</a>] – Convert Add Disc ID edit to React</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10984">MBS-10984</a>] – Convert Move Disc ID edit to React</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10985">MBS-10985</a>] – Convert Remove Disc ID edit to React</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10994">MBS-10994</a>] – Convert user/message.tt to React</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-11020">MBS-11020</a>] – Convert historic Add Release Annotation edit to React</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-11021">MBS-11021</a>] – Convert historic Add Track edits to React</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-11022">MBS-11022</a>] – Convert historic Add Release edit to React</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-11028">MBS-11028</a>] – Convert historic Edit Release Language edit to React</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-11029">MBS-11029</a>] – Convert historic Edit Release Name edit to React</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-11030">MBS-11030</a>] – Convert historic Edit Release Attributes edit to React</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-11031">MBS-11031</a>] – Convert historic Edit Track edit to React</li></ul> <h2 class="wp-block-heading">Other Task</h2> <ul class="wp-block-list"><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10990">MBS-10990</a>] – Limit edit displays to 50 edits per page</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-11005">MBS-11005</a>] – Add Kosovo flag for list of release countries</li></ul> </div><!-- .entry-content --> <footer class="entry-footer"> <span class="byline"><span class="author vcard"><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://blog.metabrainz.org/author/yvanzo/">yvanzo</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://blog.metabrainz.org/2020/08/24/musicbrainz-server-update-2020-08-24/" rel="bookmark"><time class="entry-date published updated" datetime="2020-08-24T21:38:06+00:00">August 24, 2020</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://blog.metabrainz.org/category/development/" rel="category tag">Development</a>, <a href="https://blog.metabrainz.org/category/musicbrainz/" rel="category tag">MusicBrainz</a>, <a href="https://blog.metabrainz.org/category/development/server/" rel="category tag">Server</a>, <a href="https://blog.metabrainz.org/category/development/updates/" rel="category tag">Updates</a>, <a href="https://blog.metabrainz.org/category/development/virtual-machine/" rel="category tag">Virtual Machine</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://blog.metabrainz.org/tag/changelog/" rel="tag">changelog</a>, <a href="https://blog.metabrainz.org/tag/musicbrainz/" rel="tag">MusicBrainz</a></span><span class="comments-link"><a href="https://blog.metabrainz.org/2020/08/24/musicbrainz-server-update-2020-08-24/#respond">Leave a comment<span class="screen-reader-text"> on MusicBrainz Server update, 2020-08-24</span></a></span> </footer><!-- .entry-footer --> </article><!-- #post-8207 --> <article id="post-8212" class="post-8212 post type-post status-publish format-standard hentry category-picard tag-changelog tag-download tag-picard tag-release"> <header class="entry-header"> <h2 class="entry-title"><a href="https://blog.metabrainz.org/2020/08/18/picard-2-4-2-released/" rel="bookmark">Picard 2.4.2 released</a></h2> </header><!-- .entry-header --> <div class="entry-content"> <p>This release includes even more fixes to previous 2.4.x releases.<br />It fixes some annoying bugs and improves overall usability.<br />Documentation links inside the application were updated to point to picard-docs.musicbrainz.org (thanks to the great work rdswift did).<br /><br />For a full list of changes since Picard 2.3.2 see our <a href="https://blog.metabrainz.org/2020/08/10/picard-2-4-released/">release announcements for Picard 2.4</a> and <a href="https://blog.metabrainz.org/2020/08/11/picard-2-4-1-fixes-start-issues-on-windows-7-and-8/">Picard 2.4.1.</a></p> <p>Changes in the 2.4.2 point release:</p> <h3>Bug fixes</h3> <ul> <li>[<a href="https://tickets.metabrainz.org/browse/PICARD-1909">PICARD-1909</a>] – No refresh of metadata on “Use Original Value” or remove tags</li> <li>[<a href="https://tickets.metabrainz.org/browse/PICARD-1911">PICARD-1911</a>] – Removing tags does not update list views</li> <li>[<a href="https://tickets.metabrainz.org/browse/PICARD-1913">PICARD-1913</a>] – Changing tags of a track without matched files changes original metadata</li> <li>[<a href="https://tickets.metabrainz.org/browse/PICARD-1914">PICARD-1914</a>] – Editing track metadata edits data of previously linked file</li> <li>[<a href="https://tickets.metabrainz.org/browse/PICARD-1915">PICARD-1915</a>] – An album selected during loading should update the metadata view when loading has finished</li> <li>[<a href="https://tickets.metabrainz.org/browse/PICARD-1916">PICARD-1916</a>] – Picard crashes on older releases of macOS due to theming exception</li> </ul> <h3>Improvements</h3> <ul> <li>[<a href="https://tickets.metabrainz.org/browse/PICARD-1860">PICARD-1860</a>] – New added tag should open field to enter value automatically</li> <li>[<a href="https://tickets.metabrainz.org/browse/PICARD-1899">PICARD-1899</a>] – Update help links to go to <a href="http://picard-docs.musicbrainz.org" rel="nofollow">http://picard-docs.musicbrainz.org</a></li> <li>[<a href="https://tickets.metabrainz.org/browse/PICARD-1920">PICARD-1920</a>] – Open documentation in options dialog using the platform’s help shortcut (e.g. F1 on Windows or Ctrl+? on macOS)</li> </ul> <p> </p> <p>Thanks a lot to all contributors who made this release possible.</p> </div><!-- .entry-content --> <footer class="entry-footer"> <span class="byline"><span class="author vcard"><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://blog.metabrainz.org/author/lmzas/">Zas</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://blog.metabrainz.org/2020/08/18/picard-2-4-2-released/" rel="bookmark"><time class="entry-date published updated" datetime="2020-08-18T09:22:09+00:00">August 18, 2020</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://blog.metabrainz.org/category/musicbrainz/picard/" rel="category tag">Picard</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://blog.metabrainz.org/tag/changelog/" rel="tag">changelog</a>, <a href="https://blog.metabrainz.org/tag/download/" rel="tag">download</a>, <a href="https://blog.metabrainz.org/tag/picard/" rel="tag">Picard</a>, <a href="https://blog.metabrainz.org/tag/release/" rel="tag">release</a></span><span class="comments-link"><a href="https://blog.metabrainz.org/2020/08/18/picard-2-4-2-released/#respond">Leave a comment<span class="screen-reader-text"> on Picard 2.4.2 released</span></a></span> </footer><!-- .entry-footer --> </article><!-- #post-8212 --> <article id="post-8195" class="post-8195 post type-post status-publish format-standard hentry category-musicbrainz category-picard category-windowstagger tag-changelog tag-download tag-picard tag-release tag-windows"> <header class="entry-header"> <h2 class="entry-title"><a href="https://blog.metabrainz.org/2020/08/11/picard-2-4-1-fixes-start-issues-on-windows-7-and-8/" rel="bookmark">Picard 2.4.1 fixes start issues on Windows 7 and 8</a></h2> </header><!-- .entry-header --> <div class="entry-content"> <p>Following yesterday’s release of Picard 2.4 we have a bugfix release that fixes Picard not starting on Windows 7 and Windows 8. Users of those operating systems should <a href="https://picard.musicbrainz.org/downloads/">upgrade to Picard 2.4.1</a>.</p> <p>For a full list of changes since Picard 2.3.2 see our <a href="https://blog.metabrainz.org/2020/08/10/picard-2-4-released/">release announcement for Picard 2.4</a>.</p> <p>Changes in the 2.4.1 point release:</p> <p>[<a href="https://tickets.metabrainz.org/browse/PICARD-1904">PICARD-1904</a>] – Picard 2.4 does not start on Windows 7 and Windows 8</p> <p>Thanks a lot to the users reporting the issue and to Gabriel Ferreira for quickly providing a fix.</p> </div><!-- .entry-content --> <footer class="entry-footer"> <span class="byline"><span class="author vcard"><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://blog.metabrainz.org/author/phwolfer/">phwolfer</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://blog.metabrainz.org/2020/08/11/picard-2-4-1-fixes-start-issues-on-windows-7-and-8/" rel="bookmark"><time class="entry-date published" datetime="2020-08-11T10:23:12+00:00">August 11, 2020</time><time class="updated" datetime="2020-08-11T10:24:51+00:00">August 11, 2020</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://blog.metabrainz.org/category/musicbrainz/" rel="category tag">MusicBrainz</a>, <a href="https://blog.metabrainz.org/category/musicbrainz/picard/" rel="category tag">Picard</a>, <a href="https://blog.metabrainz.org/category/musicbrainz/windowstagger/" rel="category tag">WindowsTagger</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://blog.metabrainz.org/tag/changelog/" rel="tag">changelog</a>, <a href="https://blog.metabrainz.org/tag/download/" rel="tag">download</a>, <a href="https://blog.metabrainz.org/tag/picard/" rel="tag">Picard</a>, <a href="https://blog.metabrainz.org/tag/release/" rel="tag">release</a>, <a href="https://blog.metabrainz.org/tag/windows/" rel="tag">windows</a></span><span class="comments-link"><a href="https://blog.metabrainz.org/2020/08/11/picard-2-4-1-fixes-start-issues-on-windows-7-and-8/#respond">Leave a comment<span class="screen-reader-text"> on Picard 2.4.1 fixes start issues on Windows 7 and 8</span></a></span> </footer><!-- .entry-footer --> </article><!-- #post-8195 --> <article id="post-8177" class="post-8177 post type-post status-publish format-standard hentry category-development category-musicbrainz category-server category-updates category-virtual-machine tag-changelog tag-musicbrainz"> <header class="entry-header"> <h2 class="entry-title"><a href="https://blog.metabrainz.org/2020/08/10/musicbrainz-server-update-2020-08-10/" rel="bookmark">MusicBrainz Server update, 2020-08-10</a></h2> </header><!-- .entry-header --> <div class="entry-content"> <p>After a slow summer month, and hot on the heels of the release of <a href="https://blog.metabrainz.org/2020/08/10/picard-2-4-released/">Picard 2.4</a>, an update for MusicBrainz Server has finally arrived, fixing ten bugs, converting almost as many templates to React, making small improvements and bringing a few handy new features.</p> <p>A new release of MusicBrainz Docker is also available that matches this update of MusicBrainz Server. See the <a href="https://github.com/metabrainz/musicbrainz-docker/releases/tag/v-2020-08-10">release notes</a> for update instructions.</p> <p>Thanks to Cyna and loujin for contributing code. Thanks to aerozol, chaban, cyberskull, fabe56, hibiscuskazeneko, ijc, jesus2099, Kid Devine, Nero Apunto, and yindesu for having reported bugs and suggested improvements. Thanks to kellnerd and mfmeulenbelt for updating the translations. And thanks to all others who tested the <a href="https://beta.musicbrainz.org/">beta version</a>!</p> <p>The git tag is <code><a href="https://github.com/metabrainz/musicbrainz-server/releases/tag/v-2020-08-10">v-2020-08-10</a></code>.</p> <h2 class="wp-block-heading">Bug</h2> <ul class="wp-block-list"><li>[<a href="https://tickets.metabrainz.org/browse/MBS-7994">MBS-7994</a>] – No distinction made between pregap track and position 1 with number 0 when displaying a release</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10746">MBS-10746</a>] – Edit removing pregap track option not shown in edit history</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10833">MBS-10833</a>] – ISE when trying to load “Wikipedia page” edit</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10917">MBS-10917</a>] – Event ‘Found in X User Collections’ wont expand</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10923">MBS-10923</a>] – Pagination of collections not returning consistent results</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10927">MBS-10927</a>] – Since-removed entity show as being created on “add relationship” edit</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10930">MBS-10930</a>] – ISE when trying to display “microblog” edit</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10932">MBS-10932</a>] – Instagram TV links are not allowed</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10937">MBS-10937</a>] – Average event rating not shown on all pages</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10943">MBS-10943</a>] – Attribute value not shown on “remove relationship” edits for events</li></ul> <h2 class="wp-block-heading">New Feature</h2> <ul class="wp-block-list"><li>[<a href="https://tickets.metabrainz.org/browse/MBS-9502">MBS-9502</a>] – Test if the barcode already exists when adding a new release</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10562">MBS-10562</a>] – Add alternate phrases for Places yet to open</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10940">MBS-10940</a>] – Allow filtering the artist Releases tab by date and country</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10949">MBS-10949</a>] – Add autoselect + sidebar for Migu Music URLs</li></ul> <h2 class="wp-block-heading">Improvement</h2> <ul class="wp-block-list"><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10193">MBS-10193</a>] – Update iTunes/Apple Music URL cleanup</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10925">MBS-10925</a>] – Update the VGMdb logo used in the sidebar</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10926">MBS-10926</a>] – Add “Copy to end date” button in relationship editor dialogs</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10928">MBS-10928</a>] – Update the Baidu logo used in the sidebar</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10939">MBS-10939</a>] – Improve Data::Release::find_by_artist to not cause database load issues in production</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10989">MBS-10989</a>] – Update VocaDB cleanup to support new Es (series) format</li></ul> <h2 class="wp-block-heading">React Conversion Task</h2> <ul class="wp-block-list"><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10816">MBS-10816</a>] – Convert Add Label edit to React</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10968">MBS-10968</a>] – Convert Add ISWCs edit to React</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10969">MBS-10969</a>] – Convert Add ISRCs edit to React</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10970">MBS-10970</a>] – Convert Add Release Label edit to React</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10973">MBS-10973</a>] – Convert Add Relationship Attribute edit to React</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10974">MBS-10974</a>] – Convert Remove ISRC edit to React</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10975">MBS-10975</a>] – Convert Remove ISWC edit to React</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10980">MBS-10980</a>] – Convert Remove Entity edit to React</li><li>[<a href="https://tickets.metabrainz.org/browse/MBS-10983">MBS-10983</a>] – Convert Remove Release Label edit to React</li></ul> </div><!-- .entry-content --> <footer class="entry-footer"> <span class="byline"><span class="author vcard"><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://blog.metabrainz.org/author/yvanzo/">yvanzo</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://blog.metabrainz.org/2020/08/10/musicbrainz-server-update-2020-08-10/" rel="bookmark"><time class="entry-date published" datetime="2020-08-10T21:55:19+00:00">August 10, 2020</time><time class="updated" datetime="2020-08-22T16:04:55+00:00">August 22, 2020</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://blog.metabrainz.org/category/development/" rel="category tag">Development</a>, <a href="https://blog.metabrainz.org/category/musicbrainz/" rel="category tag">MusicBrainz</a>, <a href="https://blog.metabrainz.org/category/development/server/" rel="category tag">Server</a>, <a href="https://blog.metabrainz.org/category/development/updates/" rel="category tag">Updates</a>, <a href="https://blog.metabrainz.org/category/development/virtual-machine/" rel="category tag">Virtual Machine</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://blog.metabrainz.org/tag/changelog/" rel="tag">changelog</a>, <a href="https://blog.metabrainz.org/tag/musicbrainz/" rel="tag">MusicBrainz</a></span><span class="comments-link"><a href="https://blog.metabrainz.org/2020/08/10/musicbrainz-server-update-2020-08-10/#respond">Leave a comment<span class="screen-reader-text"> on MusicBrainz Server update, 2020-08-10</span></a></span> </footer><!-- .entry-footer --> </article><!-- #post-8177 --> <article id="post-8159" class="post-8159 post type-post status-publish format-standard hentry category-musicbrainz category-picard category-updates category-windowstagger tag-changelog tag-download tag-musicbrainz tag-picard tag-release tag-tagger"> <header class="entry-header"> <h2 class="entry-title"><a href="https://blog.metabrainz.org/2020/08/10/picard-2-4-released/" rel="bookmark">Picard 2.4 released</a></h2> </header><!-- .entry-header --> <div class="entry-content"> <p>The Picard team is happy to announce that version 2.4 of MusicBrainz Picard is now available for download. MusicBrainz Picard is the official tag editor for the MusicBrainz database and helps you get your music collection sorted and cleaned up with the latest data from MusicBrainz.</p> <p>This releases brings significant performance improvements, improved documentation, new features and many bugfixes.</p> <h2 class="wp-block-heading">What’s new?</h2> <h3 class="wp-block-heading">Better performance and responsiveness</h3> <p>Picard 2.4 features heavily improved performance and responsiveness of the user interface when loading or saving a large amount of files.</p> <h3 class="wp-block-heading">Improved online documentation</h3> <p>There is a completely new <a href="http://picard-docs.musicbrainz.org/">User Guide for MusicBrainz Picard</a>, which replaces the documentation previously available on the Picard website. This documentation is much more complete and easier to update and maintain.</p> <p>We are also looking for contributors who help to improve the documentation. If you have some ideas for improvements have a look at the <a href="https://github.com/rdswift/picard-docs">Picard Docs</a> project on GitHub.</p> <h3 class="wp-block-heading">Support for tagging WAVE and DSDIFF</h3> <p>Picard now finally supports writing tags to WAVE files. This was previously not possible, as there is lack of a proper standard to tagging WAVE files. Now Picard will allow you to write ID3v2 tags to WAVE files. As this is not supported by all players and tagging tools, Picard can optionally fall back to writing RIFF INFO tags to the files. Just be aware that RIFF INFO is very limited in regards to tags available and support for non latin character sets.</p> <p>As a new file format Picard now supports DSDIFF (also known by their file extension as DFF) files. These can be loaded and saved using ID3v2. Similar to WAVE there is no standard way for tagging DSDIFF files, but many playback tools which support DSDIFF also support the ID3v2 tags.</p> <h3 class="wp-block-heading">Script auto completion and inline documentation</h3> <p>The script editors in the options dialogue (both for file naming and metadata scripts) now support auto completion for function and variable names. In addition there is a new script documentation dialogue, which shows the documentation for all scripting functions without the need to open the online documentation in your browser.</p> <h3 class="wp-block-heading">Dark mode support for Windows 10</h3> <p>On Windows 10 Picard now respects your settings for the Windows dark mode. If enabled, Picard will use a dark color theme and optimized syntax highlighting. This work also allows us to further improve Picard for dark themes on other platforms in the future.</p> <h3 class="wp-block-heading">Updated translations</h3> <p>With this release a lot of translatable text has been added to Picard, and many translations have been updated.</p> <p>But not all translations are completed and we always need help maintaining the translations for Picard. Translating is easy and can be done online: Head over to <a href="https://www.transifex.com/musicbrainz/musicbrainz/">MusicBrainz’s translation page on Transifex</a> and click on “Help Translate MusicBrainz”. Any changes to the translations will be included in the next release.</p> <h3 class="wp-block-heading">More changes and bugfixes</h3> <p>Picard 2.4 has many more improvements and fixes. See the <a href="https://picard.musicbrainz.org/changelog/#release-2.4">full changelog</a> for details on all changes since the last stable Picard 2.3.2.</p> <h2 class="wp-block-heading">Download</h2> <p>Picard 2.4 is available for download from the <a href="https://picard.musicbrainz.org/downloads/">download page</a>. For Windows 10 users installing from the <a href="https://www.microsoft.com/store/apps/9nj9q3jr29l2?cid=storebadge&ocid=badge" target="_blank" rel="noreferrer noopener">Windows Store</a> an update will come automatically as soon as the new release has been approved by Microsoft.</p> <h2 class="wp-block-heading">Acknowledgements</h2> <p>This release contains code changes by Gabriel Ferreira, Laurent Monin, Bob Swift, Philipp Wolfer, RaysDev, Wieland Hoffmann and new contributors Adam James, jcaesar and elvquant.</p> <p>Special thanks go to Gabriel Ferreira for his excellent work in profiling and improving Picard performance and to Bob Swift, who completely overhauled Picard’s documentation, making it much more complete then it ever has been, and to all the translators who updated their language translations on Transifex.</p> </div><!-- .entry-content --> <footer class="entry-footer"> <span class="byline"><span class="author vcard"><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://blog.metabrainz.org/author/phwolfer/">phwolfer</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://blog.metabrainz.org/2020/08/10/picard-2-4-released/" rel="bookmark"><time class="entry-date published" datetime="2020-08-10T16:22:24+00:00">August 10, 2020</time><time class="updated" datetime="2020-08-10T20:40:50+00:00">August 10, 2020</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://blog.metabrainz.org/category/musicbrainz/" rel="category tag">MusicBrainz</a>, <a href="https://blog.metabrainz.org/category/musicbrainz/picard/" rel="category tag">Picard</a>, <a href="https://blog.metabrainz.org/category/development/updates/" rel="category tag">Updates</a>, <a href="https://blog.metabrainz.org/category/musicbrainz/windowstagger/" rel="category tag">WindowsTagger</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://blog.metabrainz.org/tag/changelog/" rel="tag">changelog</a>, <a href="https://blog.metabrainz.org/tag/download/" rel="tag">download</a>, <a href="https://blog.metabrainz.org/tag/musicbrainz/" rel="tag">MusicBrainz</a>, <a href="https://blog.metabrainz.org/tag/picard/" rel="tag">Picard</a>, <a href="https://blog.metabrainz.org/tag/release/" rel="tag">release</a>, <a href="https://blog.metabrainz.org/tag/tagger/" rel="tag">tagger</a></span><span class="comments-link"><a href="https://blog.metabrainz.org/2020/08/10/picard-2-4-released/#comments">3 Comments<span class="screen-reader-text"> on Picard 2.4 released</span></a></span> </footer><!-- .entry-footer --> </article><!-- #post-8159 --> </main><!-- .site-main --> </div><!-- .content-area --> <aside id="secondary" class="sidebar widget-area"> <section id="block-7" class="widget widget_block"><h2 class="widget-title">Links</h2><div class="wp-widget-group__inner-blocks"> <ul class="wp-block-list"> <li><a href="https://metabrainz.org/">MetaBrainz Foundation</a></li> <li><a href="https://community.metabrainz.org/">MetaBrainz Forums</a></li> <li><a href="https://bsky.app/profile/metabrainz.org">Bluesky</a> / <a href="https://mastodon.social/@metabrainz">Mastodon</a> / <a href="https://twitter.com/MetaBrainz">Twitter/X</a></li> </ul> <ul class="wp-block-list"> <li><a href="https://musicbrainz.org/">MusicBrainz</a></li> <li><a href="https://listenbrainz.org/">ListenBrainz</a></li> <li><a href="https://bookbrainz.org/">BookBrainz</a></li> </ul> </div></section><section id="search-2" class="widget widget_search"><h2 class="widget-title">Search</h2> <form role="search" method="get" class="search-form" action="https://blog.metabrainz.org/"> <label> <span class="screen-reader-text"> Search for: </span> <input type="search" class="search-field" placeholder="Search …" value="" name="s" /> </label> <button type="submit" class="search-submit"><span class="screen-reader-text"> Search </span></button> </form> </section><section id="recent-comments-2" class="widget widget_recent_comments"><h2 class="widget-title">Recent Comments</h2> <table class="recentcommentsavatar" cellspacing="0" cellpadding="0" border="0"> <tr><td title="aerozol" class="recentcommentsavatartop" style="height:32px; width:32px;"><a href="http://www.paperski.com" rel="nofollow"></a></td><td class="recentcommentstexttop" style=""><a href="http://www.paperski.com" rel="nofollow">aerozol</a> on <a href="https://blog.metabrainz.org/2024/11/18/musicbrainz-server-update-2024-11-18/#comment-366366">MusicBrainz Server update,…</a></td></tr><tr><td title="George" class="recentcommentsavatarend" style="height:32px; width:32px;"></td><td class="recentcommentstextend" style="">George on <a href="https://blog.metabrainz.org/2024/11/11/the-strangest-releases-in-musicbrainz-weird-and-wonderful/#comment-366364">The Strangest Releases in Musi…</a></td></tr><tr><td title="aerozol" class="recentcommentsavatarend" style="height:32px; width:32px;"><a href="http://www.paperski.com" rel="nofollow"></a></td><td class="recentcommentstextend" style=""><a href="http://www.paperski.com" rel="nofollow">aerozol</a> on <a href="https://blog.metabrainz.org/2024/11/13/welcome-julian45-and-atj/#comment-366362">Welcome Julian45 (and atj…</a></td></tr><tr><td title="aerozol" class="recentcommentsavatarend" style="height:32px; width:32px;"><a href="http://www.paperski.com" rel="nofollow"></a></td><td class="recentcommentstextend" style=""><a href="http://www.paperski.com" rel="nofollow">aerozol</a> on <a href="https://blog.metabrainz.org/2024/11/06/gsoc-2024-integrating-imports-into-bookbrainz/#comment-366361">GSoC 2024: Integrating imports…</a></td></tr><tr><td title="ApeKattQuest, MonkeyPython" class="recentcommentsavatarend" style="height:32px; width:32px;"></td><td class="recentcommentstextend" style="">ApeKattQuest, Monkey… on <a href="https://blog.metabrainz.org/2024/09/10/towards-fair-streaming-introducing-the-fairmuse-project/#comment-366360">Towards Fair Streaming: Introd…</a></td></tr> </table> </section><section id="categories-2" class="widget widget_categories"><h2 class="widget-title">Categories</h2><nav aria-label="Categories"> <ul> <li class="cat-item cat-item-304848241"><a href="https://blog.metabrainz.org/category/acousticbrainz/">AcousticBrainz</a> (17) </li> <li class="cat-item cat-item-12894481"><a href="https://blog.metabrainz.org/category/musicbrainz/android-app/">Android App</a> (9) </li> <li class="cat-item cat-item-494176"><a href="https://blog.metabrainz.org/category/metabrainz/annual-report/">Annual Report</a> (9) </li> <li class="cat-item cat-item-91682"><a href="https://blog.metabrainz.org/category/april-fools-day/">April Fools' Day</a> (7) </li> <li class="cat-item cat-item-143163948"><a href="https://blog.metabrainz.org/category/better-late-than-never-dept/">Better late than never dept.</a> (14) </li> <li class="cat-item cat-item-635784"><a href="https://blog.metabrainz.org/category/metabrainz/board-meeting-minutes/">Board Meeting Minutes</a> (2) </li> <li class="cat-item cat-item-462334187"><a href="https://blog.metabrainz.org/category/bookbrainz/">BookBrainz</a> (18) </li> <li class="cat-item cat-item-19867758"><a href="https://blog.metabrainz.org/category/development/updates/breaking-changes/">Breaking Changes</a> (7) </li> <li class="cat-item cat-item-772072676"><a href="https://blog.metabrainz.org/category/chatbrainz/">chatbrainz</a> (1) </li> <li class="cat-item cat-item-31409893"><a href="https://blog.metabrainz.org/category/community/cleanup-of-the-month/">Cleanup of the Month</a> (6) </li> <li class="cat-item cat-item-424687959"><a href="https://blog.metabrainz.org/category/google-programs/code%e2%80%90in/">Code‐in</a> (4) </li> <li class="cat-item cat-item-55382"><a href="https://blog.metabrainz.org/category/collaborations/">Collaborations</a> (4) </li> <li class="cat-item cat-item-2528"><a href="https://blog.metabrainz.org/category/community/">Community</a> (142) </li> <li class="cat-item cat-item-71159043"><a href="https://blog.metabrainz.org/category/community/community-recap/">Community Recap</a> (3) </li> <li class="cat-item cat-item-143163949"><a href="https://blog.metabrainz.org/category/musicbrainz/cover-art-archive/">Cover Art Archive</a> (5) </li> <li class="cat-item cat-item-225948242"><a href="https://blog.metabrainz.org/category/critiquebrainz/">CritiqueBrainz</a> (12) </li> <li class="cat-item cat-item-22379"><a href="https://blog.metabrainz.org/category/data/">Data</a> (30) </li> <li class="cat-item cat-item-780"><a href="https://blog.metabrainz.org/category/development/">Development</a> (251) </li> <li class="cat-item cat-item-772478166"><a href="https://blog.metabrainz.org/category/musicbrainz/event-art-archive/">Event Art Archive</a> (4) </li> <li class="cat-item cat-item-54"><a href="https://blog.metabrainz.org/category/general/">General</a> (134) </li> <li class="cat-item cat-item-23185871"><a href="https://blog.metabrainz.org/category/google-programs/">Google Programs</a> (18) </li> <li class="cat-item cat-item-79"><a href="https://blog.metabrainz.org/category/hardware/">Hardware</a> (24) </li> <li class="cat-item cat-item-149"><a href="https://blog.metabrainz.org/category/general/hosting/">Hosting</a> (69) </li> <li class="cat-item cat-item-6850"><a href="https://blog.metabrainz.org/category/musicbrainz/instruments/">Instruments</a> (10) </li> <li class="cat-item cat-item-47801351"><a href="https://blog.metabrainz.org/category/internet-pests/">Internet pests</a> (2) </li> <li class="cat-item cat-item-3558"><a href="https://blog.metabrainz.org/category/jobs/">Jobs</a> (1) </li> <li class="cat-item cat-item-2283"><a href="https://blog.metabrainz.org/category/legal/">Legal</a> (1) </li> <li class="cat-item cat-item-143163951"><a href="https://blog.metabrainz.org/category/libmusicbrainz/">libmusicbrainz</a> (15) </li> <li class="cat-item cat-item-7394916"><a href="https://blog.metabrainz.org/category/libtunepimp/">libtunepimp</a> (8) </li> <li class="cat-item cat-item-19606597"><a href="https://blog.metabrainz.org/category/data/linked-open-data/">Linked open data</a> (2) </li> <li class="cat-item cat-item-399253082"><a href="https://blog.metabrainz.org/category/listenbrainz/">ListenBrainz</a> (58) </li> <li class="cat-item cat-item-646467582"><a href="https://blog.metabrainz.org/category/messybrainz/">MessyBrainz</a> (1) </li> <li class="cat-item cat-item-122663067"><a href="https://blog.metabrainz.org/category/metabrainz/">MetaBrainz</a> (121) </li> <li class="cat-item cat-item-42827"><a href="https://blog.metabrainz.org/category/moderation/">Moderation</a> (8) </li> <li class="cat-item cat-item-170964"><a href="https://blog.metabrainz.org/category/musicbrainz/">MusicBrainz</a> (237) </li> <li class="cat-item cat-item-1511234"><a href="https://blog.metabrainz.org/category/musicbrainz/ngs/">NGS</a> (69) </li> <li class="cat-item cat-item-106116"><a href="https://blog.metabrainz.org/category/musicbrainz/picard/">Picard</a> (132) </li> <li class="cat-item cat-item-201310711"><a href="https://blog.metabrainz.org/category/development/updates/breaking-changes/schema-change-release/">Schema Change Release</a> (66) </li> <li class="cat-item cat-item-3079703"><a href="https://blog.metabrainz.org/category/development/search-server/">Search Server</a> (19) </li> <li class="cat-item cat-item-18568"><a href="https://blog.metabrainz.org/category/development/server/">Server</a> (455) </li> <li class="cat-item cat-item-646632085"><a href="https://blog.metabrainz.org/category/spambrainz/">SpamBrainz</a> (2) </li> <li class="cat-item cat-item-5959850"><a href="https://blog.metabrainz.org/category/style-guidelines/">Style Guidelines</a> (23) </li> <li class="cat-item cat-item-13930"><a href="https://blog.metabrainz.org/category/summaries/">Summaries</a> (6) </li> <li class="cat-item cat-item-176372"><a href="https://blog.metabrainz.org/category/google-programs/summer-of-code/">Summer of Code</a> (87) </li> <li class="cat-item cat-item-115537"><a href="https://blog.metabrainz.org/category/summit/">Summit</a> (25) </li> <li class="cat-item cat-item-143163953"><a href="https://blog.metabrainz.org/category/musicbrainz/tagger-affiliates/">Tagger Affiliates</a> (9) </li> <li class="cat-item cat-item-1"><a href="https://blog.metabrainz.org/category/uncategorized/">Uncategorized</a> (59) </li> <li class="cat-item cat-item-1171"><a href="https://blog.metabrainz.org/category/development/updates/">Updates</a> (350) </li> <li class="cat-item cat-item-95007"><a href="https://blog.metabrainz.org/category/development/virtual-machine/">Virtual Machine</a> (88) </li> <li class="cat-item cat-item-1359"><a href="https://blog.metabrainz.org/category/wiki/">Wiki</a> (7) </li> <li class="cat-item cat-item-143163954"><a href="https://blog.metabrainz.org/category/musicbrainz/windowstagger/">WindowsTagger</a> (33) </li> </ul> </nav></section><section id="archives-2" class="widget widget_archive"><h2 class="widget-title">Archives</h2><nav aria-label="Archives"> <ul> <li><a href='https://blog.metabrainz.org/2024/11/'>November 2024</a> (6)</li> <li><a href='https://blog.metabrainz.org/2024/10/'>October 2024</a> (4)</li> <li><a href='https://blog.metabrainz.org/2024/09/'>September 2024</a> (7)</li> <li><a href='https://blog.metabrainz.org/2024/08/'>August 2024</a> (8)</li> <li><a href='https://blog.metabrainz.org/2024/07/'>July 2024</a> (3)</li> <li><a href='https://blog.metabrainz.org/2024/06/'>June 2024</a> (5)</li> <li><a href='https://blog.metabrainz.org/2024/05/'>May 2024</a> (6)</li> <li><a href='https://blog.metabrainz.org/2024/04/'>April 2024</a> (5)</li> <li><a href='https://blog.metabrainz.org/2024/03/'>March 2024</a> (5)</li> <li><a href='https://blog.metabrainz.org/2024/02/'>February 2024</a> (3)</li> <li><a href='https://blog.metabrainz.org/2024/01/'>January 2024</a> (5)</li> <li><a href='https://blog.metabrainz.org/2023/12/'>December 2023</a> (4)</li> <li><a href='https://blog.metabrainz.org/2023/11/'>November 2023</a> (5)</li> <li><a href='https://blog.metabrainz.org/2023/10/'>October 2023</a> (6)</li> <li><a href='https://blog.metabrainz.org/2023/09/'>September 2023</a> (8)</li> <li><a href='https://blog.metabrainz.org/2023/08/'>August 2023</a> (8)</li> <li><a href='https://blog.metabrainz.org/2023/07/'>July 2023</a> (6)</li> <li><a href='https://blog.metabrainz.org/2023/06/'>June 2023</a> (5)</li> <li><a href='https://blog.metabrainz.org/2023/05/'>May 2023</a> (9)</li> <li><a href='https://blog.metabrainz.org/2023/04/'>April 2023</a> (3)</li> <li><a href='https://blog.metabrainz.org/2023/03/'>March 2023</a> (3)</li> <li><a href='https://blog.metabrainz.org/2023/02/'>February 2023</a> (5)</li> <li><a href='https://blog.metabrainz.org/2023/01/'>January 2023</a> (4)</li> <li><a href='https://blog.metabrainz.org/2022/12/'>December 2022</a> (2)</li> <li><a href='https://blog.metabrainz.org/2022/11/'>November 2022</a> (5)</li> <li><a href='https://blog.metabrainz.org/2022/10/'>October 2022</a> (3)</li> <li><a href='https://blog.metabrainz.org/2022/09/'>September 2022</a> (6)</li> <li><a href='https://blog.metabrainz.org/2022/08/'>August 2022</a> (4)</li> <li><a href='https://blog.metabrainz.org/2022/07/'>July 2022</a> (3)</li> <li><a href='https://blog.metabrainz.org/2022/06/'>June 2022</a> (3)</li> <li><a href='https://blog.metabrainz.org/2022/05/'>May 2022</a> (6)</li> <li><a href='https://blog.metabrainz.org/2022/04/'>April 2022</a> (3)</li> <li><a href='https://blog.metabrainz.org/2022/03/'>March 2022</a> (5)</li> <li><a href='https://blog.metabrainz.org/2022/02/'>February 2022</a> (4)</li> <li><a href='https://blog.metabrainz.org/2022/01/'>January 2022</a> (3)</li> <li><a href='https://blog.metabrainz.org/2021/12/'>December 2021</a> (7)</li> <li><a href='https://blog.metabrainz.org/2021/11/'>November 2021</a> (3)</li> <li><a href='https://blog.metabrainz.org/2021/10/'>October 2021</a> (4)</li> <li><a href='https://blog.metabrainz.org/2021/09/'>September 2021</a> (3)</li> <li><a href='https://blog.metabrainz.org/2021/08/'>August 2021</a> (6)</li> <li><a href='https://blog.metabrainz.org/2021/07/'>July 2021</a> (2)</li> <li><a href='https://blog.metabrainz.org/2021/06/'>June 2021</a> (5)</li> <li><a href='https://blog.metabrainz.org/2021/05/'>May 2021</a> (5)</li> <li><a href='https://blog.metabrainz.org/2021/04/'>April 2021</a> (6)</li> <li><a href='https://blog.metabrainz.org/2021/03/'>March 2021</a> (6)</li> <li><a href='https://blog.metabrainz.org/2021/02/'>February 2021</a> (4)</li> <li><a href='https://blog.metabrainz.org/2021/01/'>January 2021</a> (2)</li> <li><a href='https://blog.metabrainz.org/2020/12/'>December 2020</a> (5)</li> <li><a href='https://blog.metabrainz.org/2020/11/'>November 2020</a> (3)</li> <li><a href='https://blog.metabrainz.org/2020/10/'>October 2020</a> (6)</li> <li><a href='https://blog.metabrainz.org/2020/09/'>September 2020</a> (4)</li> <li><a href='https://blog.metabrainz.org/2020/08/' aria-current="page">August 2020</a> (8)</li> <li><a href='https://blog.metabrainz.org/2020/07/'>July 2020</a> (4)</li> <li><a href='https://blog.metabrainz.org/2020/06/'>June 2020</a> (4)</li> <li><a href='https://blog.metabrainz.org/2020/05/'>May 2020</a> (5)</li> <li><a href='https://blog.metabrainz.org/2020/04/'>April 2020</a> (5)</li> <li><a href='https://blog.metabrainz.org/2020/03/'>March 2020</a> (3)</li> <li><a href='https://blog.metabrainz.org/2020/02/'>February 2020</a> (8)</li> <li><a href='https://blog.metabrainz.org/2020/01/'>January 2020</a> (3)</li> <li><a href='https://blog.metabrainz.org/2019/12/'>December 2019</a> (3)</li> <li><a href='https://blog.metabrainz.org/2019/11/'>November 2019</a> (4)</li> <li><a href='https://blog.metabrainz.org/2019/10/'>October 2019</a> (4)</li> <li><a href='https://blog.metabrainz.org/2019/09/'>September 2019</a> (4)</li> <li><a href='https://blog.metabrainz.org/2019/08/'>August 2019</a> (7)</li> <li><a href='https://blog.metabrainz.org/2019/06/'>June 2019</a> (3)</li> <li><a href='https://blog.metabrainz.org/2019/05/'>May 2019</a> (4)</li> <li><a href='https://blog.metabrainz.org/2019/04/'>April 2019</a> (3)</li> <li><a href='https://blog.metabrainz.org/2019/03/'>March 2019</a> (5)</li> <li><a href='https://blog.metabrainz.org/2019/02/'>February 2019</a> (2)</li> <li><a href='https://blog.metabrainz.org/2019/01/'>January 2019</a> (2)</li> <li><a href='https://blog.metabrainz.org/2018/12/'>December 2018</a> (3)</li> <li><a href='https://blog.metabrainz.org/2018/11/'>November 2018</a> (4)</li> <li><a href='https://blog.metabrainz.org/2018/10/'>October 2018</a> (3)</li> <li><a href='https://blog.metabrainz.org/2018/09/'>September 2018</a> (9)</li> <li><a href='https://blog.metabrainz.org/2018/08/'>August 2018</a> (7)</li> <li><a href='https://blog.metabrainz.org/2018/07/'>July 2018</a> (4)</li> <li><a href='https://blog.metabrainz.org/2018/06/'>June 2018</a> (3)</li> <li><a href='https://blog.metabrainz.org/2018/05/'>May 2018</a> (3)</li> <li><a href='https://blog.metabrainz.org/2018/04/'>April 2018</a> (2)</li> <li><a href='https://blog.metabrainz.org/2018/03/'>March 2018</a> (7)</li> <li><a href='https://blog.metabrainz.org/2018/02/'>February 2018</a> (3)</li> <li><a href='https://blog.metabrainz.org/2018/01/'>January 2018</a> (3)</li> <li><a href='https://blog.metabrainz.org/2017/12/'>December 2017</a> (2)</li> <li><a href='https://blog.metabrainz.org/2017/11/'>November 2017</a> (2)</li> <li><a href='https://blog.metabrainz.org/2017/10/'>October 2017</a> (2)</li> <li><a href='https://blog.metabrainz.org/2017/09/'>September 2017</a> (10)</li> <li><a href='https://blog.metabrainz.org/2017/08/'>August 2017</a> (7)</li> <li><a href='https://blog.metabrainz.org/2017/07/'>July 2017</a> (3)</li> <li><a href='https://blog.metabrainz.org/2017/06/'>June 2017</a> (5)</li> <li><a href='https://blog.metabrainz.org/2017/05/'>May 2017</a> (6)</li> <li><a href='https://blog.metabrainz.org/2017/04/'>April 2017</a> (3)</li> <li><a href='https://blog.metabrainz.org/2017/03/'>March 2017</a> (5)</li> <li><a href='https://blog.metabrainz.org/2017/02/'>February 2017</a> (5)</li> <li><a href='https://blog.metabrainz.org/2017/01/'>January 2017</a> (4)</li> <li><a href='https://blog.metabrainz.org/2016/12/'>December 2016</a> (5)</li> <li><a href='https://blog.metabrainz.org/2016/11/'>November 2016</a> (5)</li> <li><a href='https://blog.metabrainz.org/2016/10/'>October 2016</a> (2)</li> <li><a href='https://blog.metabrainz.org/2016/09/'>September 2016</a> (1)</li> <li><a href='https://blog.metabrainz.org/2016/08/'>August 2016</a> (7)</li> <li><a href='https://blog.metabrainz.org/2016/07/'>July 2016</a> (3)</li> <li><a href='https://blog.metabrainz.org/2016/06/'>June 2016</a> (3)</li> <li><a href='https://blog.metabrainz.org/2016/05/'>May 2016</a> (14)</li> <li><a href='https://blog.metabrainz.org/2016/04/'>April 2016</a> (4)</li> <li><a href='https://blog.metabrainz.org/2016/03/'>March 2016</a> (8)</li> <li><a href='https://blog.metabrainz.org/2016/02/'>February 2016</a> (6)</li> <li><a href='https://blog.metabrainz.org/2016/01/'>January 2016</a> (4)</li> <li><a href='https://blog.metabrainz.org/2015/12/'>December 2015</a> (4)</li> <li><a href='https://blog.metabrainz.org/2015/11/'>November 2015</a> (6)</li> <li><a href='https://blog.metabrainz.org/2015/10/'>October 2015</a> (2)</li> <li><a href='https://blog.metabrainz.org/2015/09/'>September 2015</a> (9)</li> <li><a href='https://blog.metabrainz.org/2015/08/'>August 2015</a> (5)</li> <li><a href='https://blog.metabrainz.org/2015/07/'>July 2015</a> (12)</li> <li><a href='https://blog.metabrainz.org/2015/06/'>June 2015</a> (4)</li> <li><a href='https://blog.metabrainz.org/2015/05/'>May 2015</a> (8)</li> <li><a href='https://blog.metabrainz.org/2015/04/'>April 2015</a> (5)</li> <li><a href='https://blog.metabrainz.org/2015/03/'>March 2015</a> (9)</li> <li><a href='https://blog.metabrainz.org/2015/02/'>February 2015</a> (5)</li> <li><a href='https://blog.metabrainz.org/2015/01/'>January 2015</a> (6)</li> <li><a href='https://blog.metabrainz.org/2014/12/'>December 2014</a> (6)</li> <li><a href='https://blog.metabrainz.org/2014/11/'>November 2014</a> (8)</li> <li><a href='https://blog.metabrainz.org/2014/10/'>October 2014</a> (6)</li> <li><a href='https://blog.metabrainz.org/2014/09/'>September 2014</a> (5)</li> <li><a href='https://blog.metabrainz.org/2014/08/'>August 2014</a> (2)</li> <li><a href='https://blog.metabrainz.org/2014/07/'>July 2014</a> (5)</li> <li><a href='https://blog.metabrainz.org/2014/06/'>June 2014</a> (3)</li> <li><a href='https://blog.metabrainz.org/2014/05/'>May 2014</a> (9)</li> <li><a href='https://blog.metabrainz.org/2014/04/'>April 2014</a> (5)</li> <li><a href='https://blog.metabrainz.org/2014/03/'>March 2014</a> (7)</li> <li><a href='https://blog.metabrainz.org/2014/02/'>February 2014</a> (4)</li> <li><a href='https://blog.metabrainz.org/2014/01/'>January 2014</a> (2)</li> <li><a href='https://blog.metabrainz.org/2013/12/'>December 2013</a> (10)</li> <li><a href='https://blog.metabrainz.org/2013/11/'>November 2013</a> (7)</li> <li><a href='https://blog.metabrainz.org/2013/10/'>October 2013</a> (9)</li> <li><a href='https://blog.metabrainz.org/2013/09/'>September 2013</a> (7)</li> <li><a href='https://blog.metabrainz.org/2013/08/'>August 2013</a> (7)</li> <li><a href='https://blog.metabrainz.org/2013/07/'>July 2013</a> (4)</li> <li><a href='https://blog.metabrainz.org/2013/06/'>June 2013</a> (11)</li> <li><a href='https://blog.metabrainz.org/2013/05/'>May 2013</a> (8)</li> <li><a href='https://blog.metabrainz.org/2013/04/'>April 2013</a> (6)</li> <li><a href='https://blog.metabrainz.org/2013/03/'>March 2013</a> (7)</li> <li><a href='https://blog.metabrainz.org/2013/02/'>February 2013</a> (8)</li> <li><a href='https://blog.metabrainz.org/2013/01/'>January 2013</a> (8)</li> <li><a href='https://blog.metabrainz.org/2012/12/'>December 2012</a> (4)</li> <li><a href='https://blog.metabrainz.org/2012/11/'>November 2012</a> (4)</li> <li><a href='https://blog.metabrainz.org/2012/10/'>October 2012</a> (11)</li> <li><a href='https://blog.metabrainz.org/2012/09/'>September 2012</a> (13)</li> <li><a href='https://blog.metabrainz.org/2012/08/'>August 2012</a> (5)</li> <li><a href='https://blog.metabrainz.org/2012/07/'>July 2012</a> (9)</li> <li><a href='https://blog.metabrainz.org/2012/06/'>June 2012</a> (7)</li> <li><a href='https://blog.metabrainz.org/2012/05/'>May 2012</a> (14)</li> <li><a href='https://blog.metabrainz.org/2012/04/'>April 2012</a> (6)</li> <li><a href='https://blog.metabrainz.org/2012/03/'>March 2012</a> (7)</li> <li><a href='https://blog.metabrainz.org/2012/02/'>February 2012</a> (5)</li> <li><a href='https://blog.metabrainz.org/2012/01/'>January 2012</a> (13)</li> <li><a href='https://blog.metabrainz.org/2011/12/'>December 2011</a> (8)</li> <li><a href='https://blog.metabrainz.org/2011/11/'>November 2011</a> (4)</li> <li><a href='https://blog.metabrainz.org/2011/10/'>October 2011</a> (9)</li> <li><a href='https://blog.metabrainz.org/2011/09/'>September 2011</a> (6)</li> <li><a href='https://blog.metabrainz.org/2011/08/'>August 2011</a> (7)</li> <li><a href='https://blog.metabrainz.org/2011/07/'>July 2011</a> (11)</li> <li><a href='https://blog.metabrainz.org/2011/06/'>June 2011</a> (9)</li> <li><a href='https://blog.metabrainz.org/2011/05/'>May 2011</a> (22)</li> <li><a href='https://blog.metabrainz.org/2011/04/'>April 2011</a> (4)</li> <li><a href='https://blog.metabrainz.org/2011/03/'>March 2011</a> (8)</li> <li><a href='https://blog.metabrainz.org/2011/02/'>February 2011</a> (6)</li> <li><a href='https://blog.metabrainz.org/2011/01/'>January 2011</a> (7)</li> <li><a href='https://blog.metabrainz.org/2010/12/'>December 2010</a> (1)</li> <li><a href='https://blog.metabrainz.org/2010/11/'>November 2010</a> (1)</li> <li><a href='https://blog.metabrainz.org/2010/10/'>October 2010</a> (4)</li> <li><a href='https://blog.metabrainz.org/2010/09/'>September 2010</a> (4)</li> <li><a href='https://blog.metabrainz.org/2010/08/'>August 2010</a> (5)</li> <li><a href='https://blog.metabrainz.org/2010/07/'>July 2010</a> (7)</li> <li><a href='https://blog.metabrainz.org/2010/06/'>June 2010</a> (9)</li> <li><a href='https://blog.metabrainz.org/2010/05/'>May 2010</a> (7)</li> <li><a href='https://blog.metabrainz.org/2010/04/'>April 2010</a> (1)</li> <li><a href='https://blog.metabrainz.org/2010/03/'>March 2010</a> (7)</li> <li><a href='https://blog.metabrainz.org/2010/02/'>February 2010</a> (4)</li> <li><a href='https://blog.metabrainz.org/2010/01/'>January 2010</a> (4)</li> <li><a href='https://blog.metabrainz.org/2009/12/'>December 2009</a> (3)</li> <li><a href='https://blog.metabrainz.org/2009/11/'>November 2009</a> (1)</li> <li><a href='https://blog.metabrainz.org/2009/10/'>October 2009</a> (5)</li> <li><a href='https://blog.metabrainz.org/2009/09/'>September 2009</a> (2)</li> <li><a href='https://blog.metabrainz.org/2009/08/'>August 2009</a> (4)</li> <li><a href='https://blog.metabrainz.org/2009/07/'>July 2009</a> (3)</li> <li><a href='https://blog.metabrainz.org/2009/06/'>June 2009</a> (3)</li> <li><a href='https://blog.metabrainz.org/2009/05/'>May 2009</a> (6)</li> <li><a href='https://blog.metabrainz.org/2009/04/'>April 2009</a> (2)</li> <li><a href='https://blog.metabrainz.org/2009/03/'>March 2009</a> (5)</li> <li><a href='https://blog.metabrainz.org/2009/02/'>February 2009</a> (7)</li> <li><a href='https://blog.metabrainz.org/2009/01/'>January 2009</a> (2)</li> <li><a href='https://blog.metabrainz.org/2008/12/'>December 2008</a> (3)</li> <li><a href='https://blog.metabrainz.org/2008/11/'>November 2008</a> (6)</li> <li><a href='https://blog.metabrainz.org/2008/10/'>October 2008</a> (8)</li> <li><a href='https://blog.metabrainz.org/2008/09/'>September 2008</a> (8)</li> <li><a href='https://blog.metabrainz.org/2008/08/'>August 2008</a> (5)</li> <li><a href='https://blog.metabrainz.org/2008/07/'>July 2008</a> (5)</li> <li><a href='https://blog.metabrainz.org/2008/06/'>June 2008</a> (7)</li> <li><a href='https://blog.metabrainz.org/2008/05/'>May 2008</a> (5)</li> <li><a href='https://blog.metabrainz.org/2008/04/'>April 2008</a> (4)</li> <li><a href='https://blog.metabrainz.org/2008/03/'>March 2008</a> (6)</li> <li><a href='https://blog.metabrainz.org/2008/02/'>February 2008</a> (8)</li> <li><a href='https://blog.metabrainz.org/2008/01/'>January 2008</a> (3)</li> <li><a href='https://blog.metabrainz.org/2007/11/'>November 2007</a> (7)</li> <li><a href='https://blog.metabrainz.org/2007/10/'>October 2007</a> (7)</li> <li><a href='https://blog.metabrainz.org/2007/09/'>September 2007</a> (2)</li> <li><a href='https://blog.metabrainz.org/2007/08/'>August 2007</a> (5)</li> <li><a href='https://blog.metabrainz.org/2007/07/'>July 2007</a> (3)</li> <li><a href='https://blog.metabrainz.org/2007/06/'>June 2007</a> (4)</li> <li><a href='https://blog.metabrainz.org/2007/05/'>May 2007</a> (8)</li> <li><a href='https://blog.metabrainz.org/2007/04/'>April 2007</a> (11)</li> <li><a href='https://blog.metabrainz.org/2007/03/'>March 2007</a> (9)</li> <li><a href='https://blog.metabrainz.org/2007/02/'>February 2007</a> (4)</li> <li><a href='https://blog.metabrainz.org/2007/01/'>January 2007</a> (8)</li> <li><a href='https://blog.metabrainz.org/2006/12/'>December 2006</a> (4)</li> <li><a href='https://blog.metabrainz.org/2006/11/'>November 2006</a> (6)</li> <li><a href='https://blog.metabrainz.org/2006/10/'>October 2006</a> (7)</li> <li><a href='https://blog.metabrainz.org/2006/09/'>September 2006</a> (10)</li> <li><a href='https://blog.metabrainz.org/2006/08/'>August 2006</a> (13)</li> <li><a href='https://blog.metabrainz.org/2006/07/'>July 2006</a> (11)</li> <li><a href='https://blog.metabrainz.org/2006/06/'>June 2006</a> (3)</li> <li><a href='https://blog.metabrainz.org/2006/05/'>May 2006</a> (9)</li> <li><a href='https://blog.metabrainz.org/2006/04/'>April 2006</a> (2)</li> <li><a href='https://blog.metabrainz.org/2006/03/'>March 2006</a> (7)</li> <li><a href='https://blog.metabrainz.org/2006/02/'>February 2006</a> (8)</li> <li><a href='https://blog.metabrainz.org/2006/01/'>January 2006</a> (13)</li> <li><a href='https://blog.metabrainz.org/2005/12/'>December 2005</a> (4)</li> <li><a href='https://blog.metabrainz.org/2005/11/'>November 2005</a> (6)</li> <li><a href='https://blog.metabrainz.org/2005/10/'>October 2005</a> (3)</li> <li><a href='https://blog.metabrainz.org/2005/09/'>September 2005</a> (4)</li> <li><a href='https://blog.metabrainz.org/2005/08/'>August 2005</a> (1)</li> <li><a href='https://blog.metabrainz.org/2005/07/'>July 2005</a> (4)</li> <li><a href='https://blog.metabrainz.org/2005/06/'>June 2005</a> (3)</li> <li><a href='https://blog.metabrainz.org/2005/05/'>May 2005</a> (9)</li> <li><a href='https://blog.metabrainz.org/2005/04/'>April 2005</a> (6)</li> <li><a href='https://blog.metabrainz.org/2005/03/'>March 2005</a> (4)</li> <li><a href='https://blog.metabrainz.org/2005/02/'>February 2005</a> (9)</li> <li><a href='https://blog.metabrainz.org/2005/01/'>January 2005</a> (6)</li> <li><a href='https://blog.metabrainz.org/2004/12/'>December 2004</a> (8)</li> <li><a href='https://blog.metabrainz.org/2004/11/'>November 2004</a> (11)</li> <li><a href='https://blog.metabrainz.org/2004/10/'>October 2004</a> (22)</li> <li><a href='https://blog.metabrainz.org/2004/08/'>August 2004</a> (1)</li> <li><a href='https://blog.metabrainz.org/2004/07/'>July 2004</a> (1)</li> <li><a href='https://blog.metabrainz.org/2004/05/'>May 2004</a> (2)</li> <li><a href='https://blog.metabrainz.org/2004/04/'>April 2004</a> (1)</li> <li><a href='https://blog.metabrainz.org/2004/03/'>March 2004</a> (4)</li> <li><a href='https://blog.metabrainz.org/2004/02/'>February 2004</a> (2)</li> <li><a href='https://blog.metabrainz.org/2004/01/'>January 2004</a> (2)</li> <li><a href='https://blog.metabrainz.org/2003/12/'>December 2003</a> (1)</li> <li><a href='https://blog.metabrainz.org/2003/11/'>November 2003</a> (2)</li> <li><a href='https://blog.metabrainz.org/2003/10/'>October 2003</a> (4)</li> <li><a href='https://blog.metabrainz.org/2003/09/'>September 2003</a> (1)</li> <li><a href='https://blog.metabrainz.org/2003/07/'>July 2003</a> (2)</li> <li><a href='https://blog.metabrainz.org/2003/06/'>June 2003</a> (6)</li> <li><a href='https://blog.metabrainz.org/2003/04/'>April 2003</a> (2)</li> <li><a href='https://blog.metabrainz.org/2003/03/'>March 2003</a> (2)</li> <li><a href='https://blog.metabrainz.org/2003/01/'>January 2003</a> (1)</li> </ul> </nav></section> </aside><!-- .sidebar .widget-area --> </div><!-- .site-content --> <footer id="colophon" class="site-footer"> <nav class="main-navigation" aria-label="Footer Primary Menu"> </nav><!-- .main-navigation --> <div class="site-info"> <span class="site-title"><a href="https://blog.metabrainz.org/" rel="home">MetaBrainz Blog</a></span> <a href="https://wordpress.com/?ref=footer_blog" rel="nofollow">Blog at WordPress.com.</a> </div><!-- .site-info --> </footer><!-- .site-footer --> </div><!-- .site-inner --> </div><!-- .site --> <!-- --> <div style="display:none"> </div> <div id="actionbar" style="display: none;" class="actnbr-pub-twentysixteen actnbr-has-follow"> <ul> <li class="actnbr-btn actnbr-hidden"> <a class="actnbr-action actnbr-actn-follow " href=""> <svg class="gridicon" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path clip-rule="evenodd" d="m4 4.5h12v6.5h1.5v-6.5-1.5h-1.5-12-1.5v1.5 10.5c0 1.1046.89543 2 2 2h7v-1.5h-7c-.27614 0-.5-.2239-.5-.5zm10.5 2h-9v1.5h9zm-5 3h-4v1.5h4zm3.5 1.5h-1v1h1zm-1-1.5h-1.5v1.5 1 1.5h1.5 1 1.5v-1.5-1-1.5h-1.5zm-2.5 2.5h-4v1.5h4zm6.5 1.25h1.5v2.25h2.25v1.5h-2.25v2.25h-1.5v-2.25h-2.25v-1.5h2.25z" fill-rule="evenodd"></path></svg> <span>Subscribe</span> </a> <a class="actnbr-action actnbr-actn-following no-display" href=""> <svg class="gridicon" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill-rule="evenodd" clip-rule="evenodd" d="M16 4.5H4V15C4 15.2761 4.22386 15.5 4.5 15.5H11.5V17H4.5C3.39543 17 2.5 16.1046 2.5 15V4.5V3H4H16H17.5V4.5V12.5H16V4.5ZM5.5 6.5H14.5V8H5.5V6.5ZM5.5 9.5H9.5V11H5.5V9.5ZM12 11H13V12H12V11ZM10.5 9.5H12H13H14.5V11V12V13.5H13H12H10.5V12V11V9.5ZM5.5 12H9.5V13.5H5.5V12Z" fill="#008A20"></path><path class="following-icon-tick" d="M13.5 16L15.5 18L19 14.5" stroke="#008A20" stroke-width="1.5"></path></svg> <span>Subscribed</span> </a> <div class="actnbr-popover tip tip-top-left actnbr-notice" id="follow-bubble"> <div class="tip-arrow"></div> <div class="tip-inner actnbr-follow-bubble"> <ul> <li class="actnbr-sitename"> <a href="https://blog.metabrainz.org"> <img loading='lazy' alt='' src='https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=50' srcset='https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=50 1x, https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=75 1.5x, https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=100 2x, https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=150 3x, https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=150 4x' class='avatar avatar-50' height='50' width='50' /> MetaBrainz Blog </a> </li> <div class="actnbr-message no-display"></div> <form method="post" action="https://subscribe.wordpress.com" accept-charset="utf-8" style="display: none;"> <div class="actnbr-follow-count">Join 355 other subscribers</div> <div> <input type="email" name="email" placeholder="Enter your email address" class="actnbr-email-field" aria-label="Enter your email address" /> </div> <input type="hidden" name="action" value="subscribe" /> <input type="hidden" name="blog_id" value="1935472" /> <input type="hidden" name="source" value="https://blog.metabrainz.org/2020/08/" /> <input type="hidden" name="sub-type" value="actionbar-follow" /> <input type="hidden" id="_wpnonce" name="_wpnonce" value="fbb5911d9c" /> <div class="actnbr-button-wrap"> <button type="submit" value="Sign me up"> Sign me up </button> </div> </form> <li class="actnbr-login-nudge"> <div> Already have a WordPress.com account? <a href="https://wordpress.com/log-in?redirect_to=https%3A%2F%2Fr-login.wordpress.com%2Fremote-login.php%3Faction%3Dlink%26back%3Dhttps%253A%252F%252Fblog.metabrainz.org%252F2020%252F08%252F31%252Fgsoc-2020-user-collection-for-bookbrainz%252F">Log in now.</a> </div> </li> </ul> </div> </div> </li> <li class="actnbr-ellipsis actnbr-hidden"> <svg class="gridicon gridicons-ellipsis" height="24" width="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><g><path d="M7 12c0 1.104-.896 2-2 2s-2-.896-2-2 .896-2 2-2 2 .896 2 2zm12-2c-1.104 0-2 .896-2 2s.896 2 2 2 2-.896 2-2-.896-2-2-2zm-7 0c-1.104 0-2 .896-2 2s.896 2 2 2 2-.896 2-2-.896-2-2-2z"/></g></svg> <div class="actnbr-popover tip tip-top-left actnbr-more"> <div class="tip-arrow"></div> <div class="tip-inner"> <ul> <li class="actnbr-sitename"> <a href="https://blog.metabrainz.org"> <img loading='lazy' alt='' src='https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=50' srcset='https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=50 1x, https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=75 1.5x, https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=100 2x, https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=150 3x, https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=150 4x' class='avatar avatar-50' height='50' width='50' /> MetaBrainz Blog </a> </li> <li class="actnbr-folded-customize"> <a href="https://musicbrainz.wordpress.com/wp-admin/customize.php?url=https%3A%2F%2Fmusicbrainz.wordpress.com%2F2020%2F08%2F"> <svg class="gridicon gridicons-customize" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><g><path d="M2 6c0-1.505.78-3.08 2-4 0 .845.69 2 2 2 1.657 0 3 1.343 3 3 0 .386-.08.752-.212 1.09.74.594 1.476 1.19 2.19 1.81L8.9 11.98c-.62-.716-1.214-1.454-1.807-2.192C6.753 9.92 6.387 10 6 10c-2.21 0-4-1.79-4-4zm12.152 6.848l1.34-1.34c.607.304 1.283.492 2.008.492 2.485 0 4.5-2.015 4.5-4.5 0-.725-.188-1.4-.493-2.007L18 9l-2-2 3.507-3.507C18.9 3.188 18.225 3 17.5 3 15.015 3 13 5.015 13 7.5c0 .725.188 1.4.493 2.007L3 20l2 2 6.848-6.848c1.885 1.928 3.874 3.753 5.977 5.45l1.425 1.148 1.5-1.5-1.15-1.425c-1.695-2.103-3.52-4.092-5.448-5.977z"/></g></svg> <span>Customize</span> </a> </li> <li class="actnbr-folded-follow"> <a class="actnbr-action actnbr-actn-follow " href=""> <svg class="gridicon" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path clip-rule="evenodd" d="m4 4.5h12v6.5h1.5v-6.5-1.5h-1.5-12-1.5v1.5 10.5c0 1.1046.89543 2 2 2h7v-1.5h-7c-.27614 0-.5-.2239-.5-.5zm10.5 2h-9v1.5h9zm-5 3h-4v1.5h4zm3.5 1.5h-1v1h1zm-1-1.5h-1.5v1.5 1 1.5h1.5 1 1.5v-1.5-1-1.5h-1.5zm-2.5 2.5h-4v1.5h4zm6.5 1.25h1.5v2.25h2.25v1.5h-2.25v2.25h-1.5v-2.25h-2.25v-1.5h2.25z" fill-rule="evenodd"></path></svg> <span>Subscribe</span> </a> <a class="actnbr-action actnbr-actn-following no-display" href=""> <svg class="gridicon" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill-rule="evenodd" clip-rule="evenodd" d="M16 4.5H4V15C4 15.2761 4.22386 15.5 4.5 15.5H11.5V17H4.5C3.39543 17 2.5 16.1046 2.5 15V4.5V3H4H16H17.5V4.5V12.5H16V4.5ZM5.5 6.5H14.5V8H5.5V6.5ZM5.5 9.5H9.5V11H5.5V9.5ZM12 11H13V12H12V11ZM10.5 9.5H12H13H14.5V11V12V13.5H13H12H10.5V12V11V9.5ZM5.5 12H9.5V13.5H5.5V12Z" fill="#008A20"></path><path class="following-icon-tick" d="M13.5 16L15.5 18L19 14.5" stroke="#008A20" stroke-width="1.5"></path></svg> <span>Subscribed</span> </a> </li> <li class="actnbr-signup"><a href="https://wordpress.com/start/">Sign up</a></li> <li class="actnbr-login"><a href="https://wordpress.com/log-in?redirect_to=https%3A%2F%2Fr-login.wordpress.com%2Fremote-login.php%3Faction%3Dlink%26back%3Dhttps%253A%252F%252Fblog.metabrainz.org%252F2020%252F08%252F31%252Fgsoc-2020-user-collection-for-bookbrainz%252F">Log in</a></li> <li class="flb-report"> <a href="https://wordpress.com/abuse/?report_url=https://blog.metabrainz.org" target="_blank" rel="noopener noreferrer"> Report this content </a> </li> <li class="actnbr-reader"> <a href="https://wordpress.com/read/feeds/90752457"> View site in Reader </a> </li> <li class="actnbr-subs"> <a href="https://subscribe.wordpress.com/">Manage subscriptions</a> </li> <li class="actnbr-fold"><a href="">Collapse this bar</a></li> </ul> </div> </div> </li> </ul> </div> <script> window.addEventListener( "load", function( event ) { var link = document.createElement( "link" ); link.href = "https://s0.wp.com/wp-content/mu-plugins/actionbar/actionbar.css?v=20241015"; link.type = "text/css"; link.rel = "stylesheet"; document.head.appendChild( link ); var script = document.createElement( "script" ); script.src = "https://s0.wp.com/wp-content/mu-plugins/actionbar/actionbar.js?v=20231122"; script.defer = true; document.body.appendChild( script ); } ); </script> <div id="jp-carousel-loading-overlay"> <div id="jp-carousel-loading-wrapper"> <span id="jp-carousel-library-loading"> </span> </div> </div> <div class="jp-carousel-overlay" style="display: none;"> <div class="jp-carousel-container"> <!-- The Carousel Swiper --> <div class="jp-carousel-wrap swiper-container jp-carousel-swiper-container jp-carousel-transitions" itemscope itemtype="https://schema.org/ImageGallery"> <div class="jp-carousel swiper-wrapper"></div> <div class="jp-swiper-button-prev swiper-button-prev"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="maskPrev" mask-type="alpha" maskUnits="userSpaceOnUse" x="8" y="6" width="9" height="12"> <path d="M16.2072 16.59L11.6496 12L16.2072 7.41L14.8041 6L8.8335 12L14.8041 18L16.2072 16.59Z" fill="white"/> </mask> <g mask="url(#maskPrev)"> <rect x="0.579102" width="23.8823" height="24" fill="#FFFFFF"/> </g> </svg> </div> <div class="jp-swiper-button-next swiper-button-next"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="maskNext" mask-type="alpha" maskUnits="userSpaceOnUse" x="8" y="6" width="8" height="12"> <path d="M8.59814 16.59L13.1557 12L8.59814 7.41L10.0012 6L15.9718 12L10.0012 18L8.59814 16.59Z" fill="white"/> </mask> <g mask="url(#maskNext)"> <rect x="0.34375" width="23.8822" height="24" fill="#FFFFFF"/> </g> </svg> </div> </div> <!-- The main close buton --> <div class="jp-carousel-close-hint"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="maskClose" mask-type="alpha" maskUnits="userSpaceOnUse" x="5" y="5" width="15" height="14"> <path d="M19.3166 6.41L17.9135 5L12.3509 10.59L6.78834 5L5.38525 6.41L10.9478 12L5.38525 17.59L6.78834 19L12.3509 13.41L17.9135 19L19.3166 17.59L13.754 12L19.3166 6.41Z" fill="white"/> </mask> <g mask="url(#maskClose)"> <rect x="0.409668" width="23.8823" height="24" fill="#FFFFFF"/> </g> </svg> </div> <!-- Image info, comments and meta --> <div class="jp-carousel-info"> <div class="jp-carousel-info-footer"> <div class="jp-carousel-pagination-container"> <div class="jp-swiper-pagination swiper-pagination"></div> <div class="jp-carousel-pagination"></div> </div> <div class="jp-carousel-photo-title-container"> <h2 class="jp-carousel-photo-caption"></h2> </div> <div class="jp-carousel-photo-icons-container"> <a href="#" class="jp-carousel-icon-btn jp-carousel-icon-info" aria-label="Toggle photo metadata visibility"> <span class="jp-carousel-icon"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="maskInfo" mask-type="alpha" maskUnits="userSpaceOnUse" x="2" y="2" width="21" height="20"> <path fill-rule="evenodd" clip-rule="evenodd" d="M12.7537 2C7.26076 2 2.80273 6.48 2.80273 12C2.80273 17.52 7.26076 22 12.7537 22C18.2466 22 22.7046 17.52 22.7046 12C22.7046 6.48 18.2466 2 12.7537 2ZM11.7586 7V9H13.7488V7H11.7586ZM11.7586 11V17H13.7488V11H11.7586ZM4.79292 12C4.79292 16.41 8.36531 20 12.7537 20C17.142 20 20.7144 16.41 20.7144 12C20.7144 7.59 17.142 4 12.7537 4C8.36531 4 4.79292 7.59 4.79292 12Z" fill="white"/> </mask> <g mask="url(#maskInfo)"> <rect x="0.8125" width="23.8823" height="24" fill="#FFFFFF"/> </g> </svg> </span> </a> <a href="#" class="jp-carousel-icon-btn jp-carousel-icon-comments" aria-label="Toggle photo comments visibility"> <span class="jp-carousel-icon"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="maskComments" mask-type="alpha" maskUnits="userSpaceOnUse" x="2" y="2" width="21" height="20"> <path fill-rule="evenodd" clip-rule="evenodd" d="M4.3271 2H20.2486C21.3432 2 22.2388 2.9 22.2388 4V16C22.2388 17.1 21.3432 18 20.2486 18H6.31729L2.33691 22V4C2.33691 2.9 3.2325 2 4.3271 2ZM6.31729 16H20.2486V4H4.3271V18L6.31729 16Z" fill="white"/> </mask> <g mask="url(#maskComments)"> <rect x="0.34668" width="23.8823" height="24" fill="#FFFFFF"/> </g> </svg> <span class="jp-carousel-has-comments-indicator" aria-label="This image has comments."></span> </span> </a> </div> </div> <div class="jp-carousel-info-extra"> <div class="jp-carousel-info-content-wrapper"> <div class="jp-carousel-photo-title-container"> <h2 class="jp-carousel-photo-title"></h2> </div> <div class="jp-carousel-comments-wrapper"> <div id="jp-carousel-comments-loading"> <span>Loading Comments...</span> </div> <div class="jp-carousel-comments"></div> <div id="jp-carousel-comment-form-container"> <span id="jp-carousel-comment-form-spinner"> </span> <div id="jp-carousel-comment-post-results"></div> <form id="jp-carousel-comment-form"> <label for="jp-carousel-comment-form-comment-field" class="screen-reader-text">Write a Comment...</label> <textarea name="comment" class="jp-carousel-comment-form-field jp-carousel-comment-form-textarea" id="jp-carousel-comment-form-comment-field" placeholder="Write a Comment..." ></textarea> <div id="jp-carousel-comment-form-submit-and-info-wrapper"> <div id="jp-carousel-comment-form-commenting-as"> <fieldset> <label for="jp-carousel-comment-form-email-field">Email (Required)</label> <input type="text" name="email" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-email-field" /> </fieldset> <fieldset> <label for="jp-carousel-comment-form-author-field">Name (Required)</label> <input type="text" name="author" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-author-field" /> </fieldset> <fieldset> <label for="jp-carousel-comment-form-url-field">Website</label> <input type="text" name="url" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-url-field" /> </fieldset> </div> <input type="submit" name="submit" class="jp-carousel-comment-form-button" id="jp-carousel-comment-form-button-submit" value="Post Comment" /> </div> </form> </div> </div> <div class="jp-carousel-image-meta"> <div class="jp-carousel-title-and-caption"> <div class="jp-carousel-photo-info"> <h3 class="jp-carousel-caption" itemprop="caption description"></h3> </div> <div class="jp-carousel-photo-description"></div> </div> <ul class="jp-carousel-image-exif" style="display: none;"></ul> <a class="jp-carousel-image-download" href="#" target="_blank" style="display: none;"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="3" y="3" width="19" height="18"> <path fill-rule="evenodd" clip-rule="evenodd" d="M5.84615 5V19H19.7775V12H21.7677V19C21.7677 20.1 20.8721 21 19.7775 21H5.84615C4.74159 21 3.85596 20.1 3.85596 19V5C3.85596 3.9 4.74159 3 5.84615 3H12.8118V5H5.84615ZM14.802 5V3H21.7677V10H19.7775V6.41L9.99569 16.24L8.59261 14.83L18.3744 5H14.802Z" fill="white"/> </mask> <g mask="url(#mask0)"> <rect x="0.870605" width="23.8823" height="24" fill="#FFFFFF"/> </g> </svg> <span class="jp-carousel-download-text"></span> </a> <div class="jp-carousel-image-map" style="display: none;"></div> </div> </div> </div> </div> </div> </div> <link crossorigin='anonymous' rel='stylesheet' id='all-css-0-2' href='https://s2.wp.com/_static/??-eJydjEEKgCAQAD+UrR6KLtFbTJfQdJXWxe9HUB/oOMMw0KtyhRpSgyyqJjkCMURs1brzZWAhyMVLQgZnryKMCbiHipfahXzC0TEP8H/2NZ94fltezbxMxkx61vEGx+U/hQ==&cssminify=yes' type='text/css' media='all' /> <script id="coblocks-loader-js-extra"> var wpcom_coblocks_js = {"coblocks_masonry_js":"https:\/\/s2.wp.com\/wp-content\/plugins\/coblocks\/2.18.1-simple-rev.4\/dist\/js\/coblocks-masonry.min.js","coblocks_lightbox_js":"https:\/\/s2.wp.com\/wp-content\/plugins\/coblocks\/2.18.1-simple-rev.4\/dist\/js\/coblocks-lightbox.min.js","jquery_core_js":"\/wp-includes\/js\/jquery\/jquery.min.js","jquery_migrate_js":"\/wp-includes\/js\/jquery\/jquery-migrate.min.js","masonry_js":"\/wp-includes\/js\/masonry.min.js","imagesloaded_js":"\/wp-includes\/js\/imagesloaded.min.js"}; var coblocksLigthboxData = {"closeLabel":"Close Gallery","leftLabel":"Previous","rightLabel":"Next"}; </script> <script id="twentysixteen-script-js-extra"> var screenReaderText = {"expand":"expand child menu","collapse":"collapse child menu"}; </script> <script id="jetpack-carousel-js-extra"> var jetpackSwiperLibraryPath = {"url":"https:\/\/s2.wp.com\/wp-content\/mu-plugins\/jetpack-plugin\/sun\/_inc\/build\/carousel\/swiper-bundle.min.js"}; var jetpackCarouselStrings = {"widths":[370,700,1000,1200,1400,2000],"is_logged_in":"","lang":"en","ajaxurl":"https:\/\/blog.metabrainz.org\/wp-admin\/admin-ajax.php","nonce":"1f9ca57389","display_exif":"1","display_comments":"1","single_image_gallery":"1","single_image_gallery_media_file":"","background_color":"black","comment":"Comment","post_comment":"Post Comment","write_comment":"Write a Comment...","loading_comments":"Loading Comments...","image_label":"Open image in full-screen.","download_original":"View full size <span class=\"photo-size\">{0}<span class=\"photo-size-times\">\u00d7<\/span>{1}<\/span>","no_comment_text":"Please be sure to submit some text with your comment.","no_comment_email":"Please provide an email address to comment.","no_comment_author":"Please provide your name to comment.","comment_post_error":"Sorry, but there was an error posting your comment. Please try again later.","comment_approved":"Your comment was approved.","comment_unapproved":"Your comment is in moderation.","camera":"Camera","aperture":"Aperture","shutter_speed":"Shutter Speed","focal_length":"Focal Length","copyright":"Copyright","comment_registration":"0","require_name_email":"1","login_url":"https:\/\/musicbrainz.wordpress.com\/wp-login.php?redirect_to=https%3A%2F%2Fblog.metabrainz.org%2F2020%2F08%2F30%2Fgsoc-2020-adding-statistics-and-graphs-for-listenbrainz-users-and-community%2F","blog_id":"1935472","meta_data":["camera","aperture","shutter_speed","focal_length","copyright"],"stats_query_args":"blog=1935472&v=wpcom&tz=0&user_id=0&subd=musicbrainz","is_public":"1"}; </script> <script crossorigin='anonymous' type='text/javascript' src='https://s0.wp.com/_static/??-eJyVkEFOxDAMRS+EYzKDChvEUVCbuoPbxI7qhA63JyCKRhUblv5670vfuGUIKoWk4GyYdOBIUI3W/tIyYJnUzXaHN1yO9cJiGHSIGhbDk/NPzoNxyk1e6d094Mj23bhDELUfaXWJ5dhX3iiRYa4Dlq0FH8bXQiRfui2cIbIsMGmoBhNf/6NPVUJhFTtKqcI+Y6aS+7D83GhV8JUl4FA5jhj6Vds74i+2B38tuWndMdhy0HQ4m/eSnv3j+d777tR18yev6pFs'></script> <script type="text/javascript"> (function () { var wpcom_reblog = { source: 'toolbar', toggle_reblog_box_flair: function (obj_id, post_id) { // Go to site selector. This will redirect to their blog if they only have one. const postEndpoint = `https://wordpress.com/post`; // Ideally we would use the permalink here, but fortunately this will be replaced with the // post permalink in the editor. const originalURL = `${ document.location.href }?page_id=${ post_id }`; const url = postEndpoint + '?url=' + encodeURIComponent( originalURL ) + '&is_post_share=true' + '&v=5'; const redirect = function () { if ( ! window.open( url, '_blank' ) ) { location.href = url; } }; if ( /Firefox/.test( navigator.userAgent ) ) { setTimeout( redirect, 0 ); } else { redirect(); } }, }; window.wpcom_reblog = wpcom_reblog; })(); </script> <script type="text/javascript"> // <![CDATA[ (function() { try{ if ( window.external &&'msIsSiteMode' in window.external) { if (window.external.msIsSiteMode()) { var jl = document.createElement('script'); jl.type='text/javascript'; jl.async=true; jl.src='/wp-content/plugins/ie-sitemode/custom-jumplist.php'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(jl, s); } } }catch(e){} })(); // ]]> </script><script src="//stats.wp.com/w.js?67" defer></script> <script type="text/javascript"> _tkq = window._tkq || []; _stq = window._stq || []; _tkq.push(['storeContext', {'blog_id':'1935472','blog_tz':'0','user_lang':'en','blog_lang':'en','user_id':'0'}]); _stq.push(['view', {'blog':'1935472','v':'wpcom','tz':'0','user_id':'0','subd':'musicbrainz'}]); _stq.push(['extra', {'crypt':'UE40eW5QN0p8M2Y/RE1mNzc2NTVTamdsd0xoLz9RQkM2K298TXY9bERQMXc2MjhEaVZfb2wwakRoSj0mUkp1THptM1NdbkV1WjZIcU9mVWQmPUIvMlN6Jk8wW3NYVEJ3dWZOWExuWD9VNTEucGUwVDREUEpscXB+Y21XfHZTPUZ+WV0/Nnl8WzRRL0oreG1XYVpiaUVMdGs4NnxUbS9pRTZ4N2hMeHdHcm5kTGRkZ1AuYml2ZWcsaHZBfD9RSmRldGUrWnxUWW4sLStuWXJZNFFMQ1pNNyZ6b3NGOE85anYyd0RMUit8SVMmdlJLR0hjMGolT0wzJmcxNjNiLE5KenFYRkdoYnN1dlRyTi1CN21DeU15K28xd255UUh+LG5FQiZRW1BmYUUtckRdPW15fDN5Njg='}]); _stq.push([ 'clickTrackerInit', '1935472', '0' ]); </script> <noscript><img src="https://pixel.wp.com/b.gif?v=noscript" style="height:1px;width:1px;overflow:hidden;position:absolute;bottom:1px;" alt="" /></noscript> <script defer id="bilmur" data-customproperties="{"logged_in":"0","wptheme":"pub\/twentysixteen","wptheme_is_block":"0"}" data-provider="wordpress.com" data-service="simple" src="/wp-content/js/bilmur.min.js?i=12&m=202448"></script><script defer id="bilmur" data-customproperties="{"logged_in":"0","wptheme":"pub\/twentysixteen","wptheme_is_block":"0"}" data-provider="wordpress.com" data-service="simple" src="/wp-content/js/bilmur-4.min.js?i=12&m=202448"></script><script> ( function() { function getMobileUserAgentInfo() { if ( typeof wpcom_mobile_user_agent_info === 'object' ) { wpcom_mobile_user_agent_info.init(); var mobileStatsQueryString = ''; if ( wpcom_mobile_user_agent_info.matchedPlatformName !== false ) { mobileStatsQueryString += '&x_' + 'mobile_platforms' + '=' + wpcom_mobile_user_agent_info.matchedPlatformName; } if ( wpcom_mobile_user_agent_info.matchedUserAgentName !== false ) { mobileStatsQueryString += '&x_' + 'mobile_devices' + '=' + wpcom_mobile_user_agent_info.matchedUserAgentName; } if ( wpcom_mobile_user_agent_info.isIPad() ) { mobileStatsQueryString += '&x_' + 'ipad_views' + '=' + 'views'; } if ( mobileStatsQueryString != '' ) { new Image().src = document.location.protocol + '//pixel.wp.com/g.gif?v=wpcom-no-pv' + mobileStatsQueryString + '&baba=' + Math.random(); } } } document.addEventListener( 'DOMContentLoaded', getMobileUserAgentInfo ); } )(); </script></body> </html>