Gazelle/static/functions/musicbrainz.js

430 lines
11 KiB
JavaScript
Raw Normal View History

2012-04-08 08:00:25 +00:00
/**
2013-06-23 08:00:54 +00:00
* Allows the user to populate upload form using MusicBrainz.
2012-04-08 08:00:25 +00:00
* Popup display code based on example found here http://yensdesign.com/2008/09/how-to-create-a-stunning-and-smooth-popup-using-jquery/
*
* @author Gwindow
*
* TODO Center dynamically based on scroll position
*/
2013-06-27 08:01:06 +00:00
(function() {
2012-04-08 08:00:25 +00:00
//global variables
var $year_release_group;
var $release_type;
var $release_group_id;
var $tags;
var $year_release;
var $catalog_number;
var $record_label;
var $searched = false;
// controls popup state
var $popup_state = 0;
var $musicbrainz_state = 0;
$(document).ready(function() {
2013-04-18 08:00:54 +00:00
loadCSS();
enableMusicBrainzButton();
controlPopup();
$("#musicbrainz_button").click(function() {
var $album = $("#title").val();
var $artist = $("#artist").val();
if ($artist.length > 0 || $album.length > 0) {
jQuery('#results1').empty();
jQuery('#results2').empty();
jQuery('#results1').show();
jQuery('#results2').show();
$searched = true;
var $artist_encoded = encodeURIComponent($artist);
var $album_encoded = encodeURIComponent($album);
$.ajax({
type: "GET",
2013-06-23 08:00:54 +00:00
url : "https://musicbrainz.org/ws/2/release-group/?query=artist:%22" + $artist_encoded + "%22%20AND%20releasegroup:%22" + $album_encoded + "%22",
2013-04-18 08:00:54 +00:00
dataType: "xml",
success: showReleaseGroups
});
2013-06-23 08:00:54 +00:00
} else {
alert("Please fill out artist and/or album fields.");
}
2013-04-18 08:00:54 +00:00
});
2012-04-08 08:00:25 +00:00
2013-04-18 08:00:54 +00:00
$("#results1").click(function(event) {
var $id = event.target.id;
if ($id != "results1") {
jQuery('#results1').hide();
jQuery('#results2').empty();
jQuery('#results2').show();
jQuery('#popup_back').empty();
$.ajax({
type: "GET",
url: "https://musicbrainz.org/ws/2/release-group/" + $id + "?inc=artist-credits%2Breleases+tags+media",
dataType: "xml",
success: showReleases
});
}
});
$("#results2").click(function(event) {
var $id = event.target.id;
if ($id != "mb" && $id != "results2") {
jQuery('#results2').empty();
jQuery('#results2').show();
$.ajax({
type: "GET",
url: "https://musicbrainz.org/ws/2/release/" + $id + "?inc=artist-credits%2Blabels%2Bdiscids%2Brecordings+tags+media+label-rels",
dataType: "xml",
success: populateForm
});
}
});
$("#popup_back").click(function(event) {
var $id = event.target.id;
if ($id == "back" ) {
jQuery('#results2').hide();
jQuery('#results1').show();
jQuery('#popup_back').empty();
jQuery('#popup_title').text("Choose Release Group");
}
});
$("#remaster").click(function(event) {
if ($("#remaster").attr("checked") && $searched == true) {
populateEditionsForm();
} else if ($searched == true) {
depopulateEditionsForm();
}
2012-04-08 08:00:25 +00:00
});
2013-04-18 08:00:54 +00:00
});
2012-04-08 08:00:25 +00:00
/**
* Shows the release groups
* @param xml
*/
2013-04-18 08:00:54 +00:00
function showReleaseGroups(xml) {
var $count = $(xml).find("release-group-list").attr("count");
if ($count == 0 ) {
alert("Could not find on MusicBrainz");
} else {
2013-06-23 08:00:54 +00:00
jQuery('#popup_title').text("Choose release group");
2013-04-18 08:00:54 +00:00
openPopup();
}
$(xml).find("release-group").each(function() {
var $title = $(this).find("title:first").text();
var $artist = $(this).find("name:first").text();
var $type = $(this).attr("type");
var $score = $(this).attr("ext:score");
var $releaseId = $(this).attr("id");
2013-06-13 08:01:05 +00:00
var $result = $artist + " - " + $title + " [Type: " + $type + ", Score: " + $score + "]"
$('<a href="#null">' + $result + "<p />").attr("id", $releaseId).appendTo("#results1");
2013-04-18 08:00:54 +00:00
});
2012-04-08 08:00:25 +00:00
}
/**
* Shows releases inside a release group
* @param xml
*/
function showReleases(xml) {
2013-04-18 08:00:54 +00:00
var $date_release_group = $(xml).find("first-release-date").text();
$year_original = $date_release_group.substring(0,4);
$release_type = $(xml).find("release-group").attr("type");
$release_group_id = $(xml).find("release-group").attr("id");
2013-06-23 08:00:54 +00:00
jQuery('#popup_title').html("Choose release " + '<a href="https://musicbrainz.org/release-group/'
2013-06-12 08:00:46 +00:00
+ $release_group_id + '" target="_new" class="brackets">View on MusicBrainz</a>');
jQuery('#popup_back').html('<a href="#null" id="back" class="brackets">Go back</a>');
2013-04-18 08:00:54 +00:00
$(xml).find("release").each(function() {
var $release_id = $(this).attr("id");
var $title = $(this).find("title").text();
var $status = $(this).find("status").text();
var $date = $(this).find("date").text();
var $year = $date.substring(0,4);
var $country = $(this).find("country").text();
var $format; var $tracks;
$(this).find("medium-list").each(function() {
$(this).find("medium").each(function() {
$format = $(this).find("format").text();
$(this).find("track-list").each(function() {
$tracks = $(this).attr("count");
});
});
});
2013-06-13 08:01:05 +00:00
var $result = $title + " [Year: " + $year + ", Format: " + $format + ", Tracks: " + $tracks + ", Country: " + $country + "]";
2013-06-12 08:00:46 +00:00
$('<a href="#null">' + $result + "</a>").attr("id", $release_id).appendTo("#results2");
2013-04-18 08:00:54 +00:00
2013-06-12 08:00:46 +00:00
$('<a href="https://musicbrainz.org/release/' + $release_id +'" target="_new" class="brackets">View on MusicBrainz</a>' + "<p />").attr("id", "mb").appendTo("#results2");
2012-04-08 08:00:25 +00:00
});
2013-02-22 08:00:24 +00:00
2012-04-08 08:00:25 +00:00
parseTags(xml);
}
2013-04-18 08:00:54 +00:00
/**
* Parses the tags to the gazelle conventions
* @param xml
*/
function parseTags(xml) {
$tags = "";
$(xml).find("tag").each(function() {
2013-06-13 08:01:05 +00:00
$tag = cleanTag($(this).find("name").text());
2013-04-18 08:00:54 +00:00
if (isValidTag($tag)) {
$tags += "," + $tag;
}
2012-04-08 08:00:25 +00:00
});
2013-04-18 08:00:54 +00:00
if ($tags.charAt(0) == ',') {
$tags = $tags.substring(1);
}
}
2012-04-08 08:00:25 +00:00
2013-04-18 08:00:54 +00:00
function cleanTag($t) {
2012-04-08 08:00:25 +00:00
$t = $t.replace(/ +(?= )/g,',');
2013-04-18 08:00:54 +00:00
$t = $t.replace('-','.');
$t = $t.replace(' ','.');
2012-04-08 08:00:25 +00:00
return $t;
2013-04-18 08:00:54 +00:00
}
/**
* Populates the upload form
* @param xml
*/
function populateForm(xml) {
closePopup();
var $release_id = $(xml).find("release").attr("id");
var $release_title = $(xml).find("release").find("title:first").text();
var $artist = $(xml).find("artist-credit:first").find("name:first").text();
var $date = $(xml).find("release").find("date").text();
$year_release = $date.substring(0,4);
var $country = $(xml).find("country").text();
var $asin = $(xml).find("asin").text();
var $barcode = $(xml).find("barcode").text();
$catalog_number = $(xml).find("catalog-number").text();
$record_label = $(xml).find("label").find("sort-name").text();
var $track_count = $(xml).find("track-list").attr("count");
var $track_titles = new Array();
$(xml).find("track-list").find("title").each(function() {
var $title = $(this).text();
$track_titles.push($title);
});
2013-02-22 08:00:24 +00:00
2013-04-18 08:00:54 +00:00
clear();
$("#artist").val($artist);
$("#title").val($release_title);
$("#year").val($year_original);
$("#record_label").val($record_label);
$("#catalogue_number").val($catalog_number);
$("#tags").val($tags);
$("#releasetype").val(getReleaseType());
var $amazon_link = "";
if ($asin.length > 0) {
2013-06-23 08:00:54 +00:00
$amazon_link = "[url=http://www.amazon.com/exec/obidos/ASIN/" + $asin + "]Amazon[/url]" + "\n";
2013-04-18 08:00:54 +00:00
}
var $country_text = "";
if ($country.length > 0) {
2013-06-13 08:01:05 +00:00
$country_text = "Country: " + $country + "\n";
2013-04-18 08:00:54 +00:00
}
var $barcode_text = "";
if ($barcode.length > 0) {
2013-06-13 08:01:05 +00:00
$barcode_text = "Barcode: " + $barcode + "\n";
2013-04-18 08:00:54 +00:00
}
var $description = $amazon_link +
"[url=https://musicbrainz.org/release-group/" + $release_group_id + "]MusicBrainz[/url]" + "\n" + "\n" +
$country_text +
$barcode_text +
"Tracks: " + $track_count + "\n" + "\n" +
2013-06-12 08:00:46 +00:00
"Track list:" + "\n";
2013-04-18 08:00:54 +00:00
for (var i = 0; i < $track_titles.length; i++) {
$description = $description + "[#]" + $track_titles[i] + "\n";
};
$("#album_desc").val($description);
}
function populateEditionsForm() {
$('#remaster_true').show();
$("#record_label").val("");
$("#catalogue_number").val("");
$("#remaster_year").val($year_release);
$("#remaster_record_label").val($record_label);
$("#remaster_catalogue_number").val($catalog_number);
2012-04-08 08:00:25 +00:00
}
2013-04-18 08:00:54 +00:00
function depopulateEditionsForm() {
$("#record_label").val($record_label);
$("#catalogue_number").val($catalog_number);
$("#remaster_year").val("");
$("#remaster_record_label").val("");
$("#remaster_catalogue_number").val("");
2012-04-08 08:00:25 +00:00
}
2013-02-22 08:00:24 +00:00
2013-04-18 08:00:54 +00:00
function closeEditionsForm() {
if ($("#remaster").attr("checked")) {
$('#remaster_true').hide();
}
$("#remaster").attr("checked", false);
$("#remaster_year").val("");
$("#remaster_record_label").val("");
$("#remaster_catalogue_number").val("");
}
/**
* Gets the release type
* @returns value of type
*/
function getReleaseType() {
var $value;
switch ($release_type) {
case "Album":
$value = 1;
break;
case "Soundtrack":
$value = 3;
break;
case "EP":
$value = 5;
break;
case "Compilation":
$value = 7;
break;
case "Single":
$value = 9;
break;
case "Live":
$value = 11;
break;
case "Remix":
$value = 13;
break;
case "Interview":
$value = 15;
break;
default:
$value = "---";
break;
}
return $value;
}
/**
* Enables the musicbrainz button only when the "Music" type is selected and a format isn't being uploaded
*/
function enableMusicBrainzButton() {
if ($('#categories').is(':disabled') == false) {
$("#categories").click(function() {
if ($("#categories").val() != 0 ) {
$("#musicbrainz_button").attr("disabled", "disabled");
} else {
$("#musicbrainz_button").removeAttr("disabled");
}
});
} else {
$("#musicbrainz_button").attr("disabled", "disabled");
}
}
/**
* Clears fields in the upload form
*/
function clear() {
closeEditionsForm();
$("#artist").val("");
$("#title").val("");
$("#year").val("");
$("#record_label").val("");
$("#catalogue_number").val("");
$("#tags").val("");
$("#releasetype").val("");
$("#album_desc").val("");
$("#remaster_year").val("");
$("#remaster_record_label").val("");
$("#remaster_catalogue_number").val("");
}
/**
* Loads the popup
* @returns
*/
function openPopup() {
centerPopup();
if ($popup_state == 0) {
$("#popup_background").css({
"opacity": "0.7"
});
$("#popup_background").fadeIn("fast");
$("#musicbrainz_popup").fadeIn("fast");
$popup_state = 1;
}
}
/**
* Closes the popup
* @returns
*/
function closePopup() {
if ($popup_state == 1) {
$("#popup_background").fadeOut("fast");
$("#musicbrainz_popup").fadeOut("fast");
2012-04-08 08:00:25 +00:00
jQuery('#popup_back').html("");
2013-04-18 08:00:54 +00:00
$popup_state = 0;
2012-04-08 08:00:25 +00:00
}
2013-04-18 08:00:54 +00:00
}
2012-04-08 08:00:25 +00:00
2013-04-18 08:00:54 +00:00
/**
* Centers the popup on the screen
* @returns
*/
function centerPopup() {
2012-04-08 08:00:25 +00:00
//TODO Center dynamically based on scroll position
2013-04-18 08:00:54 +00:00
var windowWidth = document.documentElement.clientWidth;
var windowHeight = document.documentElement.clientHeight;
var popupHeight = $("#musicbrainz_popup").height();
2012-04-08 08:00:25 +00:00
var scrollPosition = window.pageYOffset;
var percentage = (scrollPosition/windowHeight) * 100;
2013-04-18 08:00:54 +00:00
var popupWidth = $("#musicbrainz_popup").width();
$("#musicbrainz_popup").css({
"position": "absolute ! important",
2012-04-08 08:00:25 +00:00
//"top": windowHeight/2-popupHeight/2,
2013-04-18 08:00:54 +00:00
"left": windowWidth/2-popupWidth/2 + "! important"
});
2012-04-08 08:00:25 +00:00
2013-04-18 08:00:54 +00:00
$("#popup_background").css({
"height": windowHeight
});
}
2012-04-08 08:00:25 +00:00
2013-04-18 08:00:54 +00:00
/**
* Controls the popup state based on user input
* @returns
*/
function controlPopup() {
$("#popup_close").click(function() {
closePopup();
});
2012-04-08 08:00:25 +00:00
2013-04-18 08:00:54 +00:00
$(document).keypress(function(e) {
if (e.keyCode == 27 && $popup_state == 1) {
closePopup();
}
});
}
function loadCSS() {
var $link = document.createElement('link')
$link.href = 'static/styles/musicbrainz.css';
$link.rel = 'stylesheet';
$link.type = 'text/css';
document.body.appendChild($link);
$link = null;
}
2012-04-08 08:00:25 +00:00
2013-06-27 08:01:06 +00:00
})();