// ==UserScript==
// @name Anime Schedule Countdown
// @namespace age
// @author age
// @version 1.1.1
// @description Anime schedule countdown display with auto-fetch from API
// @license MIT
// @match https://bgm.tv/
// @match https://bangumi.tv/
// @match https://chii.in/
// @connect raw.githubusercontent.com
// ==/UserScript==
(function() {
'use strict';
// 存储键名
const STORAGE_KEY = 'BGM_TV_ANIME_TIMELINE_AGE';
const SETTINGS_KEY = 'BGM_TV_ANIME_TIMELINE_SETTING_AGE';
// 默认时区 UTC+8
let currentTimezone = 8;
// 当前编辑的索引,-1表示新增
let currentEditIndex = -1;
// 是否显示已播放动画
let showPlayedAnime = false;
// 默认显示数量
let displayCount = 3;
const style = document.createElement('style');
style.textContent = `
#anime-schedule-container {
width: 93%;
background: rgba(33,33, 33, 0.6);
border-radius: 10px;
padding: 10px;
color: white;
font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
margin-bottom: 8px;
transform-origin: top;
transform: scaleY(0);
overflow: hidden;
max-height: 0;
opacity: 0;
transition: max-height 1.2s ease, opacity 1.2s ease;
}
html[data-theme='light'] #anime-schedule-container {
background: rgba(240, 240, 240, 0.6);
color: #333;
}
#anime-schedule-container.show {
max-height: 500px;
transform: scaleY(1);
opacity: 1;
}
#anime-schedule-countdown {
font-size: 18px;
font-weight: bold;
text-align: center;
margin-bottom: 8px;
color: #ff9e9e;
display: flex;
justify-content: space-between;
align-items: center;
}
html[data-theme='light'] #anime-schedule-countdown {
color: #dd9e9e;
}
.anime-schedule-item {
font-size: 13px;
margin-bottom: 6px;
line-height: 1.4;
opacity: 0.9;
}
.anime-schedule-item:nth-child(2) {
opacity: 0.9;
font-weight: bold;
}
.anime-schedule-item:nth-child(3) {
opacity: 0.9;
}
.anime-schedule-item:nth-child(4) {
opacity: 0.9;
}
.anime-schedule-completed {
font-size: 13px;
margin-bottom: 6px;
line-height: 1.4;
color: #c0c0c0;
opacity: 0.7;
}
html[data-theme='light'] .anime-schedule-completed {
color: #909090;
}
.anime-schedule-timeline {
height: 1px;
background-color: #555;
margin: 8px 0;
width: 100%;
}
#anime-schedule-modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.8);
display: flex;
justify-content: center;
align-items: center;
z-index: 10000;
opacity: 0;
pointer-events: none;
transition: opacity 0.3s ease;
}
#anime-schedule-modal.show {
opacity: 1;
pointer-events: auto;
}
#anime-schedule-modal-content {
background: rgba(40, 40, 40, 0.95);
border-radius: 10px;
padding: 20px;
width: 300px;
max-width: 90%;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.7);
position: relative;
}
/* 添加屏幕高度较低时的样式 */
@media (max-height: 600px) {
#anime-schedule-modal-content {
max-height: 90vh;
overflow-y: auto;
align-items: flex-start;
margin-top: 20px;
margin-bottom: 20px;
}
}
@media (max-width: 528px) {
#anime-schedule-container {
width: 95%;
}
}
#anime-schedule-modal-title {
font-size: 18px;
font-weight: bold;
margin-bottom: 15px;
color: #ff9e9e;
text-align: center;
}
.anime-schedule-form-group {
margin-bottom: 15px;
}
.anime-schedule-form-group label {
display: block;
margin-bottom: 5px;
font-size: 14px;
}
div.anime-schedule-form-group > label {
color: #ff9e9e;
}
.anime-schedule-form-group select {
width: 100%;
padding: 8px;
border-radius: 5px;
border: 1px solid #555;
background: rgba(30, 30, 30, 0.8);
color: white;
}
.anime-schedule-form-group input {
width: 94%;
padding: 8px;
border-radius: 5px;
border: 1px solid #555;
background: rgba(30, 30, 30, 0.8);
color: white;
}
#anime-schedule-time-inputs {
display: flex;
gap: 10px;
}
#anime-schedule-time-inputs input {
flex: 1;
}
#anime-schedule-schedule-list {
max-height: 200px;
overflow-y: auto;
margin-bottom: 15px;
background: rgba(30, 30, 30, 0.7);
padding: 10px;
border-radius: 5px;
}
.anime-schedule-schedule-item {
padding: 8px;
border-bottom: 1px solid #444;
font-size: 13px;
display: flex;
justify-content: space-between;
align-items: center;
cursor: pointer;
color: write;
}
.anime-schedule-schedule-item:hover {
background: rgba(50, 50, 50, 0.7);
}
.anime-schedule-schedule-item span {
color: white;
flex-grow: 1;
}
.anime-schedule-schedule-item:last-child {
border-bottom: none;
}
.anime-schedule-delete-btn {
background: none;
border: none;
color: #ff6b6b;
cursor: pointer;
font-size: 16px;
padding: 0 5px;
}
.anime-schedule-edit-btn {
background: none;
border: none;
color: #6b8cff;
cursor: pointer;
font-size: 14px;
padding: 0 5px;
margin-top: -3px;
}
#anime-schedule-add-btn {
background: #ff6b6b;
color: white;
border: none;
padding: 8px 15px;
border-radius: 5px;
cursor: pointer;
width: 100%;
font-weight: bold;
transition: background 0.2s;
}
#anime-schedule-add-btn:hover {
background: #ff5252;
}
#anime-schedule-close-btn {
position: absolute;
top: 10px;
right: 10px;
background: none;
border: none;
color: #aaa;
font-size: 32px;
cursor: pointer;
}
#anime-schedule-button-container {
display: flex;
gap: 10px;
margin-bottom: 10px;
}
#anime-schedule-auto-fetch-btn {
background: #6b8cff;
color: white;
border: none;
padding: 8px 15px;
border-radius: 5px;
cursor: pointer;
font-weight: bold;
transition: background 0.2s;
flex: 40%;
}
#anime-schedule-timezone-select {
background: #6bff8c;
color: white;
border: none;
padding: 8px 5px;
border-radius: 5px;
cursor: pointer;
font-weight: bold;
transition: background 0.2s;
flex: 30%;
text-align: center;
}
.show-played-toggle {
display: flex;
align-items: center;
gap: 5px;
cursor: pointer;
font-size: 14px;
color: #aaa;
}
.show-played-toggle .toggle-circle {
width: 16px;
height: 16px;
border: 2px solid #aaa;
border-radius: 50%;
position: relative;
}
.show-played-toggle .toggle-circle.filled {
background-color: #ff9e9e;
border-color: #ff9e9e;
}
#anime-schedule-display-count {
background: #ff9e9e;
color: white;
border: none;
padding: 8px 5px;
border-radius: 5px;
cursor: pointer;
font-weight: bold;
transition: background 0.2s;
flex: 30%;
text-align: center;
}
`;
document.head.appendChild(style);
function waitForContainer() {
return new Promise(resolve => {
const checkInterval = setInterval(() => {
// 检查是否是窄屏移动端
const isNarrowScreen = window.matchMedia('(max-width: 528px)').matches;
let targetContainer;
if (isNarrowScreen) {
targetContainer = document.getElementById('columnHomeA');
} else {
targetContainer = document.getElementById('columnHomeB');
}
if (targetContainer) {
clearInterval(checkInterval);
resolve(targetContainer);
}
}, 500);
});
}
// 加载设置
function loadSettings() {
const settings = localStorage.getItem(SETTINGS_KEY);
if (settings) {
try {
const parsed = JSON.parse(settings);
if (parsed.played !== undefined) {
showPlayedAnime = parsed.played === "True";
}
if (parsed.size !== undefined) {
displayCount = parseInt(parsed.size);
// Ensure display count is within 2-8 range
if (displayCount < 2) displayCount = 2;
if (displayCount > 8) displayCount = 8;
}
} catch (e) {
console.error('Failed to parse settings:', e);
}
}
}
// 保存设置
function saveSettings() {
const settings = {
played: showPlayedAnime ? "True" : "False",
size: displayCount.toString()
};
localStorage.setItem(SETTINGS_KEY, JSON.stringify(settings));
}
// 切换显示已播放动画
function toggleShowPlayed() {
showPlayedAnime = !showPlayedAnime;
saveSettings();
updateCountdown();
updateToggleButton();
}
// 更新切换按钮状态
function updateToggleButton() {
const toggleCircle = document.querySelector('.show-played-toggle .toggle-circle');
if (toggleCircle) {
toggleCircle.classList.toggle('filled', showPlayedAnime);
}
}
// 更新显示数量
function updateDisplayCount() {
const countSelect = document.getElementById('anime-schedule-display-count');
if (countSelect) {
displayCount = parseInt(countSelect.value);
saveSettings();
updateCountdown();
}
}
async function initialize() {
const targetContainer = await waitForContainer();
loadSettings();
// 初始化
const container = document.createElement('div');
container.id = 'anime-schedule-container';
container.innerHTML = `
<div id="anime-schedule-countdown">
<span>00:00</span>
<div class="show-played-toggle">
<span>显示已放送</span>
<div class="toggle-circle ${showPlayedAnime ? 'filled' : ''}"></div>
</div>
</div>
<div class="anime-schedule-item">加载中...</div>
<div class="anime-schedule-item"></div>
<div class="anime-schedule-item"></div>
<div class="anime-schedule-timeline"></div>
<div id="anime-schedule-completed-container"></div>
`;
const isNarrowScreen = window.matchMedia('(max-width: 528px)').matches;
if (isNarrowScreen) {
// 如果是窄屏,插入到 columnHomeA 的顶部
targetContainer.insertBefore(container, targetContainer.firstChild);
} else {
// 如果是宽屏,插入到 columnHomeB 的顶部
targetContainer.insertBefore(container, targetContainer.firstChild);
}
// 添加动画效果
setTimeout(() => {
container.classList.add('show');
}, 50);
// 添加切换按钮事件
const toggleButton = container.querySelector('.show-played-toggle');
toggleButton.addEventListener('click', function(e) {
e.stopPropagation(); // 防止事件冒泡触发容器点击事件
showPlayedAnime = !showPlayedAnime;
saveSettings();
updateToggleButton();
updateCountdown(); // 立即刷新显示
});
// 初始化设置框
const modal = document.createElement('div');
modal.id = 'anime-schedule-modal';
modal.innerHTML = `
<div id="anime-schedule-modal-content">
<button id="anime-schedule-close-btn">×</button>
<div id="anime-schedule-modal-title">添加动画时间</div>
<div id="anime-schedule-button-container">
<button id="anime-schedule-auto-fetch-btn">自动获取时间</button>
<select id="anime-schedule-timezone-select">
<option value="-12">UTC-12</option>
<option value="-11">UTC-11</option>
<option value="-10">UTC-10</option>
<option value="-9">UTC-9</option>
<option value="-8">UTC-8</option>
<option value="-7">UTC-7</option>
<option value="-6">UTC-6</option>
<option value="-5">UTC-5</option>
<option value="-4">UTC-4</option>
<option value="-3">UTC-3</option>
<option value="-2">UTC-2</option>
<option value="-1">UTC-1</option>
<option value="0">UTC±0</option>
<option value="1">UTC+1</option>
<option value="2">UTC+2</option>
<option value="3">UTC+3</option>
<option value="4">UTC+4</option>
<option value="5">UTC+5</option>
<option value="6">UTC+6</option>
<option value="7">UTC+7</option>
<option value="8" selected>UTC+8</option>
<option value="9">UTC+9</option>
<option value="10">UTC+10</option>
<option value="11">UTC+11</option>
<option value="12">UTC+12</option>
</select>
<select id="anime-schedule-display-count">
<option value="2" ${displayCount === 2 ? 'selected' : ''}>显示2部</option>
<option value="3" ${displayCount === 3 ? 'selected' : ''}>显示3部</option>
<option value="4" ${displayCount === 4 ? 'selected' : ''}>显示4部</option>
<option value="5" ${displayCount === 5 ? 'selected' : ''}>显示5部</option>
<option value="6" ${displayCount === 6 ? 'selected' : ''}>显示6部</option>
<option value="7" ${displayCount === 7 ? 'selected' : ''}>显示7部</option>
<option value="8" ${displayCount === 8 ? 'selected' : ''}>显示8部</option>
</select>
</div>
<div id="anime-schedule-schedule-list"></div>
<div class="anime-schedule-form-group">
<label for="anime-schedule-day">星期</label>
<select id="anime-schedule-day">
<option value="0">周日</option>
<option value="1">周一</option>
<option value="2">周二</option>
<option value="3">周三</option>
<option value="4">周四</option>
<option value="5">周五</option>
<option value="6">周六</option>
</select>
</div>
<div class="anime-schedule-form-group">
<label>时间</label>
<div id="anime-schedule-time-inputs">
<input type="number" id="anime-schedule-hour" min="0" max="23" placeholder="时" value="20">
<input type="number" id="anime-schedule-minute" min="0" max="59" placeholder="分" value="00">
</div>
</div>
<div class="anime-schedule-form-group">
<label for="anime-schedule-name">动画名称</label>
<input type="text" id="anime-schedule-name" placeholder="输入动画名称">
</div>
<button id="anime-schedule-add-btn">添加</button>
</div>
`;
document.body.appendChild(modal);
// 获取当前存储的时间表
function getSchedule() {
const stored = localStorage.getItem(STORAGE_KEY);
return stored ? JSON.parse(stored) : [];
}
// 保存时间表
function saveSchedule(schedule) {
localStorage.setItem(STORAGE_KEY, JSON.stringify(schedule));
}
// 删除时间表项
function deleteScheduleItem(index) {
const schedule = getSchedule();
schedule.splice(index, 1);
saveSchedule(schedule);
updateScheduleList();
updateCountdown();
}
// 重置
function resetForm() {
document.getElementById('anime-schedule-day').value = '0';
document.getElementById('anime-schedule-hour').value = '20';
document.getElementById('anime-schedule-minute').value = '00';
document.getElementById('anime-schedule-name').value = '';
document.getElementById('anime-schedule-add-btn').textContent = '添加';
currentEditIndex = -1;
}
// 添加或更新时间
function addOrUpdateSchedule() {
const day = parseInt(document.getElementById('anime-schedule-day').value);
const hour = parseInt(document.getElementById('anime-schedule-hour').value);
const minute = parseInt(document.getElementById('anime-schedule-minute').value);
const name = document.getElementById('anime-schedule-name').value.trim();
if (!name) {
alert('请输入动画名称');
return;
}
const schedule = getSchedule();
if (currentEditIndex >= 0) {
// 更新现有项
schedule[currentEditIndex] = { day, hour, minute, name };
} else {
// 添加新项
schedule.push({ day, hour, minute, name });
}
// 按时间排序
schedule.sort((a, b) => {
if (a.day !== b.day) return a.day - b.day;
if (a.hour !== b.hour) return a.hour - b.hour;
return a.minute - b.minute;
});
saveSchedule(schedule);
updateScheduleList();
updateCountdown();
resetForm();
}
// 编辑时间表项
function editScheduleItem(index) {
const schedule = getSchedule();
if (index >= 0 && index < schedule.length) {
const item = schedule[index];
document.getElementById('anime-schedule-day').value = item.day;
document.getElementById('anime-schedule-hour').value = item.hour;
document.getElementById('anime-schedule-minute').value = item.minute;
document.getElementById('anime-schedule-name').value = item.name;
document.getElementById('anime-schedule-add-btn').textContent = '更新';
currentEditIndex = index;
}
}
// 更新时间表列表显示
function updateScheduleList() {
const schedule = getSchedule();
const listEl = document.getElementById('anime-schedule-schedule-list');
if (schedule.length === 0) {
listEl.innerHTML = '<div class="anime-schedule-schedule-item">暂无时间表</div>';
return;
}
const days = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
listEl.innerHTML = schedule.map((item, index) => {
const time = `${item.hour.toString().padStart(2, '0')}:${item.minute.toString().padStart(2, '0')}`;
return `
<div class="anime-schedule-schedule-item" data-index="${index}">
<span>${days[item.day]} ${time} - ${item.name}</span>
<button class="anime-schedule-edit-btn" data-index="${index}">✎</button>
<button class="anime-schedule-delete-btn" data-index="${index}">×</button>
</div>
`;
}).join('');
document.querySelectorAll('.anime-schedule-delete-btn').forEach(btn => {
btn.addEventListener('click', (e) => {
e.stopPropagation();
const index = parseInt(btn.dataset.index);
deleteScheduleItem(index);
});
});
// 添加编辑按钮
document.querySelectorAll('.anime-schedule-edit-btn').forEach(btn => {
btn.addEventListener('click', (e) => {
e.stopPropagation();
const index = parseInt(btn.dataset.index);
editScheduleItem(index);
});
});
// 添加点击整行编辑
document.querySelectorAll('.anime-schedule-schedule-item').forEach(item => {
item.addEventListener('click', (e) => {
if (!e.target.classList.contains('anime-schedule-delete-btn') &&
!e.target.classList.contains('anime-schedule-edit-btn')) {
const index = parseInt(item.dataset.index);
editScheduleItem(index);
}
});
});
}
// 计算距离下一个动画的时间
function calculateTimeUntilNextAnime() {
const now = new Date();
const currentDay = now.getDay(); // 0 (周日) 到 6 (周六)
const currentHour = now.getHours();
const currentMinute = now.getMinutes();
const schedule = getSchedule();
if (schedule.length === 0) return null;
// 找到下一个即将播放的动画
let nextAnime = null;
let nextAnimeDiff = Infinity;
let nextAnimeIndex = -1;
// 存储已完成播放的动画
const completedAnime = [];
for (let i = 0; i < schedule.length; i++) {
const item = schedule[i];
let diff = (item.day - currentDay) * 24 * 60 +
(item.hour - currentHour) * 60 +
(item.minute - currentMinute);
// 如果是今天已经播放过的动画,加入已完成列表
if (diff < 0 && diff > -18 * 60) {
completedAnime.push(item);
}
if (diff > 150 * 60 && diff < 168 * 60) {
completedAnime.push(item);
}
// 如果本周已经过了这个时间,看下周的
if (diff < 0) diff += 7 * 24 * 60;
if (diff < nextAnimeDiff) {
nextAnimeDiff = diff;
nextAnime = item;
nextAnimeIndex = i;
}
}
// 找到接下来要放送的动画
const upcomingAnime = [];
for (let i = 0; i < displayCount; i++) {
const index = (nextAnimeIndex + i) % schedule.length;
upcomingAnime.push(schedule[index]);
}
return {
nextAnime,
nextAnimeDiff,
upcomingAnime,
completedAnime
};
}
// 更新倒计时显示
function updateCountdown() {
const result = calculateTimeUntilNextAnime();
const countdownEl = document.getElementById('anime-schedule-countdown');
const itemsContainer = document.getElementById('anime-schedule-container');
const completedContainer = document.getElementById('anime-schedule-completed-container');
const timelineEl = document.querySelector('.anime-schedule-timeline');
const existingItems = itemsContainer.querySelectorAll('.anime-schedule-item');
existingItems.forEach(item => item.remove());
if (!result || !result.nextAnime) {
countdownEl.querySelector('span').textContent = '00:00';
const noScheduleItem = document.createElement('div');
noScheduleItem.className = 'anime-schedule-item';
noScheduleItem.textContent = '没有设置时间表';
itemsContainer.insertBefore(noScheduleItem, timelineEl);
completedContainer.innerHTML = '';
timelineEl.style.display = 'none';
return;
}
const { nextAnime, nextAnimeDiff, upcomingAnime, completedAnime } = result;
const days = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
// 更新倒计时
const hours = Math.floor(nextAnimeDiff / 60);
const minutes = nextAnimeDiff % 60;
countdownEl.querySelector('span').textContent = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;
// 创建并添加新的项目元素
upcomingAnime.forEach((item, index) => {
const timeStr = `${days[item.day]} ${item.hour.toString().padStart(2, '0')}:${item.minute.toString().padStart(2, '0')}`;
const itemEl = document.createElement('div');
itemEl.className = 'anime-schedule-item';
itemEl.textContent = `${timeStr} - ${item.name}`;
// 第一个项目加粗
if (index === 0) {
itemEl.style.fontWeight = 'bold';
}
itemsContainer.insertBefore(itemEl, timelineEl);
});
// 更新已完成播放的动画
if (completedAnime && completedAnime.length > 0) {
timelineEl.style.display = showPlayedAnime ? 'block' : 'none';
completedContainer.innerHTML = '';
// 按时间排序(从早到晚)
completedAnime.sort((a, b) => {
if (a.hour !== b.hour) return a.hour - b.hour;
return a.minute - b.minute;
});
if (showPlayedAnime) {
// 添加已完成的动画
completedAnime.forEach(item => {
const timeStr = `${days[item.day]} ${item.hour.toString().padStart(2, '0')}:${item.minute.toString().padStart(2, '0')}`;
const completedEl = document.createElement('div');
completedEl.className = 'anime-schedule-completed';
completedEl.textContent = `${timeStr} - ${item.name}`;
completedContainer.appendChild(completedEl);
});
}
} else {
timelineEl.style.display = 'none';
completedContainer.innerHTML = '';
}
}
// 自动获取动画时间表
async function autoFetchSchedule() {
if (!confirm('此操作将清空目前的时间表,是否继续?')) {
return;
}
// 获取当前选择的时区
currentTimezone = parseInt(document.getElementById('anime-schedule-timezone-select').value);
// 获取页面中的条目ID
const subjectLinks = document.querySelectorAll('#cloumnSubjectInfo .infoWrapper_tv.hidden.clearit a[href^="/subject/"]');
const subjectIds = new Set();
subjectLinks.forEach(link => {
const href = link.getAttribute('href');
const match = href.match(/^\/subject\/(\d+)/);
if (match && match[1]) {
subjectIds.add(match[1]);
}
});
if (subjectIds.size === 0) {
alert('未找到任何动画条目ID');
return;
}
try {
// 从GitHub获取时间表数据
const response = await fetch('https://raw.githubusercontent.com/zhollgit/bgm-onair/main/onair.json');
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
const newSchedule = [];
// 处理API返回的数据
data.items.forEach(item => {
// 查找bangumi站点ID
const bangumiSite = item.sites.find(site => site.site === 'bangumi');
if (bangumiSite && bangumiSite.id && subjectIds.has(bangumiSite.id)) {
if (item.begin) {
const beginDate = new Date(item.begin);
// 根据设置的时区调整时间
beginDate.setHours(beginDate.getHours() + currentTimezone);
const day = beginDate.getUTCDay(); // 0-6 (周日到周六)
const hour = beginDate.getUTCHours();
const minute = beginDate.getUTCMinutes();
// 获取中文名称或使用原标题
let name = item.title;
if (item.titleTranslate && item.titleTranslate['zh-Hans'] && item.titleTranslate['zh-Hans'].length > 0) {
name = item.titleTranslate['zh-Hans'][0];
}
newSchedule.push({
day,
hour,
minute,
name
});
}
}
});
if (newSchedule.length === 0) {
alert('未找到匹配的时间表数据');
return;
}
// 保存新的时间表
saveSchedule(newSchedule);
updateScheduleList();
updateCountdown();
alert(`成功获取 ${newSchedule.length} 个动画的时间表`);
// 添加"测试内容"动画
setTimeout(() => {
// 设置表单值
document.getElementById('anime-schedule-day').value = '1'; // 周一
document.getElementById('anime-schedule-hour').value = '12';
document.getElementById('anime-schedule-minute').value = '30';
document.getElementById('anime-schedule-name').value = '测试内容';
// 添加新时间
addOrUpdateSchedule();
// 删除刚添加的"测试内容"
setTimeout(() => {
const schedule = getSchedule();
const testIndex = schedule.findIndex(item => item.name === '测试内容');
if (testIndex !== -1) {
deleteScheduleItem(testIndex);
}
}, 500);
}, 500);
} catch (error) {
console.error('获取时间表失败:', error);
alert('获取时间表失败: ' + error.message);
}
}
container.addEventListener('click', (e) => {
// 防止点击切换按钮时触发
if (!e.target.closest('.show-played-toggle')) {
document.getElementById('anime-schedule-modal').classList.add('show');
resetForm();
updateScheduleList();
}
});
document.getElementById('anime-schedule-close-btn').addEventListener('click', () => {
document.getElementById('anime-schedule-modal').classList.remove('show');
resetForm();
});
document.getElementById('anime-schedule-add-btn').addEventListener('click', addOrUpdateSchedule);
document.getElementById('anime-schedule-auto-fetch-btn').addEventListener('click', autoFetchSchedule);
document.getElementById('anime-schedule-display-count').addEventListener('change', updateDisplayCount);
// 初始化并开始定时更新
updateCountdown();
setInterval(updateCountdown, 60000); // 每分钟更新一次
}
initialize();
})();