diff --git a/bandcamp_importer.user.js b/bandcamp_importer.user.js index f538522..4a881eb 100644 --- a/bandcamp_importer.user.js +++ b/bandcamp_importer.user.js @@ -8,8 +8,9 @@ // @include http*://*.bandcamp.com/album/* // @include http*://*.bandcamp.com/track/* // @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js -// @require https://raw.github.com/murdos/musicbrainz-userscripts/master/lib/import_functions.js -// @require https://raw.github.com/murdos/musicbrainz-userscripts/master/lib/logger.js +// @require lib/import_functions.js +// @require lib/logger.js +// @require lib/mblinks.js // @grant None // ==/UserScript== @@ -202,107 +203,6 @@ var BandcampImport = { } }; -var MBLinks = function (cachekey, expiration) { - this.supports_local_storage = function () { - try { - return !!localStorage.getItem; - } catch (e) { - return false; - } - }(); - - this.ajax_requests = []; - this.cache = {}; - this.expirationMinutes = parseInt(expiration); - this.cache_key = cachekey; - - this.initAjaxEngine = function () { - var ajax_requests = this.ajax_requests; - setInterval(function () { - if (ajax_requests.length > 0) { - var request = ajax_requests.shift(); - if (typeof request === "function") { - request(); - } - } - }, 1000); - }; - - this.initCache = function () { - if (!this.supports_local_storage) return; - // Check if we already added links for this content - var cache_string = localStorage.getItem(this.cache_key); - if (!cache_string) { - cache_string = "{}"; - } - this.cache = JSON.parse(cache_string); - }; - - this.saveCache = function () { - if (!this.supports_local_storage) return; - try { - localStorage.setItem(this.cache_key, JSON.stringify(this.cache)); - } catch (e) { - alert(e); - } - }, - - this.createMusicBrainzLink = function (mb_url, mb_type) { - return ' '; - }; - - this.searchAndDisplayMbLink = function (url, mb_type, insert_func) { - var mblinks = this; - - if (mb_type != 'artist' && mb_type != 'release' && mb_type != 'label' && mb_type != 'release-group') { - return; - } - - if (mblinks.cache[url] - && mblinks.expirationMinutes > 0 - && new Date().getTime() < mblinks.cache[url].timestamp) { - $.each(mblinks.cache[url].urls, function (idx, mb_url) { - insert_func(mblinks.createMusicBrainzLink(mb_url, mb_type)); - }); - } else { - mblinks.ajax_requests.push($.proxy(function () { - var context = this; - $.getJSON('//musicbrainz.org/ws/2/url?resource=' + context.url + '&inc=' + context.mb_type + - '-rels', - function (data) { - if ('relations' in data) { - var expires = new Date().getTime() + (mblinks.expirationMinutes * 60 * 1000); - mblinks.cache[context.url] = { - timestamp: expires, - urls: [] - }; - $.each(data['relations'], function (idx, relation) { - if (context.mb_type.replace('-', '_') in relation) { - var mb_url = '//musicbrainz.org/' + context.mb_type + '/' + relation[context.mb_type.replace('-', '_')]['id']; - if ($.inArray(mb_url, mblinks.cache[context.url].urls) == -1) { // prevent dupes - mblinks.cache[context.url].urls.push(mb_url); - mblinks.saveCache(); - context.insert_func(mblinks.createMusicBrainzLink(mb_url, mb_type)); - } - } - }); - } - }); - }, { - 'url': url, - 'insert_func': insert_func, - 'mb_type': mb_type - })); - } - }; - - this.initCache(); - this.initAjaxEngine(); - - return this; -}; - $(document).ready(function () { var mblinks = new MBLinks('BCI_MBLINKS_CACHE', 7*24*60); // force refresh of cached links once a week diff --git a/lib/mblinks.js b/lib/mblinks.js new file mode 100644 index 0000000..34fbb9b --- /dev/null +++ b/lib/mblinks.js @@ -0,0 +1,120 @@ +// Class MBLinks : query MusicBrainz for urls and display links for matching urls +// The main method is searchAndDisplayMbLink() + +// Example: +// $(document).ready(function () { +// +// var mblinks = new MBLinks('EXAMPLE_MBLINKS_CACHE', 7*24*60); // force refresh of cached links once a week +// +// var artist_link = 'http://' + window.location.href.match( /^https?:\/\/(.*)\/album\/.+$/i)[1]; +// mblinks.searchAndDisplayMbLink(artist_link, 'artist', function (link) { $('div#there').before(link); } ); +// +// var album_link = 'http://' + window.location.href.match( /^https?:\/\/(.*\/album\/.+)$/i)[1]; +// mblinks.searchAndDisplayMbLink(album_link, 'release', function (link) { $('div#there').after(link); } ); +// } + +// cachekey = textual key used to store cached data in local storage +// expiration = time in minutes before an entry is refreshed, value <= 0 disables cache reads +var MBLinks = function (cachekey, expiration) { + this.supports_local_storage = function () { + try { + return !!localStorage.getItem; + } catch (e) { + return false; + } + }(); + + this.ajax_requests = []; + this.cache = {}; + this.expirationMinutes = parseInt(expiration); + this.cache_key = cachekey; + + this.initAjaxEngine = function () { + var ajax_requests = this.ajax_requests; + setInterval(function () { + if (ajax_requests.length > 0) { + var request = ajax_requests.shift(); + if (typeof request === "function") { + request(); + } + } + }, 1000); + }; + + this.initCache = function () { + if (!this.supports_local_storage) return; + // Check if we already added links for this content + var cache_string = localStorage.getItem(this.cache_key); + if (!cache_string) { + cache_string = "{}"; + } + this.cache = JSON.parse(cache_string); + }; + + this.saveCache = function () { + if (!this.supports_local_storage) return; + try { + localStorage.setItem(this.cache_key, JSON.stringify(this.cache)); + } catch (e) { + alert(e); + } + }, + + this.createMusicBrainzLink = function (mb_url, mb_type) { + return ' '; + }; + + // Search for ressource 'url' on MB, for relation of type 'mb_type' (artist, release, label, release-group) + // and call 'insert_func' function with matching MB links (a tag built in createMusicBrainzLink) for each + // entry found + this.searchAndDisplayMbLink = function (url, mb_type, insert_func) { + var mblinks = this; + + if (mb_type != 'artist' && mb_type != 'release' && mb_type != 'label' && mb_type != 'release-group') { + return; + } + + if (mblinks.cache[url] + && mblinks.expirationMinutes > 0 + && new Date().getTime() < mblinks.cache[url].timestamp) { + $.each(mblinks.cache[url].urls, function (idx, mb_url) { + insert_func(mblinks.createMusicBrainzLink(mb_url, mb_type)); + }); + } else { + mblinks.ajax_requests.push($.proxy(function () { + var context = this; + $.getJSON('//musicbrainz.org/ws/2/url?resource=' + context.url + '&inc=' + context.mb_type + + '-rels', + function (data) { + if ('relations' in data) { + var expires = new Date().getTime() + (mblinks.expirationMinutes * 60 * 1000); + mblinks.cache[context.url] = { + timestamp: expires, + urls: [] + }; + $.each(data['relations'], function (idx, relation) { + if (context.mb_type.replace('-', '_') in relation) { + var mb_url = '//musicbrainz.org/' + context.mb_type + '/' + relation[context.mb_type.replace('-', '_')]['id']; + if ($.inArray(mb_url, mblinks.cache[context.url].urls) == -1) { // prevent dupes + mblinks.cache[context.url].urls.push(mb_url); + mblinks.saveCache(); + context.insert_func(mblinks.createMusicBrainzLink(mb_url, mb_type)); + } + } + }); + } + }); + }, { + 'url': url, + 'insert_func': insert_func, + 'mb_type': mb_type + })); + } + }; + + this.initCache(); + this.initAjaxEngine(); + + return this; +};