SpringSunday-Torrent-Assistant

春天审种助手

// ==UserScript==
// @name         SpringSunday-Torrent-Assistant
// @namespace    http://tampermonkey.net/
// @version      1.1.56
// @description  春天审种助手
// @author       SSD
// @include      http*://springsunday.net/details.php*
// @include      http*://springsunday.net/torrents.php*
// @grant        GM_xmlhttpRequest
// @grant        GM_setValue
// @grant        GM_getValue
// @connect      movie.douban.com
// @connect      cmct.xyz
// @connect      static.hdcmct.org
// @connect      gifyu.com
// @connect      imgbox.com
// @connect      pixhost.to
// @connect      ptpimg.me
// @connect      ibb.pics
// @license      MIT
// ==/UserScript==


(function () {
    'use strict';

    //种审判断
    //=====================================
    var isEditor;
    if (GM_info.script.name === "SpringSunday-Torrent-Assistant 测试版") {
        isEditor= GM_getValue('isEditor', true);
    }else {
        isEditor= GM_getValue('isEditor', false);
    }

    if (window.location.href.includes("/details.php")) {

        $('#outer').prepend('<div style="display: inline-block; padding: 10px 30px; color: white; background: red; font-weight: bold;" id="assistant-tooltips"></div>');

        // 查找目标div
        var targetDiv = document.querySelector('#assistant-tooltips');
        if (targetDiv) {
            // 创建多选框和标签
            var checkbox = document.createElement('input');
            checkbox.type = 'checkbox';
            checkbox.id = 'editorModeCheckbox';
            checkbox.checked = isEditor;

            var label = document.createElement('label');
            label.htmlFor = 'editorModeCheckbox';
            label.textContent = '种审模式';

            // 创建包含多选框和标签的新div
            var containerDiv = document.createElement('div');
            containerDiv.style.cssText = 'display: inline-block; margin-left: 20px; vertical-align: top;';
            containerDiv.appendChild(checkbox);
            containerDiv.appendChild(label);

            // 创建换行元素并插入
            var breakElement = document.createElement('br');
            targetDiv.parentNode.insertBefore(breakElement, targetDiv.nextSibling);
            targetDiv.parentNode.insertBefore(containerDiv, breakElement.nextSibling);

            // 添加事件监听器来更新isEditor变量、存储状态并刷新页面
            checkbox.addEventListener('change', function () {
                GM_setValue('isEditor', this.checked);
                window.location.reload();  // 刷新页面
            });
        }
        if (isEditor) {
            $('#assistant-tooltips').after('<br/><div style="display: inline-block; padding: 10px 30px; color: white; background: DarkSlateGray; font-weight: bold;" id="editor-tooltips"></div>');
        }


        // 从 `@downloadURL` 或 `@updateURL` 中提取脚本 ID
        const scriptUrl = GM_info.scriptMetaStr.match(/@downloadURL\s+(.*)/)[1];
        const scriptIdMatch = scriptUrl.match(/\/scripts\/(\d+)/);
        const scriptId = scriptIdMatch ? scriptIdMatch[1] : null;

        if (scriptId) {
            console.log(`自动获取的脚本 ID: ${scriptId}`);

            // 示例:使用脚本 ID 进行版本检查
            const currentVersion = GM_info.script.version;

            // 获取当前时间戳(单位:毫秒)
            const now = Date.now();

            // 获取上次检查的时间戳(默认值为 0)
            const lastCheckTime = GM_getValue('lastCheckTime', 0);

            // 检查是否超过一小时(600000 毫秒)
            if (now - lastCheckTime > 900000) {
                console.log('超过十五分钟未检查版本,开始检查...');

                // 调用 Greasy Fork API 获取脚本信息
                GM_xmlhttpRequest({
                    method: 'GET',
                    url: `https://greasyfork.org/scripts/${scriptId}.json`,
                    onload: function (response) {
                        if (response.status === 200) {
                            const scriptData = JSON.parse(response.responseText);

                            // 获取最新版本号
                            const latestVersion = scriptData.version;
                            console.log(`当前版本: ${currentVersion}`);
                            console.log(`最新版本: ${latestVersion}`);

                            // 比较版本号
                            if (currentVersion !== latestVersion) {
                                $('#editor-tooltips').append('发现最新版本,请更新。<br>');
                            } else {
                                console.log('脚本已是最新版本。');
                            }

                            // 更新检查时间戳
                            GM_setValue('lastCheckTime', now);
                        } else {
                            console.error('无法获取脚本信息。');
                        }
                    },
                    onerror: function () {
                        console.error('请求 Greasy Fork API 失败。');
                    },
                });
            } else {
                console.log(`未超过一小时,无需检查版本。(${Math.floor((3600000 - (now - lastCheckTime)) / 60000)} 分钟后再检查)`);
            }
        } else {
            console.error('无法自动获取脚本 ID,请检查脚本的 @downloadURL 或 @updateURL 是否正确。');
        }


        var cat_constant = {
            501: 'Movies(电影)',
            502: 'TV Series(剧集)',
            503: 'Docs(纪录)',
            505: 'TV Shows(综艺)',
            506: 'Sports(体育)',
            507: 'MV(音乐视频)',
            508: 'Music(音乐)',
            509: 'Others(其他类型)'
        };
        var type_constant = {
            1: 'Blu-ray',
            2: 'MiniBD',
            3: 'DVD',
            4: 'Remux',
            5: 'HDTV',
            6: 'BDRip',
            7: 'WEB-DL',
            8: 'WEBRip',
            9: 'TVRip',
            10: 'DVDRip',
            11: 'CD',
            99: 'Other'
        };

        var encode_constant = {
            1: 'H.265/HEVC',
            2: 'H.264/AVC',
            3: 'VC-1',
            4: 'MPEG-2',
            99: 'Other'
        };

        var audio_constant = {
            1: 'DTS-HD',
            2: 'TrueHD',
            3: 'DTS',
            4: 'AC-3',
            5: 'AAC',
            6: 'LPCM',
            7: 'FLAC',
            8: 'APE',
            9: 'WAV',
            10: 'MP3',
            11: 'E-AC-3',
            99: 'Other'
        };

        var resolution_constant = {
            1: '2160p',
            2: '1080p',
            3: '1080i',
            4: '720p',
            5: 'SD',
            99: ' 未检测到分辨率 '
        };

        var area_constant = {
            1: 'Mainland(大陆)',
            2: 'Hongkong(香港)',
            3: 'Taiwan(台湾)',
            4: 'West(欧美)',
            5: 'Japan(日本)',
            6: 'Korea(韩国)',
            7: 'India(印度)',
            8: 'Russia(俄国)',
            9: 'Thailand(泰国)',
            99: 'Other(其他地区)'
        }

        var group_constant = {
            1: 'CMCT',
            8: 'CMCTA',
            9: 'CMCTV',
            3: 'DIY',
            6: '个人原创',
        }

        var title = $('#torrent-name').text();
        var exclusive = 0;
        if (title.indexOf('禁转') >= 0) {
            exclusive = 1;
        }

        title = title.trim();
        console.log(title);

        var title_lowercase = title.toLowerCase();
        var title_type, title_encode, title_audio, title_resolution, title_group, title_is_complete;

        // 格式
        if (/\.minibd/.test(title_lowercase)) {
            title_type = 2;
        } else if (/\.remux/.test(title_lowercase)) {
            title_type = 4;
        } else if (/\.bdrip/.test(title_lowercase) || (/(\.bluray|\.blu-ray)/.test(title_lowercase) && /\.x26[45]/.test(title_lowercase))) {
            title_type = 6;
        } else if (/(\.bluray|\.blu-ray)/.test(title_lowercase)) {
            title_type = 1;
        } else if (/\.webrip/.test(title_lowercase) || (/\.web\./.test(title_lowercase) && /\.x26[45]/.test(title_lowercase))) {
            title_type = 8;
        } else if (/(\.web-dl|\.webdl|\.web\.)/.test(title_lowercase)) {
            title_type = 7;
        } else if (/\.tvrip/.test(title_lowercase)) {
            title_type = 9;
        } else if (/(\.hdtv|\.hdtv\.)/.test(title_lowercase)) {
            title_type = 5;
        } else if (/\.dvdrip/.test(title_lowercase) || ((/(\.dvd|\.dvd\.)/.test(title_lowercase)) && /\.x26[45]/.test(title_lowercase))) {
            title_type = 10;
        } else if (/(\.dvd|\.dvd\.)/.test(title_lowercase)) {
            title_type = 3;
        }
        // codec
        if (/(\.x265|\.h265|\.h\.265|\.hevc)/.test(title_lowercase)) {
            title_encode = 1;
        } else if (/(\.x264|\.h264|\.h\.264|\.avc)/.test(title_lowercase)) {
            title_encode = 2;
        } else if (/(\.vc-1|\.vc1)/.test(title_lowercase)) {
            title_encode = 3;
        } else if (/(mpeg2|mpeg-2)/.test(title_lowercase)) {
            title_encode = 4;
        }

        // audiocodec
        if (/\.(dts-hd|dtshd|dts-x|dts:x)/.test(title_lowercase)) {
            title_audio = 1;
        } else if (/\.truehd/.test(title_lowercase)) {
            title_audio = 2;
        } else if (/\.lpcm|\.pcm/.test(title_lowercase)) {
            title_audio = 6;
        } else if (/\.dts/.test(title_lowercase)) {
            title_audio = 3;
        }else if (/\.ddp|\.dd\+|\.e-ac-3|\.eac3/.test(title_lowercase)) {
            title_audio = 11;
        } else if (/\.ac3|\.ac-3|\.dd2|\.dd5|\.dd\.2|\.dd\.5/.test(title_lowercase)) {
            title_audio = 4;
        } else if (/\.aac/.test(title_lowercase)) {
            title_audio = 5;
        } else if (/\.flac/.test(title_lowercase)) {
            title_audio = 7;
        }
        console.log("title_audio"+title_audio)
        // standard
        if (!/remastered/.test(title_lowercase) && (/\.2160p/.test(title_lowercase) || (/\.uhd/.test(title_lowercase) && !/\.1080p/.test(title_lowercase)) || /\.4k\./.test(title_lowercase))) {
            title_resolution = 1;
        } else if (/\.1080p/.test(title_lowercase)) {
            title_resolution = 2;
        } else if (/\.1080i/.test(title_lowercase)) {
            title_resolution = 3;
        } else if (/\.720p/.test(title_lowercase)) {
            title_resolution = 4;
        } else {
            title_resolution = 99;
        }
        if (/complete/.test(title_lowercase)) {
            title_is_complete = true;
        }
        // 发布组选择
        if (/cmctv/.test(title_lowercase)) {
            title_group = 9;
        } else if (/cmcta/.test(title_lowercase)) {
            title_group = 8;
        } else if (/cmct/.test(title_lowercase)) {
            title_group = 1;
        }
        console.log('title_type:', title_type, 'title_encode:', title_encode, 'title_audio:', title_audio, 'title_resolution:', title_resolution, 'title_group:', title_group, 'title_is_complete:', title_is_complete);


        var subtitle, cat, type, encode, audio, resolution, area, group, anonymous;
        var poster;
        var fixtd, douban, imdb, mediainfo_title, mediainfo_s, torrent_extra, douban_raw,havedouban,haveimdb;
        var sub_chinese, audio_chinese, is_complete, is_chinese, is_dovi, is_hdr10, is_hdr10p, is_hlg, is_hdr_vivid,
            is_c_dub, is_bd, is_cc,is_anime,is_contest,is_selfrelease,is_internal;
        var tdlist = $('#outer table:first').find('td');

        // Mediainfo 信息
        let mediainfoElement = document.querySelector('.mediainfo-short .codemain');
        if (mediainfoElement) {
            mediainfo_s = mediainfoElement.innerHTML.replace(/<br\s*\/?>/gi, '\n').trim();
        } else {
            $('#assistant-tooltips').append('无「MediaInfo」信息,请检查<br/>');
            mediainfo_s = '   '
        }

        mediainfo_title = $('.mediainfo-raw .codemain').text();
        for (var i = 0; i < tdlist.length; i++) {
            var td = $(tdlist[i]);

            if (td.text() === '副标题' || td.text() === '副標題') {
                subtitle = td.parent().children().last().text();
            }

            if (td.text() === '添加') {
                let text = td.parent().children().last().text();
                if (text.indexOf('匿名') >= 0) {
                    anonymous = 1;
                }
            }

            if (td.text() === '基本信息') {

                var catText = $('span[title="类型"]').text();
                var typeText = $('span[title="格式"]').text();
                var encodeText = $('span[title="视频编码"]').text();
                var audioText = $('span[title="音频编码"]').text();
                var resolutionText = $('span[title="分辨率"]').text();
                var areaText = $('span[title="地区"]').text();
                var authorText = $('span[title="制作组"]').text();
                console.log(catText + typeText + encodeText + audioText + resolutionText + areaText + authorText)

                // 类型
                if (/Movies\(电影\)/.test(catText)) {
                    cat = 501;
                } else if (/TV Series\(剧集\)/.test(catText)) {
                    cat = 502;
                } else if (/Docs\(纪录\)/.test(catText)) {
                    cat = 503;
                } else if (/TV Shows\(综艺\)/.test(catText)) {
                    cat = 505;
                } else if (/Sports\(体育\)/.test(catText)) {
                    cat = 506;
                } else if (/MV\(音乐视频\)/.test(catText)) {
                    cat = 507;
                } else if (/Music\(音乐\)/.test(catText)) {
                    cat = 508;
                } else if (/Other\(其他类型\)/.test(catText)) {
                    cat = 509;
                }

                // 地区
                if (/Mainland\(大陆\)/.test(areaText)) {
                    area = 1;
                } else if (/Hongkong\(香港\)/.test(areaText)) {
                    area = 2;
                } else if (/Taiwan\(台湾\)/.test(areaText)) {
                    area = 3;
                } else if (/West\(欧美\)/.test(areaText)) {
                    area = 4;
                } else if (/Japan\(日本\)/.test(areaText)) {
                    area = 5;
                } else if (/Korea\(韩国\)/.test(areaText)) {
                    area = 6;
                } else if (/India\(印度\)/.test(areaText)) {
                    area = 7;
                } else if (/Russia\(俄国\)/.test(areaText)) {
                    area = 8;
                } else if (/Thailand\(泰国\)/.test(areaText)) {
                    area = 9;
                } else if (/Other\(其他地区\)/.test(areaText)) {
                    area = 99;
                }

                // 格式
                if (/Blu-ray/.test(typeText)) {
                    type = 1;
                } else if (/Remux/.test(typeText)) {
                    type = 4;
                } else if (/MiniBD/.test(typeText)) {
                    type = 2;
                } else if (/BDRip/.test(typeText)) {
                    type = 6;
                } else if (/WEB-DL/.test(typeText)) {
                    type = 7;
                } else if (/WEBRip/.test(typeText)) {
                    type = 8;
                } else if (/HDTV/.test(typeText)) {
                    type = 5;
                } else if (/TVRip/.test(typeText)) {
                    type = 9;
                } else if (/DVDRip/.test(typeText)) {
                    type = 10;
                } else if (/DVD/.test(typeText)) {
                    type = 3;
                } else if (/CD/.test(typeText)) {
                    type = 11;
                } else if (/Other/.test(typeText)) {
                    type = 99;
                }

                // 视频编码
                if (/H\.265\/HEVC/.test(encodeText)) {
                    encode = 1;
                } else if (/H\.264\/AVC/.test(encodeText)) {
                    encode = 2;
                } else if (/VC-1/.test(encodeText)) {
                    encode = 3;
                } else if (/MPEG-2/.test(encodeText)) {
                    encode = 4;
                } else if (/Other/.test(encodeText)) {
                    encode = 99;
                }

                // 音频编码
                if (/DTS-HD/.test(audioText)) {
                    audio = 1;
                } else if (/DTS/.test(audioText)) {
                    audio = 3;
                } else if (/TrueHD/.test(audioText)) {
                    audio = 2;
                } else if (/LPCM/.test(audioText)) {
                    audio = 6;
                } else if (/E-AC-3/.test(audioText)) {
                    audio = 11;
                } else if (/AC-3/.test(audioText)) {
                    audio = 4;
                } else if (/AAC/.test(audioText)) {
                    audio = 5;
                } else if (/FLAC/.test(audioText)) {
                    audio = 7;
                } else if (/APE/.test(audioText)) {
                    audio = 8;
                } else if (/WAV/.test(audioText)) {
                    audio = 9;
                } else if (/MP3/.test(audioText)) {
                    audio = 10;
                } else if (/Other/.test(audioText)) {
                    audio = 99;
                }

                // 视频分辨率
                if (/2160p/.test(resolutionText)) {
                    resolution = 1;
                } else if (/1080p/.test(resolutionText)) {
                    resolution = 2;
                } else if (/1080i/.test(resolutionText)) {
                    resolution = 3;
                } else if (/720p/.test(resolutionText)) {
                    resolution = 4;
                } else if (/SD/.test(resolutionText)) {
                    resolution = 5;
                } else if (/Other/.test(resolutionText)) {
                    resolution = 99;
                }

                // 制作组
                if (/CMCTV/.test(authorText)) {
                    group = 9;
                } else if (/CMCTA/.test(authorText)) {
                    group = 8;
                } else if (/CMCT/.test(authorText)) {
                    group = 1;
                } else if (/DIY/.test(authorText)) {
                    group = 3;
                } else if (/个人原创/.test(authorText)) {
                    group = 6;
                }
                console.log('cat:', cat, 'type:', type, 'encode:', encode, 'audio:', audio, 'resolution:', resolution, 'area:', area, 'group:', group);

            }

            if (td.text() === '行为') {
                fixtd = td.parent().children().last();
            }

            if (td.text().trim() === '海报') {
                poster = $('#kposter').children().attr('src');
            }

            if (td.text() === '标签') {
                let text = td.parent().children().last().text();

                // 使用正则表达式进行匹配
                if (/合集/.test(text)) {
                    is_complete = true;
                }
                if (/中字/.test(text)) {
                    is_chinese = true;
                }
                if (/HDR10\+/.test(text)) {
                    is_hdr10p = true;
                }
                if (/HDR10(?!\+)/.test(text)) {
                    is_hdr10 = true;
                }
                if (/DoVi/.test(text)) {
                    is_dovi = true;
                }
                if (/HLG/.test(text)) {
                    is_hlg = true;
                }
                if (/菁彩HDR/.test(text)) {
                    is_hdr_vivid = true;
                }
                if (/国配/.test(text)) {
                    is_c_dub = true;
                }
                if (/原生/.test(text)) {
                    is_bd = true;
                }
                if (/cc/.test(text)) {
                    is_cc = true;
                }
                if (/动画/.test(text)) {
                    is_anime = true;
                }
                if (/活动/.test(text)) {
                    is_contest = true;
                }
                if (/驻站/.test(text)) {
                    is_selfrelease = true;
                }
                if (/官方/.test(text)) {
                    is_internal = true;
                }
            }
            if (td.text().trim() === '附加信息') {
                torrent_extra = $('.extra-text').html();
            }
            if (td.text() === '字幕') {
                var lastChild = td.parent().children().last();
                var img = lastChild.find('div img[title="简体中文"]');
                // 查找 lastChild 内的第一个超链接并获取其文本内容
                var firstLinkText = lastChild.find('a:first').text();
                // 检查文本内容是否包含"chs"或"cht"
                let sub = firstLinkText.includes('chs') || firstLinkText.includes('cht');
                if (img.length > 0 || sub || /字\s*幕(.|\n)*?Chinese/i.test(mediainfo_s) || /字\s*幕(.|\n)*?Mandarin/i.test(mediainfo_s) || /Subtitle:\s*?Chinese/i.test(mediainfo_s)|| /字\s*幕(.|\n)*?简体中文/i.test(mediainfo_s)) {
                    sub_chinese = true;
                } else {
                    sub_chinese = false;
                }
            }
            if (td.text().trim().startsWith('豆瓣')) {
                havedouban =true
                douban_raw = td.parent().children().last();
            }
            if (td.text().trim().startsWith('IMDb')) {
                haveimdb =true
            }
        }


        // 豆瓣
        $('td.douban_info .title .name a').each(function (index, element) {
            if ($(element).attr('href').indexOf('douban') >= 0) {
                douban = $(element).attr('title');
            }
            if ($(element).attr('href').indexOf('imdb') >= 0) {
                imdb = $(element).attr('title');
            }
        });
        // 中文音轨识别
        if ((/音\s频:(?:(?!字\s幕).|\n)*?(?:chinese|mandarin)/i.test(mediainfo_s) && type !== 1) || (/Audio:\s?(?:Chinese|Mandarin)/i.test(mediainfo_s) && type === 1)) {
            audio_chinese = true;
        }
        var screenshot = '';
        var pngCount = 0,jpgCount =0;
        $('.screenshots-container img').each(function (index, element) {
            var src = $(element).attr('src');
            if (src !== undefined) {
                if (index !== 0) {
                    screenshot += '\n';
                }
                screenshot += src.trim();
            }
            if (src.indexOf('.png') >= 0) {
                pngCount++;
            }
            if (src.indexOf('.jpg') >= 0 || src.indexOf('.jpeg') >= 0) {
                jpgCount++;
            }
        });


        //==============================
        let error = false;
        if (/\s+/.test(title)) {
            $('#assistant-tooltips').append('主标题包含空格<br/>');
            error = true;
        }
        if (/[\uFF00-\uFFEF]/.test(title)) {
            $('#assistant-tooltips').append('请将主标题中的全角符号更换为半角符号。<br/>');
            error = true;
        }
        if (/[\u4e00-\u9fa5\uff01-\uff60]+/.test(title)) {
            $('#assistant-tooltips').append('主标题包含中文或中文字符<br/>');
            error = true;
        }
        if(/(-|@)(CTRLHD)/.test(title_lowercase)){
            $('#assistant-tooltips').append('主标题包含禁发小组,请检查<br/>');
            error = true;
        }
        if(/(-|@)(FGT|NSBC|BATWEB|GPTHD|DreamHD|BlackTV|CatWEB|Xiaomi|Huawei|MOMOWEB|DDHDTV|SeeWeb|TagWeb|SonyHD|MiniHD|BitsTV|ALT|NukeHD|ZeroTV|HotTV|EntTV|GameHD|SmY|SeeHD|VeryPSP|DWR|XLMV|XJCTV|Mp4Ba|GodDramas|FRDS|BeiTai|Ying|VCB-Studio|toothless|YTS\.MX|BMDru)/i.test(title_lowercase)){
            $('#assistant-tooltips').append('主标题包含禁发小组,请检查<br/>');
            error = true;
        }
        if(/-(.*?@)?(Eleph|HDH|HDS(?!TV)|HDHome|HDSky|HDSWEB|Dream(?!Ru)|DYZ-Movie)/i.test(title_lowercase)){
            $('#assistant-tooltips').append('主标题包含不受信小组,请检查<br/>');
            error = true;
        }
        if (/(Dream(?!Ru)|Ubits)$/i.test(title_lowercase) && [6, 8, 9, 10].includes(type)) {
            $('#assistant-tooltips').append('主标题包含不受信小组,请检查<br/>');
            error = true;
        }
        if (!subtitle) {
            $('#assistant-tooltips').append('副标题为空<br/>');
            error = true;
        }
        if (/[【】]/.test(subtitle)) {
            $('#assistant-tooltips').append('副标题包含【】,请修改为 []<br/>');
            error = true;
        }
        if (!cat) {
            $('#assistant-tooltips').append('未选择分类<br/>');
            error = true;
        }
        if (!type) {
            $('#assistant-tooltips').append('未选择格式<br/>');
            error = true;
        } else {
            if (title_type && title_type !== type) {
                $('#assistant-tooltips').append("标题检测格式为" + type_constant[title_type] + ",选择格式为" + type_constant[type] + '<br/>');
                error = true;
            }
        }
        if (!encode) {
            $('#assistant-tooltips').append('未选择主视频编码<br/>');
            error = true;
        } else {
            if (title_encode && title_encode !== encode) {
                $('#assistant-tooltips').append("标题检测视频编码为" + encode_constant[title_encode] + ",选择视频编码为" + encode_constant[encode] + '<br/>');
                error = true;
            } else if (encode === 99 && group !== 8) {
                $('#assistant-tooltips').append('视频编码选择为 other,请人工检查<br/>');
                error = true;
            }
        }
        if (!audio) {
            $('#assistant-tooltips').append('未选择主音频编码<br/>');
            error = true;
        } else {
            if (title_audio && title_audio !== audio) {
                $('#assistant-tooltips').append("标题检测音频编码为" + audio_constant[title_audio] + ",选择音频编码为" + audio_constant[audio] + '<br/>');
                error = true;
            } else if (audio === 99) {
                $('#assistant-tooltips').append('音频编码选择为 other,请人工检查<br/>');
                error = true;
            }
        }
        if (!resolution && title_group !== 8) {
            $('#assistant-tooltips').append('未选择分辨率<br/>');
            error = true;
        } else {
            if (title_resolution && title_resolution !== resolution) {
                $('#assistant-tooltips').append("标题检测分辨率为" + resolution_constant[title_resolution] + ",选择分辨率为" + resolution_constant[resolution] + '<br/>');
                error = true;
            }
        }
        if (/tu\.totheglory\.im/.test(poster)) {
            $('#assistant-tooltips').append('海报使用防盗链图床,请更换或留空<br/>');
            error = true;
        }
        if (/論壇|论坛|公众号|微信/i.test(mediainfo_title)){
            $('#assistant-tooltips').append('请检查「MediaInfo」内信息是否含有广告,请确认资源来源是否可信<br/>');
            error = true;
        }
        if (!area && title_group !== 8) {
            $('#assistant-tooltips').append('未选择地区<br/>');
            error = true;
        }
        if (type === 1 && $('.mediainfo-short .codetop').text() === 'MediaInfo') {
            $('#assistant-tooltips').append('Blu-ray 媒体信息请使用 BDInfo<br/>');
            error = true;
        }
        if (!douban && !imdb && title_group !== 8) {
            $('#assistant-tooltips').append('未检测到豆瓣或 IMDb 链接<br/>');
            error = true;
        }
        if (!douban && imdb) {
            $('#assistant-tooltips').append('未优先使用豆瓣链接<br/>');
            error = true;
        }
        if ($('#peercount > b:first').text() === '0个做种者') {
            $('#assistant-tooltips').append('请先做种,再等待审核<br/>');
            error = true;
        }
        if ((type === 6 || type === 4 || type === 7 || type === 8 || type === 9 || type === 10) && $('.mediainfo-short .codemain').text().replace(/\s+/g, '') === $('.mediainfo-raw .codemain').text().replace(/\s+/g, '')) {
            $('#assistant-tooltips').append('媒体信息未解析<br/>');
            error = true;
        }
        // 标签
        console.log(title_is_complete)
        if (type !== 1 && is_bd){
            $('#assistant-tooltips').append('非原盘请勿选择「原生」标签<br/>');
            error = true;
        }
        if ((title_is_complete || /[集期]全|全\s*?[\d一二三四五六七八九十百千]*\s*?[集期]|合集/i.test(subtitle)) && !is_complete) {
            $('#assistant-tooltips').append('未选择「合集」标签<br/>');
            error = true;
        }
        if (sub_chinese && !is_chinese) {
            $('#assistant-tooltips').append('未选择「中字」标签<br/>');
            error = true;
        }
        if (/^(?!Encoding).*Dolby Vision/im.test(mediainfo_title) && !is_dovi) {
            $('#assistant-tooltips').append('未选择「DoVi」标签<br/>');
            error = true;
        }
        if (!/^(?!Encoding).*Dolby Vision/im.test(mediainfo_title) && is_dovi) {
            $('#assistant-tooltips').append('选择「DoVi」标签,未识别到「DoVi」<br/>');
            error = true;
        }
        if (/^(?!Encoding).*HDR10\+/im.test(mediainfo_title) && !is_hdr10p) {
            $('#assistant-tooltips').append('未选择「HDR10+」标签<br/>');
            error = true;
        }
        if (!/^(?!Encoding).*HDR10\+/im.test(mediainfo_title) && is_hdr10p) {
            $('#assistant-tooltips').append('选择「HDR10+」标签,未识别到「HDR10+」<br/>');
            error = true;
        }
        if (/^(?!Encoding).*HDR10/im.test(mediainfo_title) && !/^(?!Encode).*HDR10\+/im.test(mediainfo_title) && !is_hdr10) {
            $('#assistant-tooltips').append('未选择「HDR10」标签<br/>');
            error = true;
        }
        if (!/^(?!Encoding).*HDR10/im.test(mediainfo_title) && is_hdr10) {
            $('#assistant-tooltips').append('选择「HDR10」标签,未识别到「HDR10」<br/>');
            error = true;
        }
        if (is_hdr10 && is_hdr10p) {
            $('#assistant-tooltips').append('请勿同时选择「HDR10」与「HDR10+」标签<br/>');
            error = true;
        }
        if (/^(?!Encoding).*HLG/im.test(mediainfo_title) && !is_hlg) {
            $('#assistant-tooltips').append('未选择「HLG」标签<br/>');
            error = true;
        }
        if (!/^(?!Encoding).*HLG/im.test(mediainfo_title) && is_hlg) {
            $('#assistant-tooltips').append('选择「HLG」标签,未识别到「HLG」<br/>');
            error = true;
        }
        if (/^(?!Encoding).*HDR Vivid/im.test(mediainfo_title) && !is_hdr_vivid) {
            $('#assistant-tooltips').append('未选择「菁彩 HDR」标签<br/>');
            error = true;
        }
        if (!/^(?!Encoding).*HDR Vivid/im.test(mediainfo_title) && is_hdr_vivid) {
            $('#assistant-tooltips').append('选择「菁彩 HDR」标签,未识别到「菁彩 HDR」<br/>');
            error = true;
        }
        if (is_contest && !is_chinese) {
            $('#assistant-tooltips').append('选择「活动」标签,未识别到「中字」<br/>');
            error = true;
        }
        if (is_contest && type !== 7 ) {
            $('#assistant-tooltips').append('选择「活动」标签,未识别到「WEB-DL」<br/>');
            error = true;
        }
        if ((/◎/i.test(torrent_extra)) && !$('span[title="制作组"]').length > 0) {
            $('#assistant-tooltips').append('请移除附加信息中除致谢、制作信息以外的内容。<br/>');
            error = true;
        }
        if (mediainfo_s.length < 50) {
            error = true;
            if (type === 1 || type === 3) {
                $('#assistant-tooltips').append('媒体信息格式错误,请使用「BDInfo」重新获取完整的英文信息<br/>');
            } else {
                $('#assistant-tooltips').append('媒体信息格式错误,请使用「Mediainfo」重新获取完整的英文信息<br/>');
            }
        }

        if (title_group && !group) {
            $('#assistant-tooltips').append('未选择制作组' + group_constant[title_group] + '<br/>');
            error = true;
        }

        let isWhiteList = ((area === 1 && /-(.*?@)?(PterWEB|CatEDU|CMCTV|HHWEB|OurBits)/i.test(title_lowercase)) || ((type === 5 ||type === 7) && resolution === 1 && (is_hdr10 || is_hdr10p || is_hdr_vivid || is_dovi)))

        if (pngCount < 3 && !isWhiteList) {
            $('#assistant-tooltips').append('PNG 格式的图片未满 3 张<br/>');
            error = true;
        }else if((pngCount + jpgCount) < 3) {
            $('#assistant-tooltips').append('图片未满 3 张<br/>');
            error = true;
        }

        const pichost_list = [
            'cmct.xyz',
            "static.ssdforum.org",
            'static.hdcmct.org',
            'gifyu.com',
            'imgbox.com',
            'pixhost.to',
            'ptpimg.me',
            'ssdforum.org'
        ];

        const shot = document.querySelector('section.screenshots-container');
        let shot_imgs;
        if (shot) {
            shot_imgs = Array.from(shot.querySelectorAll('img')).map(el => el.src);
        } else {
            $('#assistant-tooltips').append('无图片信息<br/>');
        }

        $(document).ready(function () {
            let wrongPicList = [];
            if (shot_imgs && shot_imgs.length) {
                shot_imgs.forEach(imgSrc => {
                    // 检查是否是 pixhost.to 的链接
                    if (imgSrc.includes('pixhost.to')) {
                        // 检查是否符合正确的格式 (img*.pixhost.to/images/...)
                        if (!imgSrc.match(/^https?:\/\/img\d+\.pixhost\.to\/images\//)) {
                            wrongPicList.push(imgSrc);
                            $('#assistant-tooltips').append('Pixhost 图床链接格式错误,请使用正确的图片直链<br/>');
                        }
                    } else {
                        // 对其他图床的检查
                        let valid = pichost_list.some(site => imgSrc.includes(site));
                        if (!valid) {
                            wrongPicList.push(imgSrc);
                        }
                    }
                });

                if (wrongPicList.length) {
                    $('#assistant-tooltips').append('请使用规则白名单内的图床<br/>');
                    error = true;
                }
            }
        });


        // =================================
        // 种审用(检测较为激进,需配合人工判断)
        // =================================
        if (isEditor) {

            $('#editor-tooltips').append('↓以下检测较为激进,需配合人工判断↓<br/>');

            const rating = parseFloat(document.querySelector('.douban_info .number')?.textContent);
            if (rating !== undefined && rating < 4 && area == 1 ) {
                $('#editor-tooltips').append('中性:国产豆瓣低分(需人工刷新豆瓣信息,并排除一个月内未出分新片)<br/>');
            }
            if(cat == 508){
                $('#editor-tooltips').append('除官组驻站外,禁止发布音乐类,但可发布演唱会,且演唱会分类为 MV<br/>');
            }
            if(/-(.*?@)?(Nest|n!ck|lancertony|vandoge)/i.test(title_lowercase)){
                $('#editor-tooltips').append('Dupe 参考:优质字幕小组<br/>');
            }
            if(/-Breeze@Sunny/i.test(title_lowercase)){
                $('#editor-tooltips').append('Dupe 参考:优质字幕小组<br/>');
            }
            if(/-(.*?@)?(FraMeSToR)/i.test(title_lowercase)){
                $('#editor-tooltips').append('Dupe 参考:优质 Remux 小组,必需保留附加信息否则不允许发布<br/>');
            }
            if (!douban  && title_group !== 8 && area == 99) {
                $('#editor-tooltips').append('地区为 Other 且无豆瓣链接,请人工核对<br/>');
            }
            if (/第\s*?[\d一二三四五六七八九十百千]*(?:-\d+)?\s*?[集期]/i.test(subtitle) && !is_complete && (cat === 502 || cat === 503 || cat === 505) && (type === 5 || type ===7)) {
                $('#editor-tooltips').append('中性:识别到单集,无需审核<br/>');
            }
            if (!is_chinese && cat !== 501 && type === 7) {
                $('#editor-tooltips').append('中性:除电影外,无「中字」的 WEB 资源<br/>');
            }
            if (!is_chinese && type === 4) {
                $('#editor-tooltips').append('中性:无「中字」的 Remux 资源<br/>');
            }
            if (!is_chinese && cat !== 501 && is_anime && [6, 7, 8, 9, 10].includes(type)) {
                $('#editor-tooltips').append('中性:除电影外,无「中字」的 动漫 资源<br/>');
            }
            if (!title_lowercase.match(/\.(18[8-9][0-9]|19[0-9]{2}|200[0-9]|201[0-9]|202[0-9]|2030)\./)){
                $('#editor-tooltips').append('标题未检测到年份,请检查<br/>');
            }
            if (!title_audio){
                $('#editor-tooltips').append('标题未检测到音频编码,请检查<br/>');
            }
            if (!title_resolution){
                $('#editor-tooltips').append('标题未检测到分辨率,请检查<br/>');
            }
            if (!title_encode){
                $('#editor-tooltips').append('标题未检测到视频编码,请检查<br/>');
            }
            if (!is_chinese && cat === 502 && type === 1) {
                $('#editor-tooltips').append('中性:无「中字」的 Blu-Ray 剧集<br/>');
            }
            if (type === 6 && (resolution === 5 || resolution === 99)){
                $('#editor-tooltips').append('不允许的资源:低于 720P 的 BDRip<br/>');
            }
            if (/时 长:\s(10|[1-9])min/.test(mediainfo_s)){
                $('#editor-tooltips').append('中性:疑似短剧,时长低于 10 分钟<br/>')
            }
            if (/(https?:\/\/)([\w\-]+(\.[\w\-]+)+)(:\d+)?(\/[^\s]*)?/i.test(mediainfo_title)){
                $('#editor-tooltips').append('检测到「Mediainfo」含有网址,请检查<br/>');
            }
            if (/^\s*(概览|概要)/i.test(mediainfo_title)) {
                $('#editor-tooltips').append('检测到「中文Mediainfo」,请重新扫描<br/>');
            }
            if (/\.(hdr|hdr10)\./i.test(title_lowercase) && !/ST\s2086|ST\s2094|HDR\sVivid/i.test(mediainfo_title) && !/Transfer\scharacteristics\s*:\s(HLG|PQ)/i.test(mediainfo_title) && $('.mediainfo-short .codetop').text() === 'MediaInfo') {
                $('#editor-tooltips').append('主标题检测到HDR,未识别到「HDR」相关元数据,请重新扫描 Mediainfo<br/>');
            }
            if (/\.(Criterion|CC)\./i.test(title_lowercase) || /CC标准收藏版|CC收藏版|CC版|CC(?!TV)/i.test(subtitle) && !is_cc) {
                $('#editor-tooltips').append('主副标题识别到「CC」相关字符,请检查是否有「CC」标签<br/>');
            }
            if (/\.(2in1)\./i.test(title_lowercase)) {
                $('#editor-tooltips').append('主标题识别到「2in1」相关字符,请检查「BDinfo」是否齐全<br/>');
            }
            if (/版原盘/i.test(subtitle) && !is_bd) {
                $('#editor-tooltips').append('副标题识别到「原盘」相关字符,请检查是否有「原生」标签<br/>');
            }
            if (!audio_chinese && is_c_dub) {
                $('#editor-tooltips').append('未包含有普通话配音的影片,禁止使用「国配」标签<br/>');
            }
            if (type != 1 && !/^(?!Encoding).*Dolby Vision/im.test(mediainfo_title) && /\.(DV)\./i.test(title_lowercase)) {
                $('#editor-tooltips').append('标题含有 DV,未在 Mediainfo 内检测到杜比视界<br/>');
            }
            if (/SUBtitleS:/.test(mediainfo_title)) {
                $('#editor-tooltips').append('识别到「SUBtitleS:」相关字符,请检查BDInfo<br/>');
            }
            if ((mediainfo_title.match(/(?<!\S)[ ]{2,}(?!\S)/g) || []).length < 30 && type != 1) {
                $('#editor-tooltips').append('识别到「mediainfo」空格字符过少,请检查排版是否正确<br/>');
            }
            if (/HDR\sformat.*dvhe\.05/i.test(mediainfo_title)) {
                $('#editor-tooltips').append('DUPE参考:Dolby Vision P5(不含 HDR10 数据)<br/>');
            }
            if (/HDR\sformat.*dvhe\.08/i.test(mediainfo_title) || /HDR\sformat.*dvhe\.07/i.test(mediainfo_title)) {
                $('#editor-tooltips').append('DUPE参考:Dolby Vision P7 or P8(含 HDR10 数据)<br/>');
            }
            if ( /HDR\sformat.*dvhe\.07/i.test(mediainfo_title)&& (type == 6||type == 8)){
                $('#editor-tooltips').append('禁发:DV P7 压制兼容性过低<br/>');
            }
            if (type === 1 && /\.HK\./i.test(title_lowercase)){
                $('#editor-tooltips').append('检测到区号为「HK」,港版原盘应使用「HKG」<br/>');
            }
            if (type === 1 && !is_bd && /\.CHN\./i.test(title_lowercase) && /DIY/i.test(subtitle)){
                $('#editor-tooltips').append('不接受发行地为中国大陆的蓝光原盘的 DIY<br/>');
            }
            if (!sub_chinese && is_chinese) {
                $('#editor-tooltips').append('选择「中字」标签,未识别到中文字幕,请检查<br/>');
            }
            //            if (/(FLUX|HHWEB|HHCLUB|DIY|海外).*字幕|(字幕|后缀|取自).*(FLUX|HHWEB|HHCLUB|海外)/i.test(torrent_extra) && type === 7) {
            //                $('#editor-tooltips').append('添加字幕后修改原视频后缀的「WEB-DL」资源,此类资源应保留原组名后缀<br/>');
            //            }
            if (/Progressive/i.test(mediainfo_title) && resolution === 3) {
                $('#editor-tooltips').append('扫描方式为 Progressive,分辨率为 1080i<br/>');
            }
            if (/Video:.*1080i/i.test(mediainfo_title) && resolution === 2) {
                $('#editor-tooltips').append('分辨率为 1080i,标题为 1080p<br/>');
            }
            if(/Size: 0/i.test(mediainfo_s) && type === 1){
                $('#editor-tooltips').append('BDINFO:Size: 0,请人工检查<br/>');
            }
            if ((/\.DVDRip/i.test(title_lowercase) || type === 10) && resolution !== 5){
                $('#editor-tooltips').append('DVDRip 非 SD 分辨率,请检查是否为超分辨率<br/>');
            }
            if (/\.ma\./i.test(title_lowercase) && type === 7){
                $('#editor-tooltips').append('单独槽位:Movies Anywhere<br/>');
            }
            if (/\.nf\./i.test(title_lowercase) && type === 7 && resolution === 1){
                $('#editor-tooltips').append('单独槽位:Netflix 2160P<br/>');
            }
            if (/\.(Peacock|max|dsnp|nf|iTunes|atvp|amzn)\./i.test(title_lowercase) && type === 7 && resolution === 1 && !(is_hdr10p || is_hdr10 || is_dovi)){
                $('#editor-tooltips').append('标题检测:2160P SDR优质源<br/>');
            }
            if (/\.(max|dsnp|nf|Peacock|iTunes|atvp|Paramount|Paramount+|Hulu|Stan)\./i.test(title_lowercase) && type === 7 && resolution === 1 && (is_hdr10p || is_hdr10)){
                $('#editor-tooltips').append('标题检测:2160P HDR优质源<br/>');
            }
            if (/\.(amzn|max|dsnp|nf|iTunes|atvp|Paramount|Paramount+)\./i.test(title_lowercase) && type === 7 && resolution === 1 && is_dovi){
                $('#editor-tooltips').append('标题检测:2160P DV优质源<br/>');
            }
            if (/\.(dsnp|amzn|ma|cr|max|nf)\./i.test(title_lowercase) && type === 7 && resolution === 2 ){
                $('#editor-tooltips').append('标题检测:1080P 优质源<br/>');
            }
            if ((/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig.test(torrent_extra))) {
                $('#editor-tooltips').append('请移除附加信息中的网址。<br/>');
            }
            if(is_contest){
                const getRating = (platform) => {
                    const selector = {
                        douban: 'img[src*="douban.png"]',
                        imdb: 'img[src*="imdb.png"]'
                    }[platform];
                    const td = document.querySelector(`td.douban_info ${selector}`);
                    if (!td) return '未找到';
                    const rating = td.closest('header')
                    .querySelector('.rating > .number:not(.votes)')
                    ?.textContent?.trim();
                    return rating || '未找到';
                };
                $('#editor-tooltips').append(`检测到活动标签,请检查评分。<br/>豆瓣:${getRating('douban')} IMDB:${getRating('imdb')}<br/>`);
            }
            //允许发布的版本
            if (type === 6||type === 8||type === 9||type === 10) {
                if (resolution===1 && encode !==1){
                    $('#editor-tooltips').append('分辨率为2160P,只接受x265编码版本<br/>');
                }
                if (resolution === 2 && (is_dovi||is_hdr10||is_hdr10p||is_hlg||is_hdr_vivid) && encode !==1){
                    $('#editor-tooltips').append('分辨率为1080P 且带HDR,只接受x265编码版本<br/>');
                }
                if (!is_anime && resolution === 2 && !(is_dovi||is_hdr10||is_hdr10p||is_hlg||is_hdr_vivid) && encode !==2){
                    $('#editor-tooltips').append('分辨率为1080P且为SDR,只接受X264编码版本<br/>');
                }
                if (!is_anime && ((/x264/i.test(title_lowercase) && /10bit/i.test(title_lowercase)) || (/Bit\s+depth\s*:\s*10\s+bits/i.test(mediainfo_title) && /Writing\s+library\s*:\s*x264/i.test(mediainfo_title)))) {
                    $('#editor-tooltips').append('禁止发布:x264 10bit 硬件兼容性较差<br/>');
                }
            }
            if (is_anime === true && cat === 502 && is_bd){
                $('#editor-tooltips').append('禁止发布:分集形式 TV / OVA 番剧的原盘(不论单集还是合集),仅允许剧场版/电影的原盘<br/>');
            }
            if (
                (/^(?:Format).*?(DTS-HD|TrueHD|DTS:X|LPCM|Format\s+:\s+PCM\s+Format settings\s+:\s+Little\s+\/\s+Signed)/im.test(
                    mediainfo_title
                ) ||
                 audio === 1 ||
                 audio === 2 ||
                 audio === 6) &&
                (resolution === 2 ||
                 resolution === 3 ||
                 resolution === 4 ||
                 resolution === 5) &&
                (type === 6 || type === 8 || type === 9 || type === 10)
            ) {
                $("#editor-tooltips").append("可替代:音频臃肿<br/>");
            }
            if (!sub_chinese && !is_bd) {
                $('#editor-tooltips').append('请检查截图:无中字或硬字幕<br/>');
            }
            if (/(BHDStudio)$/i.test(title_lowercase) && [1].includes(type)) {
                $('#editor-tooltips').append('可替代:质量较差的视频<br/>');
            }

            if(type != 1 && type != 3 && type != 99){
                const match = mediainfo_s.match(/文件名: (.*)/);
                if(match && match[1]) {
                    document.querySelector('h1').insertAdjacentHTML('beforeend', `<br><span style="color: darkgray; font-size: 1rem;">${match[1]}</span>`);
                } else {
                    $('#editor-tooltips').append('Mediainfo 未找到文件名信息<br/>');
                }
            }else if(type == 1){
                // 先尝试匹配 Disc Title:,如果为空则匹配 Disc Label:
                const matchTitle = mediainfo_title.match(/Disc Title:\s*(.*)/);
                const matchLabel = !matchTitle ? mediainfo_title.match(/Disc Label:\s*(.*)/) : null;
                // 获取最终结果(优先取 Title,没有则取 Label)
                const discInfo = matchTitle ? matchTitle[1] : (matchLabel ? matchLabel[1] : null);

                if(discInfo) {
                    document.querySelector('h1').insertAdjacentHTML('beforeend', `<br><span style="color: darkgray; font-size: 1rem;">${discInfo}</span>`);
                } else {
                    $('#editor-tooltips').append('BDInfo 未找到Disc Title或Disc Label信息<br/>');
                }
            }

        }

        //豆瓣判断
        // 函数:获取对应豆瓣内容
        function findDouban(searchText) {
            var result = null; // 存储找到的结果

            // 遍历所有的.peer元素
            douban_raw.find('.peer').each(function () {
                // 获取当前.peer元素中的.text-title和.text-content
                var textTitle = $(this).find('.text-title').text().trim();
                var textContent = $(this).find('.text-content').text().trim(); // 使用.html()以保留内部HTML结构,如链接

                // 检查.text-title是否包含搜索的文本
                if (textTitle.includes(searchText)) {
                    result = textContent;
                    return false; // 找到匹配后退出循环
                }
            });

            return result; // 返回结果,如果没有找到匹配项,则为null
        }


        // 豆瓣判断
        var douban_area = [], douban_cat;
        var isshow, isdoc, isani;

        if (douban) {

            var douban_genres = findDouban('◎类  别')
            if (douban_genres.includes('真人秀')) {
                isshow = 1;
            }
            if (douban_genres.includes('纪录片')) {
                isdoc = 1;
            }
            if (douban_genres.includes('动画')) {
                isani = true;
            }
            var douban_type = findDouban('◎类  型').split(" / ")[0];
            var country = findDouban('◎产  地').split(/\s*\/\s*|\s+/);
            var language = findDouban('◎语  言');
            const areaMappings = [
                { areas: ['中国', '中国大陆'], value: 1 },
                { areas: ['香港', '中国香港'], value: 2 },
                { areas: ['台湾', '中国台湾'], value: 3 },
                { areas: ['印度'], value: 7 },
                { areas: ['日本'], value: 5 },
                { areas: ['韩国'], value: 6 },
                { areas: ['泰国'], value: 9 },
                { areas: ['阿尔巴尼亚', '爱尔兰', '爱沙尼亚', '安道尔', '奥地利', '白俄罗斯', '保加利亚',
                          '北马其顿', '比利时', '冰岛', '波黑', '波兰', '丹麦', '德国', '法国',
                          '梵蒂冈', '芬兰', '荷兰', '黑山', '捷克', '克罗地亚', '拉脱维亚', '立陶宛',
                          '列支敦士登', '卢森堡', '罗马尼亚', '马耳他', '摩尔多瓦', '摩纳哥', '挪威',
                          '葡萄牙', '瑞典', '瑞士', '塞尔维亚', '塞浦路斯', '圣马力诺', '斯洛伐克',
                          '斯洛文尼亚', '乌克兰', '西班牙', '希腊', '匈牙利', '意大利', '英国',
                          '安提瓜和巴布达', '巴巴多斯', '巴哈马', '巴拿马', '伯利兹', '多米尼加', '多米尼克',
                          '格林纳达', '哥斯达黎加', '古巴', '海地', '洪都拉斯', '加拿大', '美国', '墨西哥',
                          '尼加拉瓜', '萨尔瓦多', '圣基茨和尼维斯', '圣卢西亚', '圣文森特和格林纳丁斯',
                          '特立尼达和多巴哥', '危地马拉', '牙买加', '阿根廷', '巴拉圭', '巴西', '秘鲁',
                          '玻利维亚', '厄瓜多尔', '哥伦比亚', '圭亚那', '苏里南', '委内瑞拉', '乌拉圭',
                          '智利', '捷克斯洛伐克','澳大利亚','西德','新西兰'], value: 4 },
                { areas: ['苏联', '俄罗斯'], value: 8 }
            ];
            // 遍历映射表并检查 country 是否包含任何指定地区
            areaMappings.forEach(mapping => {
                if (mapping.areas.some(element => country.includes(element))) {
                    douban_area.push(mapping.value);
                }
            });

            // 如果 douban_area 为空,则添加 99
            if (douban_area.length === 0) {
                douban_area.push(99);
            }

            if (douban_type === '电视剧') {
                if (isshow) {
                    douban_cat = 505;
                } else if (isdoc) {
                    douban_cat = 503;
                } else {
                    douban_cat = 502;
                }
            } else {
                if (isdoc) {
                    douban_cat = 503;
                } else {
                    douban_cat = 501;
                }
            }
            if (language && is_c_dub && language.includes("普通话") && !language.includes("粤语")) {
                $('#editor-tooltips').append('豆瓣信息中原始语言含有普通话的资源,不可使用「国配」标签。<br/>');
                error = true;
            }
            if (language && audio_chinese && !is_c_dub && !language.includes("普通话")) {
                $('#editor-tooltips').append('外语片或粤语片包含有普通话配音,需使用「国配」标签<br/>');
            }
            if(language && audio_chinese && !is_c_dub && language.includes("粤语")){
                $('#editor-tooltips').append('种审人工检查第一语言是否为粤语,原始语言为粤语的影片如包含有普通话配音,需使用「国配」标签<br/>');
            }
            if (cat && douban_cat && douban_cat >= 501 && douban_cat <= 505 && douban_cat !== cat) {
                $('#assistant-tooltips').append("豆瓣检测分类为" + cat_constant[douban_cat] + ",选择分类为" + cat_constant[cat] + '<br/>');
                error = true;
            }
            if (area && douban_area && !douban_area.includes(area)) {
                $('#assistant-tooltips').append("豆瓣检测地区为" + area_constant[douban_area[0]] + ",选择地区为" + area_constant[area] + '<br/>');
                error = true;
            }
            if (isani && !is_anime) {
                $('#assistant-tooltips').append('豆瓣检测「动画」类别,未选择「动画」标签<br/>');
                error = true;
            }
            if(findDouban('◎上映日期') == ''){
                $('#editor-tooltips').append('豆瓣未检测到年份,请检查<br/>');
            }else if(title_lowercase.match(/\.(18[8-9][0-9]|19[0-9]{2}|200[0-9]|201[0-9]|202[0-9]|2030)\./) && findDouban('◎上映日期').match(/^(\d{4})/)[1] != title_lowercase.match(/\.(18[8-9][0-9]|19[0-9]{2}|200[0-9]|201[0-9]|202[0-9]|2030)\./)[1]){
                $('#editor-tooltips').append('豆瓣与标题年份不匹配,请检查<br/>');
            }

            if (!isani && is_anime) {
                $('#assistant-tooltips').append('选择「动画」标签,豆瓣未识别到「动画」类别<br/>');
                error = true;
            }
            //显示结果
            if (error) {
                $('#assistant-tooltips').css('background', 'red');
            } else {
                $('#assistant-tooltips').append('此种子未检测到异常');
                $('#assistant-tooltips').css('background', 'green');
            }
        }

    }

    // ---------------------------------------------------
    // 只有种审需要下面的功能捏
    // ---------------------------------------------------
    if (isEditor) {
        // ===========================================
        // 3. << 鼠标停在加载完成的图片上显示大小和类型 >>
        // 对种子详情的图片信息进行审核
        // ===========================================
        if (window.location.href.includes("/details.php")) {
            // 1. 初始化 editor-tooltips DOM
            $('#editor-tooltips').append(`图片检查中<br>`);
            var imgNum;
            if (!authorText.replace(/\s+/g, '')) {
                imgNum = 1;
            } else {
                imgNum = 2;
            }


            var resolutionRegex = /分辨率:\s*(\d+)\s*x\s*(\d+)/;
            var match = mediainfo_s.match(resolutionRegex);
            var cWidth, cHeight;

            if (match) {
                cWidth = parseInt(match[1], 10);
                cHeight = parseInt(match[2], 10);
            } else if ($('.mediainfo-short .codetop').text() === 'MediaInfo') {
                $('#editor-tooltips').append("未找到 Mediainfo 分辨率信息<br>");
            }
            if (/Original height/i.test(mediainfo_title)){
                $('#editor-tooltips').append('检测到Original height,请人工辅助判断<br>');
            }
            // one time trigger
            var error_img = false;

            // 3. 对截图区域的图片进行悬浮显示信息
            const images = document.querySelectorAll('section[data-group="screenshots"] img[loading="lazy"][alt="screenshot image"], section[data-group="screenshots"] img[loading="lazy"][alt="image"]');
            let completedImages = 0; // 已完成检查的图片数量

            images.forEach((img, index) => {
                const imgExtension = img.src.split('.').pop().split(/\#|\?/)[0].toLowerCase(); // 获取文件扩展名并转换为小写

                // 3.1 对 .gif 特殊处理
                if (imgExtension === 'gif') {
                    console.log(`跳过 GIF 图片:${img.src}`);
                    completedImages++; // 增加已完成检查的图片数量,以便正确处理完成状态
                    if (completedImages === images.length) {
                        // $('#editor-tooltips').html($('#editor-tooltips').html().replace('图片检查中<br>', ''));
                        $('#editor-tooltips').html($('#editor-tooltips').html().replace('图片检查中<br>', ''));
                        console.log("gif 图片检查完成");
                    }
                    return; // 跳过此 GIF 图片
                }

                fetchImageDetails(img, (details) => {
                    displayImageDetails(img, details);
                    if (index >= imgNum - 1) {
                        checkImageResolution(details, $('span[title="分辨率"]').text(), index + 1);
                    }
                    completedImages++;
                    if (completedImages === images.length) {
                        // $('#editor-tooltips').html($('#editor-tooltips').html().replace('图片检查中<br>', ''));
                        $('#editor-tooltips').html($('#editor-tooltips').html().replace('图片检查中<br>', ''));
                        console.log("图片检查完成");
                    }
                });
            });

            function fetchImageDetails(img, callback) {

                if (img.src.includes('ptpimg.me')) {
                    // 对 ptpimg.me 使用 Blob
                    GM_xmlhttpRequest({
                        method: "GET",
                        url: img.src,
                        responseType: 'blob',
                        onload: function (response) {
                            const blob = response.response;
                            const image = new Image();
                            image.onload = function () {
                                const details = {
                                    fileSize: `${(blob.size / 1024).toFixed(2)} KB`,
                                    resolution: `${this.width} x ${this.height}`,
                                    fileType: img.src.split('.').pop().split(/\#|\?/)[0]
                                };
                                callback(details);
                            };
                            image.src = URL.createObjectURL(blob);
                        }
                    });
                } else {
                    // 对其他域名使用 HEAD
                    GM_xmlhttpRequest({
                        method: "HEAD",
                        url: img.src,
                        onload: function (response) {
                            const size = response.responseHeaders.match(/Content-Length:\s?(\d+)/i);
                            const fileSize = size ? `${(size[1] / 1024).toFixed(2)} KB` : "未知大小";
                            const image = new Image();
                            image.onload = function () {
                                // const resolution = `${this.width} x ${this.height}`;
                                // infoBox.textContent = `大小:${fileSize}, 分辨率:${resolution}, 类型:${fileExtension}`;
                                const details = {
                                    fileSize,
                                    resolution: `${this.width} x ${this.height}`,
                                    fileType: img.src.split('.').pop().split(/\#|\?/)[0]
                                };
                                callback(details);
                            };
                            image.src = img.src;
                        }
                    });
                }
            }

            function checkImageResolution(details, expectedResolution, imgNum) {
                const {width, height} = parseResolution(details.resolution);
                let pswitch;
                if (!/Blu-ray/i.test(typeText)) {
                    if (height !== cHeight || width !== cWidth) {
                        if (!error_img) {
                            const isDVDType = type === 10 || type === 3 || (type === 4 && /dvd/i.test(title_lowercase));
                            if (isDVDType) {
                                const message = `DVD请人工确认截图分辨率,Mediainfo 高度为${cHeight} 宽度为${cWidth}<br>` +
                                      `可能的正确截图宽度为 高度大于480时:${Math.floor(cWidth / 45 * 64)} 或 ${Math.floor(cWidth / 15 * 16)} ` +
                                      `高度小等于480时:${Math.floor(cWidth / 9 * 8)} 或 ${Math.floor(cWidth / 27 * 32)}<br>`;
                                $('#editor-tooltips').append(message);
                                error_img = true;
                            } else {
                                const resolutionMessage = `第${imgNum}张图片,Mediainfo 分辨率${cWidth}x${cHeight}:截图分辨率${width}x${height}<br>`;
                                $('#editor-tooltips').append(resolutionMessage);
                                pswitch = true;
                            }
                        }
                    }
                }

                // 判断体积
                let size = parseFloat(details.fileSize.match(/[\d\.]+/)[0]);
                if ((is_dovi || is_hlg || is_hdr_vivid || is_hdr10p || is_hdr10) && size < 1800){
                    $('#editor-tooltips').append(`HDR影片,第${imgNum}张图片,截图体积低于1800KB:体积为${details.fileSize}<br>`);
                }else if (resolution === 1 && size < 1800){
                    $('#editor-tooltips').append(`2160p影片,第${imgNum}张图片,截图体积低于1800KB:体积为${details.fileSize}<br>`);
                }else if ((resolution === 2 || resolution === 3) && size < 1000){
                    $('#editor-tooltips').append(`1080p影片,第${imgNum}张图片,截图体积低于1000KB:体积为${details.fileSize}<br>`);
                }

                // 根据预期分辨率来检查实际图片分辨率
                if (!pswitch && !error_img && type !== 10) {
                    switch (expectedResolution) {
                        case '2160p':
                            if ((height < 2120 || height > 2160) && (width < 3800 || width > 3840)) {
                                $('#editor-tooltips').append(`第${imgNum}张图片,截图分辨率不符合 2160p 标准:实际高度为${height} 宽度${width}<br>`);
                                error_img = true;
                            }
                            break;
                        case '1080p':
                        case '1080i':
                            if ((height < 1040 || height > 1080) && (width < 1880 || width > 1920)) {
                                $('#editor-tooltips').append(`第${imgNum}张图片,截图分辨率不符合 1080p/1080i 标准:实际高度为${height} 宽度${width}<br>`);
                                error_img = true;
                            }
                            break;
                        case '720p':
                            if ((height < 680 || height > 720) && (width !== 1280)) {
                                $('#editor-tooltips').append(`第${imgNum}张图片,截图分辨率不符合 720p 标准:实际高度为${height} 宽度${width}<br>`);
                                error_img = true;
                            }
                            break;
                        default:
                            $('#editor-tooltips').append(`第${imgNum}张图片,未定义对分辨率${expectedResolution}的检查规则<br>`);
                            error_img = true;
                    }
                }
            }


            function displayImageDetails(img, details) {
                const infoBox = document.createElement('div');
                infoBox.style.position = 'absolute';
                infoBox.style.padding = '5px';
                infoBox.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
                infoBox.style.color = 'white';
                infoBox.style.fontSize = '12px';
                infoBox.style.visibility = 'hidden';
                infoBox.style.zIndex = '1000';
                document.body.appendChild(infoBox);

                // 提取主域名
                if (GM_info.script.name === "SpringSunday-Torrent-Assistant 测试版"){
                    const domain = img.src.match(/:\/\/(.[^/]+)/)[1];
                    const mainDomain = domain.split('.').slice(-2).join('.');
                    infoBox.textContent = `大小:${details.fileSize}, 分辨率:${details.resolution}, 类型:${details.fileType}, 图床:${mainDomain}`;
                }else{
                    infoBox.textContent = `大小:${details.fileSize}, 分辨率:${details.resolution}, 类型:${details.fileType}`;
                }

                img.addEventListener('mouseover', () => {
                    updatePosition(img, infoBox);
                    infoBox.style.visibility = 'visible';
                });
                img.addEventListener('mouseout', () => {
                    infoBox.style.visibility = 'hidden';
                });
            }

            function updatePosition(img, infoBox) {
                const rect = img.getBoundingClientRect();
                infoBox.style.top = `${window.scrollY + rect.top - infoBox.offsetHeight - 5}px`;
                infoBox.style.left = `${window.scrollX + rect.left + (rect.width - infoBox.offsetWidth) / 2}px`;
            }

            function parseResolution(resolution) {
                const [width, height] = resolution.split(' x ').map(Number);
                return {width, height};
            }
        }
        // ===========================================
        // 调用函数,移动包含特定文本“相关资源”的tr到表格顶端
        // ===========================================
        function updateRowAndToggleImage(searchText) {
            // 获取页面中所有的tr元素
            const trElements = document.querySelectorAll('tr');

            // 遍历所有tr元素
            trElements.forEach(tr => {
                // 在当前tr中查找所有td元素
                const tdElements = tr.querySelectorAll('td.rowhead.nowrap');


                // 遍历这些td元素
                tdElements.forEach(td => {
                    // 检查td元素的文本内容是否为searchText(传入的参数)
                    if (td.textContent.trim() === searchText) {

                        // 获取这个tr的父表格
                        const table = tr.closest('table');
                        if (table) {
                            // 将这个tr移动到表格的最顶端
                            table.insertBefore(tr, table.firstChild);
                        }

                    }

                });
            });
        }

        if (window.location.href.includes("/details.php?")) {
            updateRowAndToggleImage("相关资源");
        }
    }


    // ===========================================
    // 2. << 添加隐藏已审按钮和 torrents.php 页面下的功能 >>
    // ===========================================
    // 添加隐藏已审按钮和 torrents.php 页面下的功能
    function enhanceTorrentsPage() {

        let buttonTop = 10; // 初始按钮位置
        const buttonSpacing = 30; // 按钮间隔

        // 按钮配置
        const buttons = [
            {text: '隐藏已审', action: hideReviewed},
            {text: '隐藏老种', action: hideOld},
            {text: '显示所有', action: () => jQuery('table.torrents tr').show()},
            {text: '隐藏匹配项', action: () => toggleVisibility(true)},
            {text: '隐藏非匹配项', action: () => toggleVisibility(false)},
            {text: '选中复选框', action: () => jQuery('table.torrents input[type="checkbox"]:visible').prop('checked', true)},
            {text: window.location.search.includes('neutral=1') ? '隐藏中性' : '显示中性', action: () => toggleParam('neutral')},
            {text: window.location.search.includes('trumpable=1') ? '隐藏可替代' : '显示可替代', action: () => toggleParam('trumpable')}
        ];

        // 创建按钮和输入框
        buttons.forEach(btn => createButton(btn.text, btn.action));
        const mainInput = createInput('匹配标题', 'savedMainRegex');
        const subtitleInput = createInput('匹配副标题', 'savedSubtitleRegex');

        function changeFrozenRowsStyle() {
            // 更改包含冻结图标的行的样式
            jQuery('span.bi.bi-info.torrent-icon[title="冻结"]').each(function () {
                const row = jQuery(this).closest('tr');
                row.find('div.torrent-title a').css('color', 'blue');
            });

            // 查找所有 <a href="?cat=502"> 或 <a href="?cat=503"> 或 <a href="?cat=505"> 链接
            jQuery('a[href="?cat=502"], a[href="?cat=503"], a[href="?cat=505"]').each(function() {
                const parentTd = jQuery(this).closest('td'); // 获取父级 td
                const nextTd = parentTd.next('td'); // 获取下一个 td
                // 检查下一个 td 的 table 内的 tbody 是否包含特定链接
                const hasPackLink = nextTd.find('table tbody a[href="/torrents.php?pack=1"], a[href="/torrents.php?untouched=1"]').length > 0;

                // 检查下一个 td 的 table 内的 tbody 中的 <div class="torrent-smalldescr"> 内的文本
                const descrText = nextTd.find('table tbody div.torrent-smalldescr').text();
                const regex = /第\s*?[\d一二三四五六七八九十百千]*(?:-\d+)?\s*?[集期]/;
                const matches = regex.test(descrText);

                if (!hasPackLink && matches) {
                    // 如果没有找到特定链接,并且文本匹配正则表达式,则设置颜色为深黄色
                    const row = jQuery(this).closest('tr');
                    const titleLink = row.find('div.torrent-title a');
                    // 仅当颜色不是蓝色时,才改为深黄色
                    if (titleLink.css('color') !== 'blue') {
                        titleLink.css('color', 'darkgoldenrod'); // 或使用 '#B8860B'
                    }
                }
            });

            // 查找具有特定内容的 <td> 元素,并根据颜色条件修改父 <tr> 中的链接颜色
            jQuery('td.rowfollow').each(function() {
                if (jQuery(this).find('span.red').text().trim() === '0') {
                    const row = jQuery(this).closest('tr');
                    const titleLink = row.find('div.torrent-title a');
                    const currentColor = titleLink.css('color');
                    if (currentColor !== 'blue' && currentColor !== 'darkgoldenrod') {
                        titleLink.css('color', 'darkred');
                    }
                }
            });
        }

        // 在页面加载后立即调用
        changeFrozenRowsStyle();
        function hideReviewed() {
            jQuery('span.bi.bi-check2.torrent-icon, span.bi.bi-heart-fill.torrent-icon, span.bi.bi-fire.torrent-icon, span.bi.bi-award-fill.torrent-icon').closest('table').closest('tr').hide();
            changeFrozenRowsStyle();
        }

        function hideOld() {
            jQuery('td.rowfollow.nowrap').each(function() {
                if (jQuery(this).text().includes('月')) {
                    jQuery(this).closest('tr').hide();
                }
            });
            changeFrozenRowsStyle();
        }
        function toggleParam(param) {
            const url = new URL(window.location);
            const currentValue = url.searchParams.get(param) === '1' ? '2' : '1';
            url.searchParams.set(param, currentValue);
            window.location.href = url.toString();
        }

        function toggleVisibility(match) {
            const mainRegex = new RegExp(mainInput.value, 'i');
            const subtitleRegex = new RegExp(subtitleInput.value, 'i');
            const rows = jQuery('table.torrents tr:visible');
            rows.each(function (index) {
                if (index === 0) return;
                if (index === rows.length - 1) return;

                const title = jQuery(this).find('div.torrent-title a[title]').attr('title');
                const subtitle = jQuery(this).find('div.torrent-smalldescr span:last').text();
                const regexToUse = mainInput.value ? mainRegex : subtitleRegex;
                const textToMatch = mainInput.value ? title : subtitle;
                const shouldHide = match ? regexToUse.test(textToMatch) : !regexToUse.test(textToMatch);
                jQuery(this).toggle(!shouldHide);
            });
        }



        function createButton(text, onClickFunction) {
            const button = document.createElement('button');
            button.textContent = text;
            button.style.cssText = `position:fixed;top:${buttonTop}px;right:10px;z-index:1000;`;
            document.body.appendChild(button);
            button.onclick = onClickFunction;
            buttonTop += buttonSpacing;
        }

        function createInput(placeholder, localStorageKey) {
            const input = document.createElement('input');
            input.type = 'text';
            input.placeholder = placeholder;
            input.style.cssText = `position:fixed;top:${buttonTop}px;right:10px;z-index:1000;width:120px;`;
            document.body.appendChild(input);
            input.value = localStorage.getItem(localStorageKey) || '';
            input.addEventListener('input', () => {
                localStorage.setItem(localStorageKey, input.value);
            });
            buttonTop += buttonSpacing;
            return input;
        }
    }

    if ((window.location.href.includes("/torrents.php") || window.location.href.includes("offers.php"))&& GM_info.script.name === "SpringSunday-Torrent-Assistant 测试版") {
        enhanceTorrentsPage();
    }

    // ===========================================
    // 4. << 快速添加回复的修改意见 >>
    // 快速添加 对应问题/标准回答 的答复
    // ===========================================
    if (window.location.href.includes("/details.php") && GM_info.script.name === "SpringSunday-Torrent-Assistant 测试版") {
        // 确保页面加载完成后执行
        $('#outer>div.main, #outer>table.main, #outer>div.main~table, #outer>table.main~table').css('width', 'auto');
        $(document).ready(function() {
            // 找到目标元素

            const target = $('td.rowhead.nowrap a[href="javascript: klappe_news(\'related\')"]');

            if (target.length > 0) {
                // 创建按钮
                const button = $('<br><button>显示副标题</button>');

                // 添加按钮到超链接后面
                target.after(button);

                // 按钮点击事件
                button.on('click', function() {
                    // 遍历处理 #krelated 表格中的每一行
                    $('#krelated table tr').each(function() {
                        var html = $(this).html();
                        // 将注释转换为 HTML
                        html = html.replace(/<!--\s*(.*?)\s*-->/g, '$1');
                        $(this).html(html);
                    });
                });
            }
        });
        const comments = [
            "「主标题」请参考资源规则中的主标题规则,并参考豆瓣或者 imdb 的影片名,重新命名主标题",
            "「海报」海报未正确显示,请删除海报栏链接或更换。",
            "「截图」截图规格错误,请参考资源规则,重新截取 png 格式原图",
            "「截图」截图内容必须包含影视正片有效信息,片头片尾不视为有效信息,请补充或更换截图。",
            "「截图」请补充至少一张带中字的截图",
            "「截图」请删除截图栏中的无关图片。",
            "「制作信息」请补充制作信息等相关内容。",
            "「附加信息」WEB-DL 无需在附加信息中附加 NFO,请删除相关信息。",
            "「附加信息」请移除附加信息中除致谢、制作信息(包括音视频及字幕来源、处理方式等)以外的内容。",
            "「附加信息」请正确使用附加信息中的引用框,格式为:[quote]内容[/quote]",
            "「附加信息」无豆瓣或 IMDB 链接时,请在附加信息中补充剧情简介。",
            "「MediaInfo」请使用 MediaInfo 扫描完整的英文版媒体信息 [url=https://springsunday.net/forums.php?action=viewtopic&forumid=16&topicid=14319] 教程 [/url] [url=https://mediaarea.net/MediaInfoOnline] 在线版 [/url]",
            "「截图」截图或图床链接使用错误,请参考截图及图床教程 [url=https://springsunday.net/forums.php?action=viewtopic&forumid=10&topicid=18105#pid389691] 教程 [/url] , 如该方法获取截图分辨率错误,右键视频->图像截取->按调整后的比例保存(取消勾选该选项,其余播放器同理)。",
            "「标签」请参考本帖,添加合适的标签。[url=https://springsunday.net/forums.php?action=viewtopic&forumid=3&topicid=19073] 参考 [/url]",
            "「脚本」现在我们提供一个春天种子检查 [url=https://springsunday.net/forums.php?action=viewtopic&forumid=16&topicid=16773] 脚本 [/url],方便用户自检常见的种子信息不规范问题,提高发种效率。",
        ];

        // 预设的默认设置
        const defaultComments  = [
            "「原生标签」Untouch 原盘指正式出版未经过二次制作的影碟,包括 Blu-ray 和 DVD。",
            "「特效标签」字幕包含有位移、变色、动态等特殊效果。简单的颜色、字体处理不被视为特效。使用特效标签的种子要求至少提供 2 张特效截图,且必须截取剧情相关部分的特效,无分辨率和格式要求,且不计入 3 张截图的基本要求。请补充相应截图或移除标签。",
            "「已取代标签」Trump 资源必须先于候选区发布,主动「举报/反馈」种子并说明 Trump(附带对应链接),附带 Trump 理由可更好的审核。",
            "「合集标签」剧集、纪录、动画等资源的整季打包。详见资源规则的 [url=rules.php#id59] 合集打包规则 [/url]",
            "「中字标签」资源包含有中文字幕。以下情形均可使用中字标签:内封/外挂/上传简繁字幕、内封/外挂/上传双语字幕、中文硬字幕。",
            "「国配标签」外语片或粤语片包含有普通话配音(包括台湾普通话配音),豆瓣信息中原始语言含有普通话的资源不可使用该标签。",
            "「CC 标签」原盘或压制的来源是 CC 标准收藏碟。",
            "「自购标签」自购/自抓请选择,如转载请删除相关内容。",
        ];

        // 初始化 UI
        function initializeUI() {
            const textarea = $('textarea[name="body"]');
            const selectHTML = buildSelectOptions(comments);
            textarea.after(selectHTML);

            setupEventListeners(textarea);
            createLeftTextarea(); // 添加左侧textarea初始化
        }

        function createLeftTextarea() {
            const tbody = $('#compose').closest('tbody');
            if (tbody.length) {
                const table = tbody.closest('table');
                table.css('position', 'relative');

                // 获取quickcommentselect的位置和高度
                const quickSelect = $('#quickcommentselect');
                const quickSelectHeight = quickSelect.height(); // 获取内部高度
                const quickSelectTop = quickSelect.position().top;

                const tbodyPosition = tbody.position();
                const tbodyHeight = tbody.outerHeight();

                // 计算上方框可用的剩余高度
                const totalAvailableHeight = tbodyHeight - 90; // 减去输入框和按钮的高度
                const remainingHeight = totalAvailableHeight - quickSelectHeight;

                // 创建容器div
                const containerDiv = $('<div></div>').css({
                    position: 'absolute',
                    top: tbodyPosition.top + 'px',
                    left: (tbodyPosition.left - 315) + 'px',
                    width: '300px'
                });

                // 创建上方select(用于自定义内容)
                const customSelect = $('<select multiple="multiple"></select>').css({
                    width: '100%',
                    height: remainingHeight + 'px',
                    border: '1px solid #ccc',
                    marginBottom: '10px'
                });

                // 创建下方select(用于默认设置)
                const defaultSelect = $('<select multiple="multiple"></select>').css({
                    width: '100%',
                    height: quickSelectHeight + 'px',
                    border: '1px solid #ccc'
                });

                // 创建自定义输入框
                const customInput = $('<input type="text" placeholder="输入自定义内容后回车,ALT+左键选中">').css({
                    width: '96%',
                    marginTop: '5px',
                    padding: '5px',
                    border: '1px solid #ccc'
                });

                // 按钮容器
                const buttonContainer = $('<div></div>').css({
                    display: 'flex',
                    gap: '5px',
                    marginTop: '5px'
                });

                // 添加按钮
                const addButton = $('<button>添加</button>').css({
                    flex: '1',
                    padding: '5px'
                });

                // 删除选中按钮
                const deleteButton = $('<button>删除选中</button>').css({
                    flex: '1',
                    padding: '5px'
                });

                // 加载评论列表
                function loadComments() {
                    customSelect.empty();
                    defaultSelect.empty();

                    // 添加默认评论到下方select
                    defaultComments.forEach((comment, index) => {
                        defaultSelect.append(
                            $('<option></option>')
                            .text(comment)
                            .val('default_' + index)
                            .css('background-color', '#f0f0f0')
                            .addClass('default-item')
                        );
                    });

                    // 添加自定义评论到上方select
                    const customComments = GM_getValue('customComments', []);
                    customComments.forEach((comment, index) => {
                        customSelect.append(
                            $('<option></option>')
                            .text(comment)
                            .val('custom_' + index)
                            .addClass('custom-item')
                        );
                    });
                }

                // 设置点击事件处理程序
                [customSelect, defaultSelect].forEach(select => {
                    select.on('click', function(e) {
                        const option = $(e.target);
                        if (!option.is('option')) return;

                        if (!e.altKey) {
                            // 普通点击:添加到文本框
                            const textarea = $('textarea[name="body"]');
                            let currentText = textarea.val();
                            const textToAdd = option.text();

                            currentText += (currentText ? '\n' : '') + '● ' + textToAdd;
                            textarea.val(currentText);

                            // 取消选中状态
                            option.prop('selected', false);
                        }
                    });

                    select.on('mousedown', function(e) {
                        if (e.altKey) {
                            e.preventDefault();
                            const option = $(e.target);
                            if (!option.is('option')) return;

                            if (option.hasClass('custom-item')) {
                                option.prop('selected', !option.prop('selected'));
                            }
                        }
                    });
                });

                // 其余事件处理程序保持不变
                function addCustomContent() {
                    const customText = customInput.val().trim();
                    if (customText) {
                        const customComments = GM_getValue('customComments', []);
                        if (!customComments.includes(customText)) {
                            customComments.push(customText);
                            GM_setValue('customComments', customComments);
                            loadComments();
                        }
                        customInput.val('');
                    }
                }

                customInput.keypress(function(e) {
                    if (e.which === 13) {
                        addCustomContent();
                    }
                });

                addButton.click(addCustomContent);

                deleteButton.click(function() {
                    const selectedOptions = customSelect.find('option.custom-item:selected');
                    if (selectedOptions.length > 0) {
                        const customComments = GM_getValue('customComments', []);
                        const textsToDelete = selectedOptions.map(function() {
                            return $(this).text();
                        }).get();

                        const newCustomComments = customComments.filter(comment => !textsToDelete.includes(comment));
                        GM_setValue('customComments', newCustomComments);
                        loadComments();
                    }
                });

                // 初始加载
                loadComments();

                // 组装容器
                buttonContainer.append(addButton, deleteButton);
                containerDiv.append(customSelect, defaultSelect, customInput, buttonContainer);
                table.append(containerDiv);
            }
        }
        // 创建监控选择框
        function createMonitoringSelect() {
            const table = $('#compose').closest('table');
            if (table.length) {
                table.css('position', 'relative');

                const firstTextarea = table.find('textarea').first();
                const quickCommentSelect = $('#quickcommentselect'); // 获取 quickcommentselect 选择框

                if (firstTextarea.length && quickCommentSelect.length) {
                    const quickCommentOffset = quickCommentSelect.offset(); // 获取 quickcommentselect 的绝对位置
                    const tableOffset = table.offset(); // 获取 table 的绝对位置

                    const monitoringSelect = $('<select id="monitoringSelect" multiple="multiple" style="width: 300px; height: 330px; position: absolute;"></select>');
                    monitoringSelect.css({
                        top: (quickCommentOffset.top - tableOffset.top) + 'px', // 计算相对 table 的 top
                        left: (firstTextarea.position().left + firstTextarea.outerWidth() + 15) + 'px' // 仍然放在 textarea 右侧
                    });

                    table.append(monitoringSelect);

                    updateMonitoringSelect();
                    setInterval(updateMonitoringSelect, 2000);

                    monitoringSelect.change(function () {
                        const selectedText = $(this).find('option:selected').text();
                        const textarea = $('textarea[name="body"]');
                        textarea.val(textarea.val() + (textarea.val() ? '\n' : '') + selectedText);
                        formatTextareaInput(textarea);
                    });
                }
            }
        }


        // 更新监控选择框的内容
        function updateMonitoringSelect() {
            const assistantContent = $('#assistant-tooltips').html() || '';
            const editorContent = $('#editor-tooltips').html() || '';
            const combinedContent = assistantContent + '<br>' + editorContent;
            const monitoringSelect = $('#monitoringSelect');

            if (monitoringSelect.data('content') !== combinedContent) {
                monitoringSelect.data('content', combinedContent);
                monitoringSelect.empty();

                const lines = combinedContent.split(/<br\s*\/?>/gi);
                lines.forEach(line => {
                    const trimmedLine = line.trim();
                    if (trimmedLine && !trimmedLine.includes('此种子未检测到异常')) {
                        monitoringSelect.append($('<option></option>').text(trimmedLine));
                    }
                });
            }
        }

        // 构建下拉选择 HTML
        function buildSelectOptions(comments) {
            let options = comments.map((comment, index) =>
                                       `<option class="quickcomment" id="quickcomment${index}" value="${index}">${comment}</option>`
                                      ).join('');
            return `<div align="center"><select id="quickcommentselect" multiple="multiple" style="width: 450px; height: 330px; margin-top: 5px; margin-bottom: 5px">${options}</select></div>`;
        }

        // 设置事件监听器
        function setupEventListeners(textarea) {
            $('#quickcommentselect').change(() => handleSelectChange(textarea));
            textarea.on('input', () => formatTextareaInput(textarea));

            $('#qr').after('<input type="checkbox" id="addTextCheckbox" style="margin-left: 10px;"/><label for="addTextCheckbox">完成修改后请「举报/反馈」种子,谢谢</label>');
            $('#qr').after('<input type="checkbox" id="sendRequestCheckbox" style="margin-left: 20px;"/><label for="sendRequestCheckbox">冻结</label>');
            $('#qr').click((event) => handleQRClick(event, textarea));

            $('#addTextCheckbox').prop('checked', GM_getValue('addTextChecked', true));
            $('#sendRequestCheckbox').prop('checked', GM_getValue('sendRequestChecked', true));

            $('#addTextCheckbox').change(function() {
                GM_setValue('addTextChecked', $(this).is(':checked'));
            });
            $('#sendRequestCheckbox').change(function() {
                GM_setValue('sendRequestChecked', $(this).is(':checked'));
            });
        }

        // 处理下拉选择变更
        function handleSelectChange(textarea) {
            let selectedValues = $('#quickcommentselect').val();
            let currentText = textarea.val();
            let lastLineIsEmpty = currentText === '' || currentText.endsWith('\n');

            selectedValues.forEach(value => {
                let textToAdd = $(`#quickcomment${value}`).text();
                // 移除开头的「」部分
                textToAdd = textToAdd.replace(/^「[^」]*」/, '').trim();
                textarea.val(`${currentText}${lastLineIsEmpty ? '' : '\n'}● ${textToAdd}`);
                currentText = textarea.val();
            });
        }
        // 格式化文本区域输入
        function formatTextareaInput(textarea) {
            let lines = textarea.val().split('\n');
            let transformedLines = lines.map(line =>
                                             line.trim() !== '' && !line.trim().startsWith('●') ? `● ${line}` : line
                                            );
            textarea.val(transformedLines.join('\n'));
        }

        // 处理点击事件
        function handleQRClick(event, textarea) {
            event.preventDefault();

            const tid = new URLSearchParams(window.location.search).get('id');
            var url = "https://springsunday.net/admin.php?action=freezeoffer";
            var data = "tid=" + tid;

            if ($('#sendRequestCheckbox').is(':checked')) {
                sendRequest(url, data);
            }

            if ($('#addTextCheckbox').is(':checked')) {
                let currentText = textarea.val();
                let additionalText = "\n\n完成修改后请「举报/反馈」种子,谢谢 [em28]";
                if (!currentText.endsWith(additionalText)) {
                    textarea.val(`${currentText}${additionalText}`);
                }
            }

            setTimeout(() => {
                document.getElementById('compose').submit();
            }, 1000);
        }

        // 通用发送请求的函数
        function sendRequest(url, data) {
            GM_xmlhttpRequest({
                method: "POST",
                url: url,
                headers: {
                    "Content-Type": "application/x-www-form-urlencoded"
                },
                data: data
            });
        }

        // 初始化
        initializeUI();
        createMonitoringSelect();
    }

    //===================文件对比妙妙小工具===============

    if (window.location.href.includes("/details.php") && GM_info.script.name === "SpringSunday-Torrent-Assistant 测试版") {
        (function() {
            'use strict';

            // 简化样式
            GM_addStyle(`
        .filelist-btn {
            margin-left: 5px;
            padding: 2px 5px;
            cursor: pointer;
            background: #f0f0f0;
            border: 1px solid #ddd;
            border-radius: 3px;
            font-size: 12px;
        }
        .filelist-popup {
            position: fixed;
            background: white;
            border: 1px solid #ddd;
            padding: 10px;
            z-index: 9999;
            max-width: 80%;
            max-height: 60vh;
            overflow: auto;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
            font-family: monospace;
        }
        .filelist-added {
            color: green;
        }
        .filelist-removed {
            color: red;
        }
        .filelist-changed {
            color: blue;
        }
        .size-diff {
            background-color: #ffeb3b;
            padding: 0 2px;
            border-radius: 2px;
        }
    `);

            // 创建悬浮窗
            const popup = document.createElement('div');
            popup.className = 'filelist-popup';
            popup.style.display = 'none';
            document.body.appendChild(popup);

            // 主点击监听
            document.addEventListener('click', function(e) {
                // 检测文件列表按钮点击
                const btn = e.target.closest('a[role="button"]');
                if (btn) {
                    setTimeout(handleFilelist, 1000);
                    return;
                }

                // 处理保存按钮
                if (e.target.classList.contains('filelist-save')) {
                    const list = extractFileList();
                    if (list) {
                        GM_setValue('saved_filelist', list);
                        alert('已保存当前文件列表');
                    }
                    return;
                }

                // 处理对比按钮
                if (e.target.classList.contains('filelist-compare')) {
                    const current = extractFileList();
                    const saved = GM_getValue('saved_filelist', '');
                    showComparison(current, saved, e.target);
                    return;
                }

                // 点击其他地方关闭弹窗
                if (!e.target.closest('.filelist-popup')) {
                    popup.style.display = 'none';
                }
            });

            // 处理文件列表
            function handleFilelist() {
                const td = document.querySelector('td:has(div.filelist)');
                if (!td) return;

                // 添加按钮(如果尚未添加)
                if (!td.querySelector('.filelist-btn')) {
                    const btnContainer = document.createElement('span');
                    btnContainer.innerHTML = `
                <button class="filelist-btn filelist-save">保存文件列表</button>
                <button class="filelist-btn filelist-compare">对比保存的文件列表</button>
            `;
                    td.appendChild(btnContainer);
                }
            }

            // 提取文件列表
            function extractFileList() {
                const container = document.querySelector('div.filelist');
                if (!container) return null;

                const result = [];
                const extract = (node, path = '') => {
                    const items = node.querySelectorAll('li.filelist-node');
                    items.forEach(item => {
                        const name = item.querySelector('.filelist-filename')?.textContent?.trim() || '';
                        const size = item.querySelector('.filelist-size')?.textContent?.trim() || '';
                        const fullPath = path ? `${path}/${name}` : name;

                        if (item.classList.contains('dir')) {
                            extract(item, fullPath);
                        } else {
                            result.push({
                                path: fullPath,
                                size: size
                            });
                        }
                    });
                };

                extract(container);
                return JSON.stringify(result); // 保存为JSON格式
            }

            // 显示对比结果
            function showComparison(current, saved, anchor) {
                if (!saved) {
                    popup.innerHTML = '<div>没有已保存的文件列表</div>';
                    showPopup(anchor);
                    return;
                }

                try {
                    const currentFiles = current ? JSON.parse(current) : [];
                    const savedFiles = JSON.parse(saved);

                    const currentMap = new Map(currentFiles.map(f => [f.path, f.size]));
                    const savedMap = new Map(savedFiles.map(f => [f.path, f.size]));

                    const allPaths = new Set([...currentMap.keys(), ...savedMap.keys()]);
                    const diff = [];

                    for (const path of allPaths) {
                        const currentSize = currentMap.get(path);
                        const savedSize = savedMap.get(path);

                        if (!currentMap.has(path)) {
                            // 文件被删除
                            diff.push(`<div class="filelist-removed">- ${path} ${savedSize}</div>`);
                        } else if (!savedMap.has(path)) {
                            // 文件被删除
                            diff.push(`<div class="filelist-removed">- ${path} ${savedSize}</div>`);
                        } else if (!savedMap.has(path)) {
                            // 文件是新增的
                            diff.push(`<div class="filelist-added">+ ${path} ${currentSize}</div>`);
                        } else if (currentSize !== savedSize) {
                            // 文件名相同但体积不同
                            diff.push(`
                        <div class="filelist-changed">
                            ${path}
                            <span class="size-diff">${savedSize} → ${currentSize}</span>
                        </div>
                    `);
                        }
                    }
                    popup.innerHTML = diff.length ? diff.join('') : '<div>没有差异</div>';
                    showPopup(anchor);
                } catch (e) {
                    popup.innerHTML = '<div>对比出错: ' + e.message + '</div>';
                    showPopup(anchor);
                }
            }
            // 显示弹窗
            function showPopup(anchor) {
                const rect = anchor.getBoundingClientRect();
                popup.style.left = `${rect.left}px`;
                popup.style.top = `${rect.bottom + 5}px`;
                popup.style.display = 'block';
            }
        })();
    }
})();