您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds Content Manager support to RSR Live Timing website, The Setup Market, AC Club and Assetto-DB.
- // ==UserScript==
- // @name AC Content Manager Installation Buttons
- // @namespace http://tampermonkey.net/
- // @homepageURL https://github.com/gro-ove/actools-cm-download-extension
- // @version 0.2.5
- // @description Adds Content Manager support to RSR Live Timing website, The Setup Market, AC Club and Assetto-DB.
- // @author x4fab
- // @match http://assettocorsa.club/*
- // @match http://www.assetto-db.com/*
- // @match http://assetto-db.com/*
- // @match http://thesetupmarket.com/*
- // @match http://www.radiators-champ.com/RSRLiveTiming/*
- // @grant none
- // @license MIT License
- // @run-at document-end
- // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADBQTFRF/wAAzAAAmf8AmQAAZv8AZswAZpkAZmZmZjMzM5kAM2YzM2YAMzMzMzMAAAAAXl5e7+St3wAAABB0Uk5T////////////////////AOAjXRkAAAHSSURBVHjatNfZsoMgDIBhcGkUI7z/2x5Ay2ZiqM7hppNO/89ujqjcy6X+B1gWeAWA1q8A0OoV4PtXQOjfALF/ARz9c+DsHwPf/imQ+odA7p8BRV8B0AmUvRqh97xQZK8xRYseu4Cmz8fXqgIAm0mJfQWAtc2kxL4EfGGbSYl9AYTCNpMS+wzEwjaTSq/j+gQchW0mJR0/AWdhm8kDQn8C38I2UwWQ/QGkwjZTCdB9BHJhm6kAmD4ARWGbKQO+ByD68Lwtk3pKQHjdOMo9B8RejXLPAEcfAaGngbMPwE2/xQVm2/YG+PYeAL7fpyGsyT+sNZB6tdy9/31K61MBuVf67vOzQO6rdfn+OMB19jzQ2fMfobPngc7+F4DsfwDongSQAi49IgdguLSB2J+nzxVARwBE7y7AmvoLQPUO4mm4ZmCOTxg4AC317jNMxBqmE8ByUb0zE72A2icSvYOZ7I0IYLoOUsIGTgAwX4h3rr8ASPQewPZrGFZg9spEH7ZC0Agf4wQAm70ZbGU/oxMAvOztYKV6DkBib2jy/wmdACC5t8S5/APcAcjsTU9hA3cPILu3DUL6AVkAb/bGXkg/IAfc9Q6MAeGmC7tvNf715vuH9SfAAHw2q5zSfJAiAAAAAElFTkSuQmCC
- // ==/UserScript==
- (function() {
- function _$(selector, fn, p){
- var e = (p || document).querySelector(selector);
- return fn ? e ? fn(e) : undefined : e;
- }
- function _$each(selector, fn, p){ Array.prototype.forEach.call((p || document).querySelectorAll(selector), fn); }
- function _$map(selector, fn, p){ return Array.prototype.map.call((p || document).querySelectorAll(selector), fn); }
- function _$some(selector, fn, p){ return Array.prototype.some.call((p || document).querySelectorAll(selector), fn); }
- function _$every(selector, fn, p){ return Array.prototype.every.call((p || document).querySelectorAll(selector), fn); }
- function _$filter(selector, fn, p){ return Array.prototype.filter.call((p || document).querySelectorAll(selector), fn); }
- // custom CSS
- function _$css(data, id){
- if (!id){ id = '__cm_extention_style'; }
- var s = document.getElementById('__cm_extention_style');
- if (s){ s.parentNode.removeChild(s); }
- s = document.body.appendChild(document.createElement('style'));
- s.id = '__cm_extention_style';
- if (s.styleSheet) {
- s.styleSheet.cssText = css;
- } else {
- s.appendChild(document.createTextNode(typeof data === 'function' ? ''.slice.call(data, 14, -3) : data));
- }
- }
- // as a variable, it can be easily redefined later for userscript format
- var _$res = function (url){ return (typeof browser !== 'undefined' ? browser : chrome).extension.getURL(url); };
- _$res = function (url){
- if (url == "img/icon-acclub.png") return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA9QTFRFmZmZZmZmMzMzAAAAgYGBlaSnFAAAAAV0Uk5T/////wD7tg5TAAABkElEQVR42qSXSwLDIAgFBbz/mVvjJ4CgQbN7qTOmVgxN+fJK9t2UrgRABDeCP38lKPyN4OEvBJU/FzT+WND5U8HgDwUvfyZg/JGA8ycCwTMBIHwSSP4V7Ooi2fyYVdcFgExdsOK5AFAkolb3S16sh0jUBWuerQeq1WmCDT+Qhyf5aRHs+I5UfiTqgi3fkMb3RF2QcMdXpPMtkSOw+AcZfE3kCEy+IC//JHIEmJy6YHxJ5AjQqwvO/xM5AsyIYO4rsUwyMcGf1yv03v8gqONg5tXv7AnaPLDlHUF/TtjytmB8zz1vCvQ6rXhLEOInwX+XpQg/C3JofvMJQrwhiPGzAGP8N8GC/yRY8bI20RRoHlGcWTIZglX9lQNDplkw8++Q58CRaRIY/BhSDyyZtMDi+5B2ZstUdiK/wOAb0s98mXSjafH15nhnyKQFZqODnFDJ61TFex05oZISJLPRQk5kwa/WwOv0ZPIFcNbuY7RV9QTHfzgwyDuC77wtCPCmIMJbWznEz0+AMT6nfHldC34CDADQEDTb2F/V3AAAAABJRU5ErkJggg==";
- if (url == "img/icon-thesetupmarket-16.png") return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXxJREFUeNqMk7EvBFEQxt/e7l7uGnH+AIlCgY4gEoUEhRONQnKVUPkP5FqFQqGSoCDXKYRaSSUhIiERQbLonKwlud3mbNY38l2MjZOb5JedNzvf7Hszby3f943rukaZA+ZBBcTmH6vX68aEYWiSJNHsgttU7E+iKDIZcZRtggUQmRZMtJmUeIl+yGcWlIDOy/3ya7Wa7GIj+bFn0Ackvg+u1La3QIn+KI5/JAW02AM9TKgwdsz1OtdF0AveUMCTApfqyyNM3lFFD8CqWq+AJ3FQ4Nrh2B6BB8bAHFjkGW/YhzLXMtZp0KlnfgK6wQQYAG1KfA9m0uNPX5oPMAmsJmI9AZuahuXl5RTFpok44EfEHsCZyj2UanegwEAVvCix+LNgj1svgnHmroFlmUIWDc2RIdXtKujnVE75Tvwy2BZffgMpoO/3MMWvYJAxB7SrnELDlwKZVIfzPIZs9ZyxT/CucgItsIIgMLZtG8v67mMX6AAXrfxIcRybLwEGAPyuf5tj/yp0AAAAAElFTkSuQmCC";
- if (url == "img/icon-radiatorschamp-30.png") return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACFQTFRF///////M/8zM/8yZ/5mZzJmZzJlmzGZmzGYzzDMz////Hc17DAAAAAt0Uk5T/////////////wBKTwHyAAAA5ElEQVR42nzT2xaEIAgF0BNBaP//wcNFDWfWxFOyVwRquFfg/o0nB+CFwfTyNs7+wqYv7PqfQ5O/+sNSicdjlMMapipp5gmp2LUHQ3yJQ82pajDE10DrxlrV2dQSri350X7B1TJH64MlWgjV1M5RNNhUUFWJyGZIJi+wvcunqjIn59e3ypc3IcF3fKVq52gueaQebQ/PuWtlSpExve5qA1Pw2di3TqxNvZbaBvhMOV2cSsSjfYav5rmP9TzfcRCVedwBGd3cG/N6lqmFufwRajuy3fND6h3ERTt/31D8/+9KfAQYAH4FGSoAsxbPAAAAAElFTkSuQmCC";
- if (url == "img/icon-radiatorschamp-48.png") return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADxQTFRF/8wA/5kA/wAAzJkAzAAAmWYAmQAzmQAAZmYAZjMAZgAzZgAAMzMzMzMAMwAzMwAAADMzAAAzAAAAogAl5T9rCwAAABR0Uk5T/////////////////////////wBPT+cRAAACAElEQVR42pSVi5KDIAwAqUoU0EvB///XSyCAUOzUzPRBu8sjAVFnFxbOr6G6Njj7SIB1ck8E4h8JzC8PBOafCJF/ICT+d0H4nxdd+B9HKPy0imAdfBEqv2Di7DKVkkNVAVTPJ8yu05IF+MPMu92qngfhiwC4/0HmozDsvwjE7zJN4nen7ngRmBeBeRLu+CREPgmRJ8Hd8FFIfBQSz8LS8TAVQXgWhK9CyX+tIJzC71j4IlD/sbKVX1zun4TCZ2FxNp5Ne6144XfETiDe8Ta94Tsh/su5stDx3l+n9PZvGYHnH6GWfx96O/aDYj+QXps2PgprnA9RHb/NH7G9SbDC10jzOebZGIYyTS1lPO2lc8j7TekQNL2JQS36yVsFQ3735qU9WZs3InivqWWVXUY8TUkTY6jPPAJ/OWhKrVDz79nQF0EzH7oRrvUKZEjHohwhOGiEbj8EyovOa5gN+kA79Co0PHWGMVUlS5E/qXCLxOoanp4W3LtO/Gvz6eApwBK26Z8Erl6pW0gnRkGNlmch1BUL39wP2PB8QAPqnCHhh0LiSQjO4kYKbdvMNxcKNjxdqLwQ5F2IhR8ImT9Fw3nGy+P4Qwj9Y97Ns7u543DEk/D6InS8M8bwounDDYWOB/OSfUqVHqW1nw/wCBKDOsDHtQaU2RwwEAZXYN03+Zd/AQYAX0xuXwD83e4AAAAASUVORK5CYII=";
- return '';
- };
- if (/^http:\/\/assettocorsa\.club\/.*/i.test(location.href) || /^https:\/\/assettocorsa\.club\/.*/i.test(location.href)){
- if (_$('p.download a', function (x){ return x.textContent; }) == 'DOWNLOAD'){
- _$('.spec > div', function (x) { x.style.width = '60%'; });
- _$('.spec > div:last-child', function (x) { x.style.width = '40%'; });
- _$each('.__cmspecial', function (x){ x.parentNode.removeChild(x); });
- _$('p.download a', function (x) {
- var c = x.cloneNode();
- c.classList.add('__cmspecial');
- c.removeAttribute('target');
- c.setAttribute('href', 'acmanager://install?url=' + encodeURIComponent(x.href));
- c.textContent = 'INSTALL';
- c.setAttribute('style',
- 'color: rgb(100, 166, 112); padding: 0px 0px 6px 40px; line-height: 33px; margin: 2px 0px 2px 12px;' +
- 'background: url(' + JSON.stringify(_$res('img/icon-acclub.png')) + ') left center / contain no-repeat;' +
- 'display: inline-block;');
- x.parentNode.insertBefore(c, x.nextSibling);
- });
- }
- } else if (/^http:\/\/www\.assetto-db\.com\/.*/i.test(location.href) || /^http:\/\/assetto-db\.com\/.*/i.test(location.href)){
- _$each('.__cmspecial', function (x){ x.parentNode.removeChild(x); });
- _$('.carDetails a[href^="/"][href$="/download"]', function (x) {
- var c = x.cloneNode();
- c.classList.add('__cmspecial');
- c.removeAttribute('target');
- c.setAttribute('href', 'acmanager://install?url=' + encodeURIComponent(location.href));
- c.textContent = 'Install using Content Manager';
- // with hue filter, hover/active colors are already there, and also it won’t look weird
- // in case of sudden redesign
- c.setAttribute('style', 'filter:hue-rotate(-120deg);-webkit-filter:hue-rotate(-120deg)');
- c.classList.remove('btn-default');
- c.classList.add('btn-primary');
- x.parentNode.insertBefore(c, x.nextSibling);
- });
- } else if (/^http:\/\/thesetupmarket\.com\/.*/i.test(location.href)){
- if (!_$('#__cm_stop')){
- // if you would need to stop CM, just add empty element with ID=__cm_stop somewhere
- var observeDOM = (function(){
- var MutationObserver = window.MutationObserver || window.WebKitMutationObserver,
- eventListenerSupported = window.addEventListener;
- return function(obj, callback){
- if (MutationObserver){
- var obs = new MutationObserver(function(mutations, observer){
- if (mutations[0].addedNodes.length || mutations[0].removedNodes.length){
- callback();
- }
- });
- obs.observe(obj, { childList: true, subtree: true });
- } else if (eventListenerSupported){
- obj.addEventListener('DOMNodeInserted', callback, false);
- }
- };
- })();
- observeDOM(document.body, function(){
- _$each('.icon-details.icon-link[href^="#/setups/Assetto Corsa/"]:not(.__cmspecial)', function (x){
- x.classList.add('__cmspecial');
- var c = x.cloneNode(true);
- x.parentNode.appendChild(c);
- c.setAttribute('href', 'acmanager://thesetupmarket/setup?id=' + (x.href.match(/\/([\w-]+)\/?$/) || {})[1]);
- c.setAttribute('style', 'color:transparent;background:url(' + JSON.stringify(_$res('img/icon-thesetupmarket-16.png')) +
- ');background-repeat:no-repeat;background-position:center;');
- });
- _$each('.link.icon-download.fixed-download-link:not(.__cmspecial)', function (x){
- var i = setInterval(function (){
- var id = (x.href.match(/\/([\w-]+)\/?$/) || {})[1];
- if (id == null) return;
- clearInterval(i);
- x.classList.add('__cmspecial');
- var c = x.cloneNode(true);
- x.parentNode.appendChild(c);
- c.classList.remove('icon-download');
- c.textContent = 'install using CM';
- c.setAttribute('href', 'acmanager://thesetupmarket/setup?id=' + id);
- c.setAttribute('style', 'right:220px;filter:hue-rotate(-60deg);-webkit-filter:hue-rotate(-60deg)')
- }, 100);
- });
- });
- }
- } else if (/^http:\/\/www\.radiators-champ\.com\/RSRLiveTiming\/.*/i.test(location.href)){
- if (_$('#__cmext_style', function (x){ x.parentNode.removeChild(x); return true; })){
- // cleaning up after RSR Live Timing Content Manager Support extension
- _$('#__cmext_start_btn', function (x){ x.parentNode.removeChild(x); return true; });
- _$each('th:last-child', function (x){
- if (x.textContent === 'Install'){
- x.textContent = 'Download';
- }
- });
- _$each('a', function (x){
- var m = x.href.match(/^acmanager:\/\/rsr\/setup\?id=(\d+)/);
- if (m){
- x.href = 'http://www.radiators-champ.com/RSRLiveTiming/ajax.php?action=download_setup&id=' + m[1];
- }
- });
- }
- // start button if needed or possible
- var eventId = (location.href.match(/\beventId?=(\d+)\b/i) || {})[1];
- var carId = (location.href.match(/\bcar(?:Id)?=(\d+)\b/i) || {})[1];
- var trackId = (location.href.match(/\btrack(?:Id)?=(\d+)\b/i) || {})[1];
- if (eventId != null || carId != null && trackId != null){
- _$css(function(){/*
- #__cmext_start_btn {
- display: block !important;
- position: fixed !important;
- bottom: 20px !important;
- right: 20px !important;
- width: 72px !important;
- height: 72px !important;
- border-radius: 2px !important;
- background: #A20025 !important;
- color: white !important;
- text-transform: uppercase !important;
- text-decoration: none !important;
- font-size: 13px !important;
- font-weight: bold !important;
- line-height: 27px !important;
- padding: 8px !important;
- text-align: center !important;
- color: #FFF !important;
- }
- #__cmext_start_btn:hover, #__cmext_start_btn:active {
- color: #FFF !important;
- background: #990024 !important;
- text-decoration: none !important;
- } */});
- var c = eventId || trackId + '/' + carId;
- var b = document.createElement('a');
- b.id = '__cmext_start_btn';
- b.appendChild(document.createElement('img')).src = _$res('img/icon-radiatorschamp-48.png');
- b.appendChild(document.createElement('br'));
- b.appendChild(document.createTextNode('Start'));
- b.href = 'acmanager://rsr?id=' + encodeURIComponent(c);
- document.body.appendChild(b);
- }
- // setups table: new column with quick install buttons
- _$each('th:last-child', function (x){
- if (x.textContent === 'Download'){
- x.textContent = 'Download';
- x.parentNode.appendChild(x.cloneNode()).textContent = 'Install';
- }
- });
- _$each('a', function (x){
- var m = x.href.match(/=download_setup&id=(\d+)/);
- if (m){
- var c = x.parentNode.parentNode.appendChild(x.parentNode.cloneNode(true)).querySelector('a');
- c.href = 'acmanager://rsr/setup?id=' + m[1];
- c.querySelector('img').src = _$res('img/icon-radiatorschamp-30.png');
- x.href = x.href.replace(/&id/, '&proc=1&id');
- }
- });
- }
- })();