// ==UserScript==
// @name osu! my download
// @description ous beatmap download from mirror.osu beatmap镜像站下载。支持的镜像站点:bloodcat.com、osu.mengsky.net、inso.link、osu.uu.gl。
// @author dazzulay
// @copyright 2014+, dazzulay
// @version 2.1.0
// @icon http://osu.ppy.sh/favicon.ico
// @include http*://osu.ppy.sh/b/*
// @include http*://osu.ppy.sh/s/*
// @include http*://osu.ppy.sh/p/beatmap*
// @include http*://osu.ppy.sh/beatmapsets/*
// @grant none
// @namespace https://greasyfork.org/scripts/3916
// @homepageURL https://greasyfork.org/scripts/3916
// @downloadURL none
// ==/UserScript==
var domain = document.domain;
var drive = domain.replace(/\./g, '_');
if (drive == 'osu_mengsky_net') {
var bmid = getUrlParameter('bmid');
if (bmid) {
document.write('
');
}
}
function myJQueryCode() {
function osu_my_downoad() {
var self = this;
this.mirros = {
bloodcat: {
url: 'http://bloodcat.com/osu/m/{bmid}',
class: 'my_orange',
text: 'DOWNLOAD BLOODCAT',
target: '_blank'
},
/*
2017-07-16 挂了
mengsky: {
url: 'http://osu.mengsky.net/?bmid={bmid}',
url2: 'http://osu.mengsky.net/api/download/{bmid}', // 无法直接跳转,限制了
class: 'my_green',
text: 'DOWNLOAD MENGSKY',
target: '_blank'
},
*/
insolink: {
url: 'http://inso.link/?source=osu_my_download&m={bmid}',
class: 'my_pink',
text: 'DOWNLOAD INSO.LINK',
target: '_blank'
},
osu_uu_gl: {
url: 'http://osu.uu.gl/s/{bmid}',
class: 'my_purpule',
text: 'DOWNLOAD OSU.UU.GL',
target: '_blank'
}
};
this.mirros_parse = function (bmid, mirro, param) {
var _param = 'url';
if (param) {
_param = param;
}
if (typeof self.mirros[mirro] !== "undefined") {
self.mirros[mirro][_param] = str_render(self.mirros[mirro][_param], {bmid: bmid});
} else {
$.each(self.mirros, function (k, v) {
self.mirros[k][_param] = str_render(v[_param], {bmid: bmid});
});
}
};
this.drives = {
osu_ppy_sh: function () {
var is_new = $( '.osu-layout').length;
if(is_new){
// css样式 设置
$('head').append('');
var beatmapset_page = '.js-react--beatmapset-page';
function ready(){
// 获取beatmapid
var bmsrc = $('.js-audio--play').attr('data-audio-url');
if(!bmsrc){
return false;
}
var bmid = bmsrc.substring(bmsrc.lastIndexOf("/") + 1, bmsrc.lastIndexOf("."));
// 设置url
self.mirros_parse(bmid);
// 添加按钮
var $container = $('');
var btn_tpl = '';
$.each(self.mirros, function (k, v) {
$container.append(str_render(btn_tpl, self.mirros[k]));
});
$('.beatmapset-header__box--main').append($container);
}
// 第一次加载页面触发下面的load无效 用一个定时器
var _timer = setInterval(function(){
if($(beatmapset_page).attr('data-react-turbolinks-loaded')==1){
ready();
clearInterval(_timer);
}
},200);
$(document).on('turbolinks:load', ready);
}else{
// css样式 设置
$('head').append('');
// 获取beatmapid
var bmsrc = $('.bmt').attr('src');
var bmid = bmsrc.substring(bmsrc.indexOf("thumb/") + 6, bmsrc.lastIndexOf("l"));
// 设置url
self.mirros_parse(bmid);
// 添加按钮
var $container = $('');
var btn_tpl = '{text}
';
$.each(self.mirros, function (k, v) {
$container.append(str_render(btn_tpl, self.mirros[k]));
});
$('body').append($container);
}
},
new_ppy_sh: function () {
},
osu_mengsky_net: function () {
// 获取url参数的bmid
var bmid = getUrlParameter('bmid');
if (!bmid) {
return;
}
// css样式 设置
$('head').append('');
// 设置url
self.mirros_parse(bmid, 'mengsky', 'url2');
// 添加按钮
var $container = $('');
var btn_tpl = '{text}
';
$container.append(str_render(btn_tpl, self.mirros.mengsky));
$('body').html($container);
// 点击按钮
$('a')[0].click();
}
};
this.init = function () {
var domain = document.domain;
var drive = domain.replace(/\./g, '_');
self.drives[drive]();
};
self.init();
}
osu_my_downoad();
}
if (typeof jQuery == 'undefined') {
var headTag = document.getElementsByTagName("head")[0];
var jqTag = document.createElement('script');
jqTag.type = 'text/javascript';
jqTag.src = '//code.jquery.com/jquery-1.8.3.min.js';
jqTag.onload = myJQueryCode;
headTag.appendChild(jqTag);
} else {
myJQueryCode();
}
function str_render(template, context) {
var tokenReg = /(\\)?\{([^\{\}\\]+)(\\)?\}/g;
return template.replace(tokenReg, function (word, slash1, token, slash2) {
if (slash1 || slash2) {
return word.replace('\\', '');
}
var variables = token.replace(/\s/g, '').split('.');
var currentObject = context;
var i, length, variable;
for (i = 0, length = variables.length; i < length; ++i) {
variable = variables[i];
currentObject = currentObject[variable];
if (currentObject === undefined || currentObject === null) return '';
}
return currentObject;
});
}
function getUrlParameter(sParam) {
var sPageURL = decodeURIComponent(window.location.search.substring(1)),
sURLVariables = sPageURL.split('&'),
sParameterName,
i;
for (i = 0; i < sURLVariables.length; i++) {
sParameterName = sURLVariables[i].split('=');
if (sParameterName[0] === sParam) {
return sParameterName[1] === undefined ? true : sParameterName[1];
}
}
}