Facilitates uploading requests by adding an upload link to request page sidebar and populating the upload form with info available on the page.
目前為
// ==UserScript==
// @name RequestUpload
// @namespace varb
// @version 0.5
// @description Facilitates uploading requests by adding an upload link to request page sidebar and populating the upload form with info available on the page.
// @include /^https?://bibliotik.org/requests/\d+/
// @include /^https?://bibliotik.org/upload/\w+/
// @include /^https?://bibliotik.org/torrents/\d+/
// @require https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_deleteValue
// @grant GM_addStyle
// @license WTFPL Version 2; http://www.wtfpl.net/txt/copying/
// ==/UserScript==
var FORMATS = {'MP3':1,'PDF':2,'CBR':3,'DJVU':4,'CBZ':5,'CHM':6,'FLAC':10,'SPX':13,'TXT':14,'EPUB':15,'MOBI':16,'M4A':17,'M4B':18,'AZW3':21};
var LANGS = {'English':1,'German':2,'French':3,'Spanish':4,'Italian':5,'Latin':6,'Japanese':7,'Swedish':8,'Norwegian':9,'Dutch':12,'Russian':13,'Portuguese':14,'Danish':15,'Korean':16,'Chinese':17,'Polish':18,'Arabic':19,'Irish':20,'Greek':21,'Turkish':22,'Hungarian':23,'Thai':24,'Indonesian':25,'Bulgarian':26};
$(document).ready(function () {
console.log('requp: initialized');
var page = location.pathname.split('/')[1];
switch (page) {
case 'requests':
onReqPage();
break;
case 'upload':
onUploadPage();
break;
case 'torrents':
onTorrentPage();
break;
default:
console.log('requp: unhandled page ' + page);
}
});
function onReqPage() {
var category, lang, overdrive = false, req = {};
var reqid = location.pathname.split('/').slice(-1);
var reqdetails = $('#requestDetails').text();
if ($('#filled').length)
return;
// add upload link to req page sidebar
var _match = reqdetails.match(/(?:(\w+),\s)?(\w+)\scategory/);
if (_match !== null) {
lang = _match[1];
category = _match[2];
var uppageurl = location.origin + '/upload/' + category.toLowerCase()
+ '?reqid=' + reqid;
$('#sidebar ul:first').append(
'<li><a id="upreq" href="' + uppageurl + '">Upload Request</a></li>'
).on('click', '#upreq', function () {
GM_setValue(reqid, JSON.stringify(req));
});
} else {
console.log('requp: cannot establish category');
return;
}
// save fill request form
req.fillform = $('#TorrentIdField').parents('form').find(':hidden')
.serializeArray();
// collect reusable info
var $description = $('#description');
req.title = $('h1').text().match(/\/\s*(.+?)(?:\s\[Retail\]$|$)/)[1];
req.publishers = $('#published a').map(function () { return this.text })
.toArray();
req.tags = $('#details_tags a').map(function () {
if (this.text.indexOf('overdrive') !== -1) {
overdrive = true;
return;
}
return this.text;
}).toArray();
req.overdrive = overdrive;
req.retail = reqdetails.indexOf('Retail') !== -1;
req.lang = lang;
req.format = $('#requestDetails strong').text().split('/');
req.desc = $description.html();
var $authors = $('#creatorlist');
req.authors = $authors.find('a').map(function () { return this.text })
.toArray();
if (category === 'Comics') {
req.artists = $authors.next('#creatorlist').find('a')
.map(function () { return this.text }).toArray();
}
var _isbnmatch = $description.text().match(/Overdrive Listing \((\d+)\)/);
req.isbn = _isbnmatch !== null ? _isbnmatch[1] : '';
}
function onUploadPage() {
var reqid, _match;
if (_match = location.search.match(/reqid=(\w+)/))
reqid = _match[1];
else
return;
var _req = GM_getValue(reqid);
if (!_req) {
console.log('requp: no data available');
return;
}
var req = JSON.parse(_req);
GM_deleteValue(reqid);
// populate upload form fields
$('#TitleField').val(req.title);
$('#TagsField').val(req.tags.join(', '));
$('#AuthorsField').val(req.authors.join(', '));
if (req.artists && req.artists.length)
$('#ArtistsField').val(req.artists.join(', '));
if (req.format.length === 1)
$('#FormatField').val(FORMATS[req.format[0]]);
$('#PublishersField').val(req.publishers.join(', '));
$('#LanguageField').val(LANGS[req.lang]);
$('#RetailField').prop('checked', req.retail);
$('#IsbnField').val(req.isbn);
$('#DescriptionField').val(html2bb(
req.overdrive ? $(req.desc).find('blockquote').html()
: $(req.desc).children('p:first').html()
));
// fill request form
$('#TitleField').parents('form').on('submit', function (e) {
if (! (this.IsbnField.value && this.FormatField.value !== 'noformat')) {
alert('Either ISBN or Format is empty.');
e.preventDefault();
}
var key = this.IsbnField.value
+ $(this.FormatField).find(':selected').text();
GM_setValue(key, JSON.stringify({ id: reqid, fillform: req.fillform }));
});
}
function onTorrentPage() {
var _match, _req;
if (_match = $('#details_content_info').text().match(/^\s*(\w+).+?\((\d+)\)/)) {
if (_req = GM_getValue(_match[2] + _match[1])) {
GM_deleteValue(_match[2] + _match[1]);
} else {
console.log('requp: no linked request');
return;
}
} else {
console.log('requp: failed to parse isbn/format');
return;
}
var req = JSON.parse(_req);
var torrid = location.pathname.split('/').slice(-1);
req.fillform.push({name: 'TorrentIdField', value: torrid});
// add fill request link
$('<a/>', {href: '/requests/' + req.id, text: 'Fill Request', id: 'fillreq'})
.on('click', function (e) {
var $self = $(this);
e.preventDefault();
$self.next().addClass('loading').text('');
$.post(this.href, $.param(req.fillform)).done(function () {
location.href = this.url;
}).fail(function (xhr) {
$self.next().removeClass('loading').text(xhr.status + ' ' + xhr.statusText);
console.error('requp: failed to fill request');
});
}).appendTo('#sidebar ul').wrap('<li></li>').after('<span></span>');
}
function html2bb(text) {
return text.replace(/\n/g, '')
.replace(/<(\/)?em>/ig, '[$1i]')
.replace(/<(\/)?strong>/ig, '[$1b]')
.replace(/<(\/)?u>/ig, '[$1u]')
.replace(/<(\/)?(o|u)l>/ig, '[$1$2l]')
.replace(/(?:•|<li>)\s*(.+?)(?:<\/li>|<br>)/ig, function (m, c, p, s) {
var firstli = s.search(/•/);
if (firstli === p)
return '[ul][*]' + c + '\n';
if (firstli !== -1 && s.substr(p).match(/•/g).length === 1)
return '[*]' + c + '[/ul]';
return '[*]' + c + '\n';
})
.replace(/<a\s+href="(\S+?)">(.+?)<\/a>/ig, '[url=$1]$2[/url]')
.replace(/<\/?(br|p)>/ig, '\n');
}
GM_addStyle('#fillreq+span{margin-left:10px;font-size:0.8em;}.loading{height:12px;width:12px;background-repeat:no-repeat;display:inline-block;background-image:url(data:image/gif;base64,R0lGODlhDAAMAIQAAAQCBIyKjERCRCQiJNze3BQSFPTy9DQ2NHx+fBwaHPz6/AwKDJyanExOTOzq7Dw+PAQGBCwqLOTi5BQWFPT29Dw6PBweHPz+/JyenFRWVP///wAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCAAaACwAAAAADAAMAAAFQ6CmKcxTTA+jiJpzAHB8OBr1xnhFMXgPYA9fg0DICAo+msZgQeIgFNElEuwhVoGUD2Cx/BQ3X2Xl8s1YpMdkIsCsNCEAIfkECQgAEwAsAAAAAAwADACEBAIElJKUPDo85OLkHB4cZGZkFBIUREJE/Pr8nJqc7OrsHBocPD48NDY0bGpsFBYUREZEnJ6c7O7s////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUDgNCEJYzxMgoiT0gBw3CjjG98CEtw8UPY3EzD2MPAgA0kBgOINRIjHIcGjiQgRhA1WWAVyrS3gJLCOSg9pVhQCACH5BAkIABIALAAAAAAMAAwAhAQCBJSWlDQ2NOzq7ERGRAwODMzKzDw+PJyenPz6/BQWFAQGBJyanDw6PExOTBQSFERCRPz+/P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVCoCQlwfEoB5OI0iAAcCwM4xvfDXnvAHPwNxMwpngMYajYwWD4wSCMGK21gCESr8JqVADkWq+AKACYsRIMiMMBuYpCACH5BAkIABUALAAAAAAMAAwAhAQCBIyOjDw6POTi5BweHGRmZPz6/BQSFExKTOzq7JyanERCRBwaHDw+POTm5DQ2NGxqbPz+/BQWFOzu7JyenP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVCYFUZSnNIjWKIVfIAcPwk4xvfAnnvQMnfpl9McgAUJoPFDiVZVRy7hYIREU12FMMjEDEUcCsXoyijiQyUhUSyyIpCACH5BAkIABQALAAAAAAMAAwAhAQCBJSSlDQ2NMzKzBQSFERCROzq7JyanAwODDw+PBwaHPz6/AQGBJSWlDw6PMzOzBQWFExKTJyenPz+/P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAIEUtTUJAybGIlCEAcCwY4xvfDgkgzB0ficbCkPABEhHWwAhJipY+VGBY9BUOOyNMsrAZcy2vjCZaACGQAlcUAgAh+QQJCAAUACwAAAAADAAMAIQEAgSUkpQ8Ojzk4uQcHhxkZmT08vQUEhREQkScmpzs6uwcGhw8Pjzk5uQ0NjRsamz8+vwUFhRERkScnpz///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQiBFQQlzREwCiZTiEBEgA44yOsFYzIAABQSWgQcoRVaUAdEEKCgGEmLkQJQyqjxEAjubQBxcH6UBJtZYJEYkgvCKQgAh+QQJCAAYACwAAAAADAAMAIQEAgSEgoQ0NjTc3twUEhT08vRMTkwMCgycmpw8Pjzs6uwcGhz8+vwEBgSEhoQ8Ojzk4uQUFhRUUlQMDgycnpxEQkTs7uz8/vz///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAFRSCGMUgiCAnCiJgiAAHDOICgjO+xjhPwkABAwyKyHIKlIMAwgBiUCYJyqoxIqdNIAjutILhKCuPF/bXIUxuLlIhEKmJRCAAh+QQJCAASACwAAAAADAAMAIQEAgSUlpQ8Ojzk4uQkIiRsamwUEhREQkT8+vycnpzs6uwcGhycmpw8Pjw0NjQUFhRERkTs7uz///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQqAkIUFjPA2DiJLiADDwEI4yvnGxBgIZwzbRItH4AQYixONgMB4GioKsafyhqr8DAxtLIHDVXgscq7EQjMZj6RWFAAA7);}');