您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Schedules anime from any season
当前为
// ==UserScript== // @name Custom Anime Scheduler // @namespace http://tampermonkey.net/ // @version 0.1.6.3 // @description Schedules anime from any season // @author You // @icon https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net // @grant GM_setValue // @grant GM_getValue // @match *.livechart.me/* // @require https://code.jquery.com/jquery-3.6.4.min.js // @run-at document-end // @license MIT // ==/UserScript== const $ = window.jQuery; function convertToDateLinkText(date) { let realMonth = date.getMonth() + 1; let dateString = date.getDate(); if (dateString < 10) { dateString = '0' + dateString; } if (realMonth < 10) { realMonth = '0' + realMonth; } const dateLinkFormat_ = date.getFullYear() + '-' + realMonth + '-' + dateString; return dateLinkFormat_; } function convertToDateObject(dateString) { const modifiedDateString = dateString + " 00:00:00"; const dateObject = new Date(modifiedDateString); return dateObject; } function speedChange(diff) { const daysString = GM_getValue("days_speed"); const speed = Number(daysString); const newDiff = diff * Math.ceil(7 / speed); return newDiff; } function daysSinceStartingDay(date) { let daysSince; const startingDay_ = GM_getValue("starting_day"); if (startingDay_ == "monday") { daysSince = (date.getDay() + 6) % 7; } else if (startingDay_ == "relative") { //daysSince = (date.getDay() + speedChange(1) - 1) % 7; daysSince = speedChange(1) - 1; } else { daysSince = date.getDay(); } return daysSince; } function shiftDate(date, diff) { const daysShifted = date.getDate() + diff; date.setDate(daysShifted); } function getDayTextFromNum(num) { let weekDay; switch(num) { case 0: weekDay = "Sun"; break; case 1: weekDay = "Mon"; break; case 2: weekDay = "Tue"; break; case 3: weekDay = "Wed"; break; case 4: weekDay = "Thu"; break; case 5: weekDay = "Fri"; break; case 6: weekDay = "Sat"; break; } return weekDay; } function getDayText(date) { let weekDay; const dayNum = date.getDay(); weekDay = getDayTextFromNum(dayNum); return weekDay; } function convertToDateButtonText(date) { let retString; let dateString = date.getDate(); const weekDay = getDayText(date); const realMonth = date.getMonth() + 1; if (dateString < 10) { dateString = '0' + dateString; } retString = weekDay + ' ' + realMonth + '/' + dateString; return retString; } function GetURLParameter(sParam) { const sPageURL = window.location.search.substring(1); const sURLVariables = sPageURL.split('&'); for (let i = 0; i < sURLVariables.length; i++) { let sParameterName = sURLVariables[i].split('='); if (sParameterName[0] == sParam) { return decodeURIComponent(sParameterName[1]); } } } function highlightTTDay(dayText, dayStatus) { let timeTableBox = $('.timetable'); const tTDayQuery = 'h2:contains("' + dayText + '")'; let TTDayH2 = timeTableBox.find(tTDayQuery); let TTDay = TTDayH2.parent().parent(); TTDay.removeClass("past"); TTDay.addClass(dayStatus); } $(window).bind("load", function () { const $today = new Date(); const todayHoursToMidnight = convertToDateObject(convertToDateLinkText($today)); let scheduleDate = convertToDateObject(GM_getValue("start_date")); const settingDate = convertToDateObject(GM_getValue("setting_date")); const daysDiff = (todayHoursToMidnight - settingDate) / (1000 * 60 * 60 * 24); const daysDiffWithSpeed = speedChange(daysDiff); shiftDate(scheduleDate, daysDiffWithSpeed); const currentCustomDateText = convertToDateLinkText(scheduleDate); const weekStartDiff = -daysSinceStartingDay(scheduleDate); shiftDate(scheduleDate, weekStartDiff); const dateLinkFormat = convertToDateLinkText(scheduleDate); const scheduleDateLink = 'https://www.livechart.me/timetable?date=' + dateLinkFormat; const SettingsTab = '<li class="hide-for-small-only"><a class="nav-link schedule-settings-button" href="https://www.livechart.me/preferences/general">Settings</a></li>'; let CustomScheduleTab; if (GM_getValue("start_date") == undefined) { CustomScheduleTab = '<li class="hide-for-small-only"><a class="nav-link" id="default-cschedule-button">Custom Schedule</a></li>'; } else { CustomScheduleTab = '<li class="hide-for-small-only"><a class="nav-link" href="' + scheduleDateLink + '">Custom Schedule</a></li>'; } $(SettingsTab).insertBefore('.site-header--navigation>.flex-spacer'); let headlinesButton = $('a[href="/headlines"]').parent(); $(headlinesButton).attr('id', 'headlines-button'); $(CustomScheduleTab).insertBefore('.site-header--navigation>#headlines-button'); const urlDateText = GetURLParameter('date'); let urlDateObject = convertToDateObject(urlDateText); shiftDate(urlDateObject, -7); const urlDateLastWeekText = convertToDateLinkText(urlDateObject); const urlDateButtonText = convertToDateButtonText(urlDateObject); const lastWeekButton = '<div class="column small-6"><a class="button clear" href="/timetable?date=' + urlDateLastWeekText + '" rel="nofollow"><i class="icon-navigate_first"></i>' + urlDateButtonText + '</a></div>'; let weekChangeRow = $('div.column.small-6.float-right.text-right').parent() if (weekChangeRow.find("a").length == 1) { weekChangeRow.prepend(lastWeekButton); } let currentCustomDate = convertToDateObject(currentCustomDateText); const scheduleDayText = getDayText(currentCustomDate); let futureDayText if (urlDateText == dateLinkFormat) { highlightTTDay(scheduleDayText, "today"); const scheduleDayNum = currentCustomDate.getDay(); for (let i = scheduleDayNum; i < 7; i++) { futureDayText = getDayTextFromNum(i); highlightTTDay(futureDayText, "future"); } const startingDay = GM_getValue("starting_day"); if (startingDay == "monday") { highlightTTDay("Sun", "future"); } else if (startingDay == "relative") { const relDaysDiff = speedChange(1); let _thisDay = (scheduleDayNum + 1) % 7; for (let i = 0; i < 7 - relDaysDiff; i++) { futureDayText = getDayTextFromNum(_thisDay); highlightTTDay(futureDayText, "future"); _thisDay = (_thisDay + 1) % 7; } } } let BrowseList = $('.small-up-4'); $('.small-up-4 > div:last-child').remove(); const rowsNum = 20; const colsNum = 4; let yearGrid = new Array (colsNum); for (let i = 0; i < colsNum; i++) { yearGrid[i] = new Array(rowsNum); } let i = 0; let k = 0; $('.small-up-4 div').each(function() { if (i < rowsNum) { yearGrid[k][i] = $(this); i++; } else { k++; if (k < colsNum) { i = 0; yearGrid[k][i] = $(this); } } }); const thisYear = $today.getFullYear(); for (let year = (thisYear - 3); year >= 1960; year--) { if (i < rowsNum) { yearGrid[k][i] = ('<div class="cell"><a class="px0" href="/winter-' + year + '/tv">' + year + '</a></div>'); i++; } else { k++; if (k < colsNum) { i = 0; year++; } } } $(BrowseList).empty(); let r = 0; let c = 0; for (let r = 0; r < rowsNum; r++) { for (let c = 0; c < colsNum; c++) { $(BrowseList).append(yearGrid[c][r]); } } $(BrowseList).removeClass('grid-padding-x'); let PreferencesList = '.large-push-2 > div[class="ul-tabs-overflow"] > ul[class="ul-tabs"]'; const ScheduleSettingsPrefTab = '<li class="ul-tab schedule-pref-tab"><a>Edit Schedule</a></li>'; $(PreferencesList).append(ScheduleSettingsPrefTab); let prefBody = $('form[action*="/preferences/"]'); $(".schedule-pref-tab").click(function() { const SchedulePrefFormStart = '<div class="callout">'; const StartDate = '<label class="string required" for="start_date"><abbr title="required">Type out the date that your custom schedule starts (YYYY-MM-DD)</label><input class="string required" required="required" aria-required="true" placeholder="2013-05-23" maxlength="20" pattern="*" size="20" type="text" value="" name="user[username]" id="start-date">'; const StartingDay = '<label for="starting_day">The starting day of the week is</label><select name="preferences[titles]" id="starting-day">'; const StartingDayOptions = '<option value="monday">Monday (Mo. Tu. We. Th. Fr. Sa. Su.)</option><option value="sunday">Sunday (Su. Mo. Tu. We. Th. Fr. Sa.)</option><option value="relative">Relative to the date</option></select>'; const DaysSpeed = '<label for="days_speed">Speed that schedule time passes <h5 style="display:inline"><a id="time-pass-info" title="The program will change the date that shows up in the Custom Schedule with every day that passes, and with one of these options selected, it will jump 2 days ahead for every day of real time, all the way up to 7 days ahead for every real time day. (Selecting respectively: [Each week lasts 4 days] and [Each week lasts 1 day])">🛈</a></h5></label><select name="preferences[titles]" id="days-speed">'; const DaysSpeedOptions = '<option value="7">Each week lasts 7 days</option><option value="1">Each week lasts 1 day</option></option><option value="1.5">Each week lasts 1.5 days</option><option value="2">Each week lasts 2 days</option><option value="3">Each week lasts 3 days</option><option value="4">Each week lasts 4 days</option></select>'; const SchedulePrefFormEnd = '<hr><button class="button" name="schedule-button">Save</button></div>'; $('.ul-tabs li').each(function() { $(this).removeClass('active'); }); $(".schedule-pref-tab").addClass('active'); prefBody.empty(); prefBody.append(SchedulePrefFormStart + StartDate + StartingDay + StartingDayOptions + DaysSpeed + DaysSpeedOptions + SchedulePrefFormEnd); let startDateValue = $('label[for="starting_day"]').val(); const prevStartingDayOption = 'option[value="' + GM_getValue("starting_day") + '"]'; $(prevStartingDayOption).attr("selected", "selected"); const prevSpeedOption = 'option[value="' + GM_getValue("days_speed") + '"]'; $(prevSpeedOption).attr("selected", "selected"); $('button[name="schedule-button"]').on('click', function(event) { event.preventDefault(); let startDateValue = $('#start-date').val(); let startingDayValue = $('#starting-day').val(); let daysSpeedValue = $('#days-speed').val(); GM_setValue("start_date", startDateValue); GM_setValue("starting_day", startingDayValue); GM_setValue("days_speed", daysSpeedValue); let $thisDate = new Date(); let thisDateText = convertToDateLinkText($thisDate); GM_setValue("setting_date", thisDateText); location.reload(); }); $("#time-pass-info").hover(function() { $("#time-info-text").css('visibility', function(i, visibility) { return (visibility == 'visible') ? 'hidden' : 'visible'; }); }); }); $("#default-cschedule-button").click(function() { const setupInstructions = '<h3> Click on the "Settings" tab, then from there, click on "Edit Schedule"<br> to add a new custom schedule.</h3>'; $("#content").empty(); $("#content").append(setupInstructions); }); });