PageSourceSearch

https://daohang-c5k.pages.dev/soso/js/main.js

js daohang-c5k.pages.dev collected 2026-10-03 06:39:53 UTC 17,206 bytes, 536 lines download raw bytes

1function getProjectConfigValue(key, fallback) {
2    function normalize(value, defaultValue) {
3        if (value === undefined || value === null) {
4            return String(defaultValue);
5        }
6        if (value === true || value === "true" || value === 1 || value === "1") {
7            return "1";
8        }
9        if (value === false || value === "false" || value === 0 || value === "0") {
10            return "0";
11        }
12        return String(value);
13    }
14    if (typeof window.getProjectSettings === "function") {
15        try {
16            var settings = window.getProjectSettings();
17            if (settings && settings[key] !== undefined) {
18                return normalize(settings[key], fallback);
19            }
20        } catch (error) {}
21    }
22    try {
23        var localRaw = localStorage.getItem("project_settings");
24        if (localRaw) {
25            var localConfig = JSON.parse(localRaw);
26            if (localConfig && localConfig[key] !== undefined) {
27                return normalize(localConfig[key], fallback);
28            }
29        }
30    } catch (error) {}
31    try {
32        var cookieMatch = document.cookie.match(new RegExp('(?:^|; )' + encodeURIComponent("project_settings") + '=([^;]*)'));
33        if (cookieMatch) {
34            var cookieConfig = JSON.parse(decodeURIComponent(cookieMatch[1]));
35            if (cookieConfig && cookieConfig[key] !== undefined) {
36                return normalize(cookieConfig[key], fallback);
37            }
38        }
39    } catch (error) {}
40    return normalize(fallback, fallback);
41}
42
43var pageRevealed = false;
44var aplayerLoaded = false;
45var aplayerReady = false;
46var aplayerLoading = false;
47var aplayerInstance = null;
48var playlistApiFallbacks = [
49    "https://api.injahow.cn/meting/?server=netease&type=playlist&id=",
50    "https://api.i-meto.com/meting/api?server=netease&type=playlist&id="
51];
52
53function normalizePlaylistId(value) {
54    var parsed = String(value === undefined || value === null ? "" : value).trim();
55    if (!/^\d+$/.test(parsed)) {
56        return "2141128031";
57    }
58    return parsed;
59}
60
61function fetchPlaylistTracksWithFallback(playlistId) {
62    var index = 0;
63    function tryNext() {
64        if (index >= playlistApiFallbacks.length) {
65            return Promise.reject(new Error("all playlist api failed"));
66        }
67        var requestUrl = playlistApiFallbacks[index] + encodeURIComponent(playlistId) + "&r=" + Date.now();
68        return fetch(requestUrl)
69            .then(function (response) {
70                if (!response.ok) {
71                    throw new Error("playlist request failed");
72                }
73                return response.json();
74            })
75            .then(function (list) {
76                if (!Array.isArray(list) || list.length === 0) {
77                    throw new Error("playlist empty");
78                }
79                var tracks = list.map(function (item) {
80                    var artist = item && item.artist !== undefined ? item.artist : "";
81                    if (Array.isArray(artist)) {
82                        artist = artist.join(" / ");
83                    }
84                    return {
85                        name: item && item.name ? String(item.name) : "未知歌曲",
86                        artist: artist ? String(artist) : "未知歌手",
87                        url: item && item.url ? String(item.url) : "",
88                        cover: item && item.pic ? String(item.pic) : "",
89                        lrc: item && item.lrc ? String(item.lrc) : ""
90                    };
91                }).filter(function (track) {
92                    return !!track.url;
93                });
94                if (!tracks.length) {
95                    throw new Error("playlist has no playable urls");
96                }
97                return tracks;
98            })
99            .catch(function () {
100                index += 1;
101                return tryNext();
102            });
103    }
104    return tryNext();
105}
106
107function initAPlayerWithTracks(playlistId, tracks) {
108    var wrap = document.getElementById("aplayer-wrap");
109    if (!wrap) {
110        throw new Error("aplayer wrap missing");
111    }
112    if (aplayerInstance && typeof aplayerInstance.destroy === "function") {
113        try {
114            aplayerInstance.destroy();
115        } catch (error) {}
116    }
117    wrap.innerHTML = "";
118    var container = document.createElement("div");
119    wrap.appendChild(container);
120    aplayerInstance = new APlayer({
121        container: container,
122        fixed: true,
123        mini: true,
124        autoplay: false,
125        volume: 0.8,
126        order: "random",
127        listFolded: true,
128        lrcType: 3,
129        audio: tracks
130    });
131    wrap.setAttribute("data-playlist-id", playlistId);
132}
133
134function revealPage() {
135    if (pageRevealed) {
136        return;
137    }
138    pageRevealed = true;
139    $('#loading-box').attr('class', 'loaded');
140    $('#bg').css("cssText", "transform: scale(1);filter: blur(0px);transition: ease 0.55s;");
141    $('#section').css("cssText", "opacity: 1;transition: ease 0.45s;");
142    $('.cover').css("cssText", "opacity: 1;transition: ease 0.45s;");
143}
144
145function loadScript(src) {
146    return new Promise(function (resolve, reject) {
147        var script = document.createElement("script");
148        script.src = src;
149        script.defer = true;
150        script.onload = resolve;
151        script.onerror = reject;
152        document.body.appendChild(script);
153    });
154}
155
156function loadScriptWithFallback(urlList) {
157    return new Promise(function (resolve, reject) {
158        var index = 0;
159        function tryLoad() {
160            if (index >= urlList.length) {
161                reject(new Error("all script sources failed"));
162                return;
163            }
164            loadScript(urlList[index]).then(resolve).catch(function () {
165                index += 1;
166                tryLoad();
167            });
168        }
169        tryLoad();
170    });
171}
172
173function ensureAPlayerVisibleFallback() {
174    var wrap = document.getElementById("aplayer-wrap");
175    if (!wrap || aplayerReady) {
176        return;
177    }
178    if (wrap.querySelector(".aplayer")) {
179        aplayerReady = true;
180        return;
181    }
182    if (!window.APlayer) {
183        return;
184    }
185    wrap.innerHTML = "";
186    var container = document.createElement("div");
187    wrap.appendChild(container);
188    try {
189        if (aplayerInstance && typeof aplayerInstance.destroy === "function") {
190            aplayerInstance.destroy();
191        }
192        new APlayer({
193            container: container,
194            fixed: true,
195            mini: true,
196            autoplay: false,
197            volume: 0.6,
198            listFolded: true,
199            audio: [{
200                name: "NOISE Radio",
201                artist: "NOISE",
202                url: "https://moeplayer.b0.upaiyun.com/aplayer/dario.mp3",
203                cover: "https://picsum.photos/300/300?random=18"
204            }]
205        });
206        aplayerReady = true;
207        if (window.iziToast) {
208            iziToast.show({
209                timeout: 2500,
210                message: '歌单加载失败,已启用播放器兜底音源'
211            });
212        }
213    } catch (error) {}
214}
215
216window.loadAPlayerAssets = function (force) {
217    if ((aplayerLoaded || aplayerLoading) && !force) {
218        return;
219    }
220
221    var playlistId = normalizePlaylistId(getProjectConfigValue("music_playlist_id", "2141128031"));
222    var wrap = document.getElementById("aplayer-wrap");
223    if (!wrap) {
224        return;
225    }
226
227    aplayerLoading = true;
228    aplayerReady = false;
229    loadScriptWithFallback([
230            "https://cdn.jsdelivr.net/npm/[email protected]/dist/APlayer.min.js",
231            "../assets/js/APlayer.min.js"
232        ])
233        .then(function () {
234            return fetchPlaylistTracksWithFallback(playlistId);
235        })
236        .then(function (tracks) {
237            initAPlayerWithTracks(playlistId, tracks);
238        })
239        .then(function () {
240            aplayerLoading = false;
241            aplayerLoaded = true;
242            aplayerReady = true;
243        })
244        .catch(function () {
245            aplayerLoading = false;
246            aplayerLoaded = false;
247            aplayerReady = false;
248            ensureAPlayerVisibleFallback();
249            if (window.iziToast) {
250                iziToast.show({
251                    timeout: 3500,
252                    message: '网易云歌单加载失败,请检查网络后重试'
253                });
254            }
255        });
256};
257
258//加载完成后执行
259window.addEventListener('DOMContentLoaded', function () {
260    // 先让页面可用,再等待其余资源
261    revealPage();
262
263    //用户欢迎
264    if (window.iziToast) {
265        iziToast.settings({
266            timeout: 3000,
267            backgroundColor: '#ffffff40',
268            titleColor: '#efefef',
269            messageColor: '#efefef',
270            progressBar: false,
271            close: false,
272            closeOnEscape: true,
273            position: 'topCenter',
274            transitionIn: 'bounceInDown',
275            transitionOut: 'flipOutX',
276            displayMode: 'replace',
277            layout: '1'
278        });
279    }
280    if (window.iziToast && getProjectConfigValue("show_welcome", "1") === "1") {
281        setTimeout(function () {
282            iziToast.show({
283                title: hello,
284                message: '欢迎来到 NOISE导航'
285            });
286        }, 800);
287    }
288
289    //中文字体缓加载-此处写入字体源文件
290    //先行加载简体中文子集,后续补全字集
291    //由于压缩过后的中文字体仍旧过大,可转移至对象存储或 CDN 加载
292    if ("requestIdleCallback" in window) {
293        requestIdleCallback(function () {
294            const font = new FontFace(
295                "MiSans",
296                "url(" + "./font/MiSans-Regular.woff2" + ")"
297            );
298            font.load().then(function (loadedFont) {
299                document.fonts.add(loadedFont);
300            }).catch(function () {});
301        });
302    }
303    if (getProjectConfigValue("show_aplayer", "1") === "1") {
304        setTimeout(function () {
305            window.loadAPlayerAssets();
306        }, 600);
307        setTimeout(function () {
308            window.loadAPlayerAssets();
309        }, 1800);
310    }
311}, false)
312
313window.addEventListener('load', revealPage, false);
314setTimeout(revealPage, 1200);
315
316//进入问候
317now = new Date(), hour = now.getHours()
318if (hour < 6) {
319    var hello = "凌晨好";
320} else if (hour < 9) {
321    var hello = "早上好";
322} else if (hour < 12) {
323    var hello = "上午好";
324} else if (hour < 14) {
325    var hello = "中午好";
326} else if (hour < 17) {
327    var hello = "下午好";
328} else if (hour < 19) {
329    var hello = "傍晚好";
330} else if (hour < 22) {
331    var hello = "晚上好";
332} else {
333    var hello = "夜深了";
334}
335
336//获取时间
337var t = null;
338t = setTimeout(time, 1000);
339
340function time() {
341    clearTimeout(t);
342    dt = new Date();
343    var mm = dt.getMonth() + 1;
344    var d = dt.getDate();
345    var weekday = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"];
346    var day = dt.getDay();
347    var h = dt.getHours();
348    var m = dt.getMinutes();
349    if (h < 10) {
350        h = "0" + h;
351    }
352    if (m < 10) {
353        m = "0" + m;
354    }
355    $("#time_text").html(h + '<span id="point">:</span>' + m);
356    $("#day").html(mm + "&nbsp;月&nbsp;" + d + "&nbsp;日&nbsp;" + weekday[day]);
357    t = setTimeout(time, 1000);
358}
359
360function setWeatherDisplay(weatherText, minTemp, maxTemp) {
361    $('#wea_text').text(weatherText);
362    $('#tem1').text(maxTemp);
363    $('#tem2').text(minTemp);
364}
365
366function loadWeatherFromYike() {
367    return fetch('https://yiketianqi.com/api?unescape=1&version=v6&appid=43986679&appsecret=TksqGZT7')
368        .then(function (response) {
369            if (!response.ok) {
370                throw new Error("yike api error");
371            }
372            return response.json();
373        })
374        .then(function (data) {
375            if (!data || data.wea === undefined || data.tem1 === undefined || data.tem2 === undefined) {
376                throw new Error("yike api invalid data");
377            }
378            setWeatherDisplay(data.wea, data.tem2, data.tem1);
379        });
380}
381
382function weatherCodeToText(code) {
383    var map = {
384        0: "晴",
385        1: "晴",
386        2: "多云",
387        3: "阴",
388        45: "雾",
389        48: "雾凇",
390        51: "小雨",
391        53: "中雨",
392        55: "大雨",
393        56: "冻雨",
394        57: "冻雨",
395        61: "小雨",
396        63: "中雨",
397        65: "大雨",
398        66: "雨夹雪",
399        67: "雨夹雪",
400        71: "小雪",
401        73: "中雪",
402        75: "大雪",
403        80: "阵雨",
404        81: "阵雨",
405        82: "暴雨",
406        95: "雷阵雨",
407        96: "雷雨冰雹",
408        99: "雷雨冰雹"
409    };
410    return map[code] || "未知";
411}
412
413function loadWeatherFromOpenMeteo() {
414    var weatherUrl = "https://api.open-meteo.com/v1/forecast?latitude=31.23&longitude=121.47&current=weather_code&daily=temperature_2m_max,temperature_2m_min&timezone=Asia%2FShanghai";
415    return fetch(weatherUrl)
416        .then(function (response) {
417            if (!response.ok) {
418                throw new Error("open-meteo api error");
419            }
420            return response.json();
421        })
422        .then(function (data) {
423            var weatherCode = data && data.current && data.current.weather_code;
424            var maxTemp = data && data.daily && data.daily.temperature_2m_max && data.daily.temperature_2m_max[0];
425            var minTemp = data && data.daily && data.daily.temperature_2m_min && data.daily.temperature_2m_min[0];
426            if (weatherCode === undefined || maxTemp === undefined || minTemp === undefined) {
427                throw new Error("open-meteo api invalid data");
428            }
429            setWeatherDisplay(weatherCodeToText(weatherCode), Math.round(minTemp), Math.round(maxTemp));
430        });
431}
432
433//获取天气
434if (getProjectConfigValue("show_weather", "1") === "1") {
435    loadWeatherFromYike()
436        .catch(function () {
437            return loadWeatherFromOpenMeteo();
438        })
439        .catch(function () {
440            setWeatherDisplay("天气不可用", "--", "--");
441        });
442} else {
443    $(".weather").hide();
444}
445
446//火狐浏览器独立样式
447if (isFirefox = navigator.userAgent.indexOf("Firefox") > 0) {
448    var head = document.getElementsByTagName('head')[0];
449    var link = document.createElement('link');
450    link.href = './css/firefox.css';
451    link.rel = 'stylesheet';
452    link.type = 'text/css';
453    head.appendChild(link);
454    window.addEventListener('load', function () {
455        if (window.iziToast) {
456            setTimeout(function () {
457                iziToast.show({
458                    timeout: 8000,
459                    message: '您正在使用火狐浏览器,部分功能可能不支持'
460                });
461            }, 3800);
462        }
463    }, false)
464}
465
466//Tab书签页
467$(function () {
468    $(".mark .tab .tab-item").click(function () {
469        $(this).addClass("active").siblings().removeClass("active");
470        $(".products .mainCont").eq($(this).index()).css("display", "flex").siblings().css("display", "none");
471    })
472})
473
474//设置
475$(function () {
476    $(".set .tabs .tab-items").click(function () {
477        $(this).addClass("actives").siblings().removeClass("actives");
478        $(".productss .mainConts").eq($(this).index()).css("display", "flex").siblings().css("display", "none");
479    })
480})
481
482//输入框为空时阻止跳转
483$(window).keydown(function (e) {
484    var key = e.which || e.keyCode;
485    if (key.toString() == "13") {
486        if ($(".wd").val() == "") {
487            return false;
488        }
489    }
490});
491
492//点击搜索按钮
493$(".sou-button").click(function () {
494    if ($("body").attr("class") === "onsearch") {
495        if ($(".wd").val() != "") {
496            $("#search-submit").click();
497        }
498    }
499});
500
501$(window).mousedown(function (event) {
502    if (event.button == 1) {
503        $("#time_text").click();
504    }
505});
506
507//控制台输出
508var styleTitle1 = `
509font-size: 20px;
510font-weight: 600;
511color: rgb(244,167,89);
512`
513var styleTitle2 = `
514font-size:12px;
515color: rgb(244,167,89);
516`
517var styleContent = `
518color: rgb(30,152,255);
519`
520var title1 = 'NOISE导航'
521var title2 = `
522 _____ __  __  _______     ____     __
523|_   _|  \\/  |/ ____\\ \\   / /\\ \\   / /
524  | | | \\  / | (___  \\ \\_/ /  \\ \\_/ / 
525  | | | |\\/| |\\___ \\  \\   /    \\   /  
526 _| |_| |  | |____) |  | |      | |   
527|_____|_|  |_|_____/   |_|      |_|                                                     
528`
529var content = `
530版 本 号:NOISE导航-轻快版
531更新日期:2026-04-28
532
533Github:  https://github.com/imsyy/Snavigation
534`
535console.log(`%c${title1} %c${title2}
536%c${content}`, styleTitle1, styleTitle2, styleContent)

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.