您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds buttons to watch TV series on www.episodecalendar.com through VidSrc.to
// ==UserScript== // @name EpisodeCalendar Streaming // @namespace http://tampermonkey.net/ // @version 1.1.0 // @description Adds buttons to watch TV series on www.episodecalendar.com through VidSrc.to // @author Chiffie // @match https://episodecalendar.com/** // @icon https://www.google.com/s2/favicons?sz=64&domain=episodecalendar.com // @license GPL-3.0-only // @grant GM_xmlhttpRequest // @connect mdblist.com // ==/UserScript== window.__userScriptData = { page: null, linkTarget: '__userScript', // use this to open in same new window // linkTarget: '_blank', // use this to open each in new window } var pages = { show: /[A-Za-z]{2,3}\/show/, unwatched: /[A-Za-z]{2,3}\/unwatched/, calendar: /[A-Za-z]{2,3}\/calendar/, } var getImdbId = function(html) { const imdbMatcher = /www.imdb.com\/title\/(tt\d+)/ const result = html.match(imdbMatcher) const imdbId = result?.length && result[1] if (!imdbId) { throw new Error('[__userScript] did not find imdbId'); } return imdbId; }; var getTmdbId = function(imdbId) { var link = 'https://mdblist.com/show/' + imdbId; return new Promise(function(resolve) { GM_xmlhttpRequest({ url: link, method: 'GET', onload: function (data){ const tmdbLink = $('a[href*="www.themoviedb.org"]').attr('href'); const tmdbMatcher = /www.themoviedb.org\/tv\/(\d+)/; const result = data.response.match(tmdbMatcher); const tmdbId = result?.length && result[1] if (!tmdbId) { throw new Error('[__userScript] did not find tmdbId'); } resolve(tmdbId); } }) }) } var actionOnPage = { show: function() { const imdbLink = $('a[href*="www.imdb.com"]').attr('href') var imdbId = getImdbId(imdbLink); getTmdbId(imdbId).then(tmdbId => expandEpicList(imdbId,tmdbId)); }, unwatched: function() { const $selected = $('.season h2 a') const detailUrl = $selected.attr("href") $.get(detailUrl, function(data) { var imdbId = getImdbId(data); getTmdbId(imdbId).then(tmdbId => expandEpicList(imdbId,tmdbId)); }) }, calendar: function() { $('.episode-item').each(function(idx,episodeElement) { // todo }) } } function expandEpicList(imdbId, tmdbId) { $(".epic-list-episode").each(function(index, element) { const $el = $(element) const seasonAndEpisodeStr = $el.find('.name .mid_grey').text().toUpperCase() const matcher = /S(\d{1,2})E(\d{1,2})/ const result = seasonAndEpisodeStr.match(matcher) if (!result?.length || result.length < 3) { return; } const season = new Number(result[1]) const episode = new Number(result[2]) var episodeNumber = index + 1 $el.prepend( '<div class="links" style="display:flex;flex-direction:column">' + '<a href="https://www.braflix.app/tv/'+tmdbId +'/'+season+'/'+episode+'?play=true" target="' + window.__userScriptData.linkTarget + '" class="awesome has-icon small grey external" data-ignore-user-script="true" style="margin-bottom:6px">'+ '<strong>Braflix</strong>'+ '</a>'+ '<a href="https://vidsrc.to/embed/tv/'+imdbId+'/'+season+'/'+episode+'" target="' + window.__userScriptData.linkTarget + '" class="awesome has-icon small grey external" data-ignore-user-script="true" style="margin-bottom:6px">'+ '<strong>VidSrc</strong>'+ '</a>'+ // '<a href="https://database.gdriveplayer.us/player.php?type=series&imdb='+imdbId+'&season='+season+'&episode='+episode+'" target="' + window.__userScriptData.linkTarget + '" class="awesome has-icon small grey external" data-ignore-user-script="true" style="margin-bottom:6px">'+ // '<strong>GDrive</strong>'+ // '</a>'+ // https://multiembed.mov/?video_id=tt13157618&s=1&e=2 // '<a href="https://multiembed.mov/?video_id='+imdbId+'&s='+season+'&e='+episode+'" target="' + window.__userScriptData.linkTarget + '" class="awesome has-icon small grey external" data-ignore-user-script="true" style="margin-bottom:6px">'+ // '<strong>Multi#1</strong>'+ // '</a>'+ // https://multiembed.mov/directstream.php?video_id=tt13157618&s=1&e=2 //'<a href="https://multiembed.mov/directstream.php?video_id='+imdbId+'&s='+season+'&e='+episode+'" target="' + window.__userScriptData.linkTarget + '" class="awesome has-icon small grey external" data-ignore-user-script="true" style="margin-bottom:6px">'+ // '<strong>Multi#VIP</strong>'+ //'</a>'+ '</div>' + '<div class="separator"></div>' ) }); } function setPage() { var currentPage = window.location.pathname; var pageName = null; for (var key in pages) { if (pages[key].test(currentPage)) { pageName = key break; } } window.__userScriptData['page'] = pageName if (pageName) { actionOnPage[pageName](); } } function getParentLinkTag(target) { if (target.tagName === 'A') { return target } else if (target.tagname === 'BODY') { return null; } return getParentLinkTag(target.parentNode) } function startListener() { var $a = $('a') $a.one('click', function(e) { const link = getParentLinkTag(e.target) if ($(link).attr('data-ignore-user-script') == 'true') { console.log(link) return; } // force load e.preventDefault() window.location.href = link.href // won't be triggered console.warn('does not exist') $a.off('click') init() }); } function init() { setTimeout(function() { setPage(); startListener(); //debug console.log('[__userScript]', window.__userScriptData); }, 500) } (function() { 'use strict'; console.log('[__userScript] started') init() })();