|
- // ==UserScript==
- // @name SM :: Import JSON to Upload Form
- // @version 0.0.1
- // @description Adds buttons to attach and parse a .json file from RED or OPS to fill in the upload form.
- // @author herbert (original: newstarshipsmell)
- // @include /https://sugoimusic\.me/upload\.php/
- // @grant none
- // ==/UserScript==
-
- (function() {
- 'use strict';
- var sourceWebsites = ['RED', 'OPS'];
- var sourceWebsiteDomains = ['redacted.ch', 'orpheus.network'];
- var sourceWebsite, sourceWebsiteIndex;
- var JSONReleaseTypes = {
- 'RED': {
- '1': 'Album',
- '3': 'Soundtrack',
- '5': 'EP',
- '6': 'Anthology',
- '7': 'Compilation',
- '9': 'Single',
- '11': 'Live album',
- '13': 'Remix',
- '14': 'Bootleg',
- '15': 'Interview',
- '16': 'Mixtape',
- '17': 'Demo',
- '18': 'Concert Recording',
- '19': 'DJ Mix',
- '21': 'Unknown'
- },
- 'OPS': {
- '1': 'Album',
- '3': 'Soundtrack',
- '5': 'EP',
- '6': 'Anthology',
- '7': 'Compilation',
- '9': 'Single',
- '11': 'Live album',
- '13': 'Remix',
- '14': 'Bootleg',
- '15': 'Interview',
- '16': 'Mixtape',
- '17': 'DJ Mix',
- '18': 'Concert recording',
- '21': 'Unknown'
- }
- };
-
- var ChooseTypeDropdown = document.getElementById('categories');
-
- var ChooseJSONTR = document.createElement('tr');
-
- var ChooseJSONTD = document.createElement('td');
- ChooseJSONTD.classList.add('label');
- ChooseJSONTD.textContent = 'JSON file:';
-
- var ChooseJSONBtnTD = document.createElement('td');
-
- var ChooseJSONBtn = document.createElement('input');
- ChooseJSONBtn.id = 'json';
- ChooseJSONBtn.type = 'file';
- ChooseJSONBtn.name = 'json_input';
- ChooseJSONBtn.accept = '.application/json,.json';
-
- var ChooseJSONParseBtn = document.createElement('input');
- ChooseJSONParseBtn.id = 'json_parse';
- ChooseJSONParseBtn.type = 'button';
- ChooseJSONParseBtn.name = 'json_parse';
- ChooseJSONParseBtn.value = 'Parse JSON';
-
- ChooseJSONTR.appendChild(ChooseJSONTD);
- ChooseJSONTR.appendChild(ChooseJSONBtnTD);
- ChooseJSONBtnTD.appendChild(ChooseJSONBtn);
- ChooseJSONBtnTD.appendChild(document.createTextNode(' | '));
- ChooseJSONBtnTD.appendChild(ChooseJSONParseBtn);
- ChooseTypeDropdown.parentNode.parentNode.parentNode.insertBefore(ChooseJSONTR, ChooseTypeDropdown.parentNode.parentNode);
-
- ChooseJSONParseBtn.addEventListener('click', function (evt) {
- var file = document.getElementById('json').files[0];
-
- if (file) {
- sourceWebsiteIndex = /.+ \[redacted\.ch\]\.json/.test(file.name) ? 0 : (/.+ \[orpheus\.network\]\.json/.test(file.name) ? 1 : -1);
- sourceWebsite = sourceWebsiteIndex > -1 && sourceWebsiteIndex < sourceWebsites.length ? sourceWebsites[sourceWebsiteIndex] : "N/A";
-
- if (sourceWebsite == 'N/A') {
- alert('The userscript failed to parse a supported website from the json filename! Aborting...')
- return;
-
- } else {
- var reader = new FileReader();
- reader.readAsText(file, "UTF-8");
- reader.onload = function (evt) {
- var releaseJSON = JSON.parse(evt.target.result);
-
- var categories = ['Music', 'Applications', 'E-Books', 'Audiobooks', 'E-Learning Videos', 'Comedy', 'Comics'];
- var category = document.getElementById('categories');
- var categoryJSON = parseInt(releaseJSON.response.group.categoryId);
- var categoryNameJSON = releaseJSON.response.group.categoryName;
- var categoryIndex = categories.indexOf(categoryNameJSON);
-
- if (categoryIndex > -1) {
- if (categoryIndex != 0) {
- alert('Currently only Music category torrents are supported. Aborting...');
- return;
- } else {
- category.selectedIndex = categories.indexOf(categoryNameJSON);
- }
- } else {
- alert('The category name indicated in the JSON (' + categoryNameJSON + ') is not one of the available category types! Aborting...');
- return;
- }
-
- switch(categoryIndex) {
- case 0:
- var artists = [];
- var artistRoles = [
- {'name': 'artists', 'index': 0},
- {'name': 'with', 'index': 1},
- {'name': 'composers', 'index': 2},
- {'name': 'conductor', 'index': 3},
- {'name': 'dj', 'index': 4},
- {'name': 'remixedBy', 'index': 5},
- {'name': 'producer', 'index': 6},
- ];
- var artistsJSON = releaseJSON.response.group.musicInfo;
-
- for (var i = 0, len = artistRoles.length; i < len; i++) {
- if (artistsJSON[artistRoles[i].name].length == 0) continue;
- for (var j = 0, lenj = artistsJSON[artistRoles[i].name].length; j < lenj; j++) {
- artists.push({'name': artistsJSON[artistRoles[i].name][j].name, 'index': artistRoles[i].index});
- }
- }
-
- if (artists.length > 0) {
- var artistInputs = [];
- artistInputs.length = artists.length;
- for (i = 0, len = artists.length; i < len; i++) {
- if (i > 0) window.eval('AddArtistField();');
- artistInputs[i] = document.getElementById('idols_' + i );
- artistInputs[i].value = artists[i].name;
- // SM does not support roles
- //var roles = document.querySelectorAll('td#artistfields > #importance');
- //roles[i].selectedIndex = artists[i].index;
- }
- } else {
- alert('No artists are included in the JSON!');
- }
-
- var albumTitle = document.getElementById('title');
- var albumTitleJSON = releaseJSON.response.group.name;
-
- if (albumTitleJSON != '') {
- albumTitle.value = albumTitleJSON;
- } else {
- alert('No album title is included in the JSON!');
- }
-
- var initialYear = document.getElementById('year');
- var initialYearJSON = releaseJSON.response.group.year;
-
- if (initialYearJSON != '') {
- initialYear.value = initialYearJSON;
- } else {
- alert('No initial year is included in the JSON!');
- }
-
- var releaseType = document.getElementById('categories'); //On SM 'categories' == 'releaseType'
- var releaseTypes = [];
- for (i = 0, len = releaseType.options.length; i < len; i++) {
- releaseTypes.push(releaseType.options[i].textContent.toLowerCase());
- }
-
- var releaseTypeIndexJSON = parseInt(releaseJSON.response.group.releaseType);
- var releaseTypeNameJSON = JSONReleaseTypes[sourceWebsite][releaseTypeIndexJSON];
- var releaseTypeIndex = releaseTypes.indexOf(releaseTypeNameJSON.toLowerCase());
-
- if (releaseTypeIndex > -1) {
- releaseType.selectedIndex = releaseTypeIndex;
- } else {
- alert('The release type indicated in the JSON (' + releaseTypeNameJSON + ' [' + releaseTypeIndexJSON + ']) ' +
- 'is not one of the available release types!\n\nManually select the appropriate release type.');
- }
-
- var editionYear = document.getElementById('remasteryear');
- var editionTitle = document.getElementById('remastertitle');
- //var editionLabel = document.getElementById('remaster_record_label');
- //var editionCatNo = document.getElementById('remaster_catalogue_number');
- var edition = releaseJSON.response.torrent.remastered;
-
- if (edition) {
- var editionYearJSON = releaseJSON.response.torrent.remasterYear;
- var editionTitleJSON = releaseJSON.response.torrent.remasterTitle;
- //var editionLabelJSON = releaseJSON.response.torrent.remasterRecordLabel;
- //var editionCatNoJSON = releaseJSON.response.torrent.remasterCatalogueNumber;
- document.getElementById('remaster').click();
- } else {
- editionYearJSON = initialYearJSON
- editionTitleJSON = '';
- //editionLabelJSON = releaseJSON.response.group.recordLabel;
- //editionCatNoJSON = releaseJSON.response.group.catalogueNumber;
- }
-
- if (editionYearJSON == '') {
- alert('No edition year is included in the JSON!');
- }
-
- editionYear.value = editionYearJSON;
- editionTitle.value = editionTitleJSON;
- //editionLabel.value = editionLabelJSON;
- //editionCatNo.value = editionCatNoJSON;
-
- //Scene does not exist on SM
- //var scene = document.getElementById('scene');
- //var sceneJSON = releaseJSON.response.torrent.scene;
- //if (sceneJSON) scene.checked = true;
-
- var format = document.getElementsByName('audioformat')[0];
- var formats = [];
- for (i = 0, len = format.options.length; i < len; i++) {
- formats.push(format.options[i].textContent.toLowerCase());
- }
-
- var formatJSON = releaseJSON.response.torrent.format;
- var formatIndex = formats.indexOf(formatJSON.toLowerCase());
-
- if (formatIndex > -1) {
- format.selectedIndex = formatIndex;
- } else {
- alert('The format indicated in the JSON (' + formatJSON + ') ' +
- 'is not one of the available formats!\n\nManually select the appropriate formats.');
- }
-
- var bitrate = document.getElementsByName('bitrate')[0];
- var bitrates = [];
- for (i = 0, len = bitrate.options.length; i < len; i++) {
- bitrates.push(bitrate.options[i].textContent.toLowerCase());
- }
- var otherBitrate = document.getElementById('other_bitrate');
- var otherBitrateVBR = document.getElementById('vbr');
-
- var bitrateJSON = releaseJSON.response.torrent.encoding;
- var bitrateIndex = bitrates.indexOf(bitrateJSON.toLowerCase());
-
- if (bitrateIndex > -1) {
- bitrate.selectedIndex = bitrateIndex;
- } else {
- bitrate.selectedIndex = bitrates.indexOf('other');
- document.getElementById('other_bitrate_span').classList.remove('hidden');
- otherBitrate.value = bitrateJSON.replace(/ \(VBR\)$/i, '');
- otherBitrateVBR.checked = /.+ \(VBR\)$/i.test(bitrateJSON);
- }
-
- var media = document.getElementsByName('media')[0];
- var medias = [];
- for (i = 0, len = media.options.length; i < len; i++) {
- medias.push(media.options[i].textContent.toLowerCase());
- }
-
- var mediaJSON = releaseJSON.response.torrent.media;
- var mediaIndex = medias.indexOf(mediaJSON.toLowerCase());
-
- if (mediaIndex > -1) {
- media.selectedIndex = mediaIndex;
- } else {
- alert('The media indicated in the JSON (' + mediaJSON + ') ' +
- 'is not one of the available media!\n\nManually select the appropriate media.');
- }
-
- /* SM does not support logs yet
- if (formats[formatIndex] == 'flac' && bitrates[bitrateIndex] == 'lossless' && medias[mediaIndex] == 'cd') {
- var hasLogJSON = releaseJSON.response.torrent.hasLog;
- var logs = document.getElementById('upload_logs');
- if (hasLogJSON) logs.classList.remove('hidden');
- }*/
-
- var tags = document.getElementById('tags');
- var tagsJSON = releaseJSON.response.group.tags;
- var tagList = '';
-
- if (tagsJSON.length > 0) {
- for (i = 0, len = tagsJSON.length; i < len; i++) {
- tagList += (i > 0 ? ', ' : '') + tagsJSON[i];
- }
- }
-
- tags.value = tagList;
-
- var image = document.getElementById('image');
- var imageJSON = releaseJSON.response.group.wikiImage;
- image.value = imageJSON;
-
- var albumDesc = document.getElementById('album_desc');
- var albumDescJSON = releaseJSON.response.group.wikiBody;
-
- if (albumDescJSON != '') {
- albumDescJSON = albumDescJSON.replace(/<br \/>/g, '');
- albumDescJSON = albumDescJSON.replace(/&/g, '&');
- albumDescJSON = albumDescJSON.replace(/</g, '<');
- albumDescJSON = albumDescJSON.replace(/>/g, '>');
- albumDescJSON = albumDescJSON.replace(/"/g, '"');
- albumDescJSON = albumDescJSON.replace(/'/g, '\'');
- albumDescJSON = albumDescJSON.replace(/'/g, '\'');
- albumDescJSON = albumDescJSON.replace(/<a href="artist\.php\?artistname=.+?">(.+?)<\/a>/g, '[artist]$1[/artist]');
- albumDescJSON = albumDescJSON.replace(/<a href="user\.php\?action=search&search=.+?">(.+?)<\/a>/g, '[user]$1[/user]');
- albumDescJSON = albumDescJSON.replace(/<a .+?>(https?:\/\/.+?)<\/a>/g, '$1');
- albumDescJSON = albumDescJSON.replace(/<a .*?href="(https?:\/\/.+?)".*?>(.+?)<\/a>/g, '[url=$1]$2[/url]');
- albumDescJSON = albumDescJSON.replace(/<span class="size(\d+)">(.+?)<\/span>/g, '[size=$1]$2[/size]');
- albumDescJSON = albumDescJSON.replace(/<span style="font-style: italic;">(.+?)<\/span>/g, '[i]$1[/i]');
- albumDescJSON = albumDescJSON.replace(/<span style="text-decoration: underline;">(.+?)<\/span>/g, '[u]$1[/u]');
- albumDescJSON = albumDescJSON.replace(/<span style="text-decoration: line-through;">(.+?)<\/span>/g, '[s]$1[/s]');
- albumDescJSON = albumDescJSON.replace(/<span style="color: (.+?);">(.+?)<\/span>/g, '[color=$1]$2[/color]');
- albumDescJSON = albumDescJSON.replace(/<div style="text-align: (.+?);">(.+?)<\/div>/g, '[align=$1]$2[/align]');
- albumDescJSON = albumDescJSON.replace(
- /<img class="scale_image" onclick="lightbox.init\(this, \$\(this\)\.width\(\)\);" alt="(.+?)" src=".+?">/g,
- '[img]$1[/img]');
- albumDescJSON = albumDescJSON.replace(
- /<a href="#" onclick="QuoteJump\(event, '(\d+)'\); return false;"><strong class="quoteheader">(.+?)<\/strong> wrote: <\/a><blockquote>(.+?)<\/blockquote>/g,
- '[quote=$2|$1]$3[/quote]');
- albumDescJSON = albumDescJSON.replace(/<strong class="quoteheader">(.+?)<\/strong> wrote: <blockquote>(.+?)<\/blockquote>/g,
- '[quote=$1]$2[/quote]');
- albumDescJSON = albumDescJSON.replace(/<blockquote>(.+?)<\/blockquote>/g, '[quote]$1[/quote]');
- albumDescJSON = albumDescJSON.replace(/<strong>(.+?)<\/strong>: <a href="javascript:void\(0\);" onclick="BBCode\.spoiler\(this\);">Show<\/a><blockquote class="hidden spoiler">(.+?)<\/blockquote>/g,
- '[hide=$1]$2[/hide]');
- albumDescJSON = albumDescJSON.replace(/<strong>Hidden text<\/strong>: <a href="javascript:void\(0\);" onclick="BBCode\.spoiler\(this\);">Show<\/a><blockquote class="hidden spoiler">(.+?)<\/blockquote>/g,
- '[hide]$1[/hide]');
- albumDescJSON = albumDescJSON.replace(/<strong class="important_text">(.+?)<\/strong>/g, '[important]$1[/important]');
- albumDescJSON = albumDescJSON.replace(/<(pre|code)>(.+?)<\/\1>/g, '[$1]$2[/$1]');
- albumDescJSON = albumDescJSON.replace(/<(\/)?strong>/g, '[$1b]');
-
- albumDesc.value = albumDescJSON;
- document.querySelector('input.button_preview_0').click();
- } else {
- alert('No album description is included in the JSON!');
- }
-
- var relDesc = document.getElementById('release_desc');
- var relDescJSON = releaseJSON.response.torrent.description;
- var groupIDJSON = releaseJSON.response.group.id;
- var torrentIDJSON = releaseJSON.response.torrent.id;
- relDescJSON += (relDescJSON ? '\n\n' : '') + 'Cross-posted from ' + sourceWebsite + ': https://';
- relDescJSON += sourceWebsiteDomains[sourceWebsiteIndex] + '/torrents.php?id=' + groupIDJSON + '&torrentid=' + torrentIDJSON;
- sourceWebsiteDomains = ['redacted.ch', 'orpheus.network'];
- relDesc.value = relDescJSON;
- document.querySelector('input.button_preview_1').click();
-
- break;
-
- case 1:
- break;
-
- case 2:
- break;
-
- case 3:
- break;
-
- case 4:
- break;
-
- case 5:
- break;
-
- case 6:
- break;
-
- default:
- }
-
- }
- reader.onerror = function (evt) {
- alert('There was an error reading the file.');
- }
- }
-
- } else {
- alert('No JSON file has been chosen!');
- }
- });
- })();
|