Greasy Fork is available in English.
Display preview images (support single image, multiple images, moving images); Download animation(.zip); Sorting the search page by favorite count(and display it). Updated for the latest search page.
ของเมื่อวันที่
- // ==UserScript==// @name Pixiv Previewer// @namespace https://github.com/Ocrosoft/PixivPreviewer// @version 3.5.4// @description Display preview images (support single image, multiple images, moving images); Download animation(.zip); Sorting the search page by favorite count(and display it). Updated for the latest search page.// @description:zh-CN 显示预览图(支持单图,多图,动图);动图压缩包下载;搜索页按热门度(收藏数)排序并显示收藏数,适配11月更新。// @description:ja プレビュー画像の表示(単一画像、複数画像、動画のサポート); アニメーションのダウンロード(.zip); お気に入りの数で検索ページをソートします(そして表示します)。 最新の検索ページ用に更新されました。// @description:zh_TW 顯示預覽圖像(支持單幅圖像,多幅圖像,運動圖像); 下載動畫(.zip); 按收藏夾數對搜索頁進行排序(並顯示)。 已為最新的搜索頁面適配。// @author Ocrosoft// @match *://www.pixiv.net/*// @grant none// @compatible Chrome// ==/UserScript==// 测试 JQuery,如果不支持就插入//let $ = function () { };try {$();} catch (e) {let script = document.createElement('script');script.src = 'https://cdn.bootcdn.net/ajax/libs/jquery/2.1.4/jquery.min.js';document.head.appendChild(script);}let Lang = {// 自动选择auto: -1,// 中文-##大陆zh_CN: 0,// 英语-美国en_US: 1,// 俄语-俄罗斯ru_RU: 2,};let Texts = {};Texts[Lang.zh_CN] = {// 安装或更新后弹出的提示install_title: '欢迎使用 PixivPreviewer v',install_body: '<div style="position: absolute;width: 40%;left: 30%;top: 30%;font-size: 20px; color: white;"><p style="text-indent: 2em;">欢迎反馈问题和提出建议!><a style="color: green;" href="https://gfork.dahi.icu/zh-CN/scripts/30766-pixiv-previewer/feedback" target="_blank">反馈页面</a><</p><br><p style="text-indent: 2em;">如果您是第一次使用,推荐到<a style="color: green;" href="https://greasyfork.org/zh-CN/scripts/30766-pixiv-previewer" target="_blank"> 详情页 </a>查看脚本介绍。</p></div>',// 设置项setting_language: '语言',setting_preview: '预览',setting_sort: '排序(仅搜索页生效)',setting_anime: '动图下载(动图预览及详情页生效)',setting_origin: '预览时优先显示原图(慢)',setting_previewDelay: '延迟显示预览图(毫秒)',setting_maxPage: '每次排序时统计的最大页数',setting_hideWork: '隐藏收藏数少于设定值的作品',setting_hideFav: '排序时隐藏已收藏的作品',setting_hideFollowed: '排序时隐藏已关注画师作品',setting_clearFollowingCache: '清除缓存',setting_clearFollowingCacheHelp: '关注画师信息会在本地保存一天,如果希望立即更新,请点击清除缓存',setting_followingCacheCleared: '已清除缓存,请刷新页面。',setting_blank: '使用新标签页打开作品详情页',setting_turnPage: '使用键盘←→进行翻页(排序后的搜索页)',setting_save: '保存设置',setting_reset: '重置脚本',setting_resetHint: '这会删除所有设置,相当于重新安装脚本,确定要重置吗?',// 搜索时过滤值太高sort_noWork: '没有可以显示的作品',sort_getWorks: '正在获取第%1/%2页作品',sort_getBookmarkCount: '获取收藏数:%1/%2',sort_getPublicFollowing: '获取公开关注画师',sort_getPrivateFollowing: '获取私有关注画师',sort_filtering: '过滤%1收藏量低于%2的作品',sort_filteringHideFavorite: '已收藏和',sort_fullSizeThumb: '排序后展示全尺寸图片',};// translate by googleTexts[Lang.en_US] = {install_title: 'Welcome to PixivPreviewer v',install_body: '<div style="position: absolute;width: 40%;left: 30%;top: 30%;font-size: 20px; color: white;"><p style="text-indent: 2em;">Feedback questions and suggestions are welcome! ><a style="color: green;" href="https://greasyfork.org/zh-CN/scripts/30766-pixiv-previewer/feedback" target="_blank">Feedback Page</a><</p><br><p style="text-indent: 2em;">If you are using it for the first time, it is recommended to go to the<a style="color: green;" href="https://greasyfork.org/zh-CN/scripts/30766-pixiv-previewer" target="_blank"> Details Page </a>to see the script introduction.</p></div>',setting_language: 'Language',setting_preview: 'Preview',setting_sort: 'Sorting (Search page)',setting_anime: 'Animation download (Preview and Artwork page)',setting_origin: 'Display original image when preview (slow)',setting_previewDelay: 'Delay of display preview image(Million seconds)',setting_maxPage: 'Maximum number of pages counted per sort',setting_hideWork: 'Hide works with bookmark count less than set value',setting_hideFav: 'Hide favorites when sorting',setting_hideFollowed: 'Hide artworks of followed artists when sorting',setting_clearFollowingCache: 'Cache',setting_clearFollowingCacheHelp: 'The folloing artists info. will be saved locally for one day, if you want to update immediately, please click this to clear cache',setting_followingCacheCleared: 'Success, please refresh the page.',setting_blank: 'Open works\' details page in new tab',setting_turnPage: 'Use ← → to turn pages (Search page)',setting_save: 'Save',setting_reset: 'Reset',setting_resetHint: 'This will delete all settings and set it to default. Are you sure?',sort_noWork: 'No works to display',sort_getWorks: 'Getting artworks of page: %1 of %2',sort_getBookmarkCount: 'Getting bookmark count of artworks:%1 of %2',sort_getPublicFollowing: 'Getting public following list',sort_getPrivateFollowing: 'Getting private following list',sort_filtering: 'Filtering%1works with bookmark count less than %2',sort_filteringHideFavorite: ' favorited works and ',sort_fullSizeThumb: 'Display not cropped images.',};// RU: перевод от vanja-sanTexts[Lang.ru_RU] = {install_title: 'Добро пожаловать в PixivPreviewer v',install_body: '<div style="position: absolute;width: 40%;left: 30%;top: 30%;font-size: 20px; color: white;"><p style="text-indent: 2em;">Вопросы и предложения приветствуются! ><a style="color: green;" href="https://greasyfork.org/zh-CN/scripts/30766-pixiv-previewer/feedback" target="_blank">Страница обратной связи</a><</p><br><p style="text-indent: 2em;">Если вы используете это впервые, рекомендуется перейти к<a style="color: green;" href="https://greasyfork.org/zh-CN/scripts/30766-pixiv-previewer" target="_blank"> Странице подробностей </a>, чтобы посмотреть введение в скрипт.</p></div>',setting_language: 'Язык',setting_preview: 'Предпросмотр',setting_sort: 'Сортировка (Страница поиска)',setting_anime: 'Анимация скачивания (Страницы предпросмотра и Artwork)',setting_origin: 'При предпросмотре, показывать изображения с оригинальным качеством (медленно)',setting_previewDelay: 'Задержка отображения предпросмотра изображения (Миллион секунд)',setting_maxPage: 'Максимальное количество страниц, подсчитанных за сортировку',setting_hideWork: 'Скрыть работы с количеством закладок меньше установленного значения',setting_hideFav: 'При сортировке, скрыть избранное',setting_hideFollowed: 'При сортировке, скрыть работы художников на которых подписаны',setting_clearFollowingCache: 'Кэш',setting_clearFollowingCacheHelp: 'Следующая информация о художниках будет сохранена локально в течение одного дня, если вы хотите обновить её немедленно, нажмите на эту кнопку, чтобы очистить кэш',setting_followingCacheCleared: 'Готово, обновите страницу.',setting_blank: 'Открывать страницу с описанием работы на новой вкладке',setting_turnPage: 'Использовать ← → для перелистывания страниц (Страница поиска)',setting_save: 'Сохранить',setting_reset: 'Сбросить',setting_resetHint: 'Это удалит все настройки и установит их по умолчанию. Продолжить?',sort_noWork: 'Нет работ для отображения',sort_getWorks: 'Получение иллюстраций страницы: %1 из %2',sort_getBookmarkCount: 'Получение количества закладок artworks:%1 из %2',sort_getPublicFollowing: 'Получение публичного списка подписок',sort_getPrivateFollowing: 'Получение приватного списка подписок',sort_filtering: 'Фильтрация %1 работ с количеством закладок меньше чем %2',sort_filteringHideFavorite: ' избранные работы и ',sort_fullSizeThumb: 'Показать неотредактированное изображение',};let LogLevel = {None: 0,Error: 1,Warning: 2,Info: 3,Elements: 4,};function DoLog(level, msgOrElement) {if (level <= g_logLevel) {let prefix = '%c';let param = '';if (level == LogLevel.Error) {prefix += '[Error]';param = 'color:#ff0000';} else if (level == LogLevel.Warning) {prefix += '[Warning]';param = 'color:#ffa500';} else if (level == LogLevel.Info) {prefix += '[Info]';param = 'color:#000000';} else if (level == LogLevel.Elements) {prefix += 'Elements';param = 'color:#000000';}if (level != LogLevel.Elements) {console.log(prefix + msgOrElement, param);} else {console.log(msgOrElement);}if (++g_logCount > 512) {//console.clear();g_logCount = 0;}}}// 语言let g_language = Lang.zh_CN;// 版本号,第三位不需要跟脚本的版本号对上,第三位更新只有需要弹更新提示的时候才需要更新这里let g_version = '3.2.0';// 添加收藏需要这个let g_csrfToken = '';// 打的日志数量,超过一定数值清空控制台let g_logCount = 0;// 当前页面类型let g_pageType = -1;// 图片详情页的链接,使用时替换 #id#let g_artworkUrl = '/artworks/#id#';// 获取图片链接的链接let g_getArtworkUrl = '/ajax/illust/#id#/pages';// 获取动图下载链接的链接let g_getUgoiraUrl = '/ajax/illust/#id#/ugoira_meta';// 鼠标位置let g_mousePos = { x: 0, y: 0 };// 加载中图片let g_loadingImage = 'https://pp-1252089172.cos.ap-chengdu.myqcloud.com/loading.gif';// 页面打开时的 urllet initialUrl = location.href;// 默认设置,仅用于首次脚本初始化let g_defaultSettings = {'lang': -1,'enablePreview': 1,'enableSort': 1,'enableAnimeDownload': 1,'original': 0,'previewDelay': 200,'pageCount': 2,'favFilter': 0,'hideFavorite': 0,'hideFollowed': 0,'linkBlank': 1,'pageByKey': 0,'fullSizeThumb': 0,'logLevel': 1,'version': g_version,};// 设置let g_settings;// 日志等级let g_logLevel = LogLevel.Error;// 排序时同时请求收藏量的 Request 数量,没必要太多,并不会加快速度let g_maxXhr = 64;// 排序是否完成(如果排序时页面出现了非刷新切换,强制刷新)let g_sortComplete = true;// 页面相关的一些预定义,包括处理页面元素等let PageType = {// 搜索Search: 0,// 关注的新作品BookMarkNew: 1,// 发现Discovery: 2,// 用户主页Member: 3,// 首页Home: 4,// 排行榜Ranking: 5,// 大家的新作品NewIllust: 6,// R18R18: 7,// 自己的收藏页BookMark: 8,// 动态Stacc: 9,// 作品详情页(处理动图预览及下载)Artwork: 10,// 总数PageTypeCount: 11,};let Pages = {};/* Pages 必须实现的函数* PageTypeString: string,字符串形式的 PageType* bool CheckUrl: function(string url),用于检查一个 url 是否是当前页面的目标 url* ReturnMap ProcessPageElements: function(),处理页面(寻找图片元素、添加属性等),返回 ReturnMap* ReturnMap GetProcessedPageElements: function(), 返回上一次 ProcessPageElements 的返回值(如果没有上次调用则调用一次)* Object GetToolBar: function(), 返回工具栏元素(右下角那个,用来放设置按钮)* HasAutoLoad: bool,表示这个页面是否有自动加载功能*/let ReturnMapSample = {// 页面是否加载完成,false 意味着后面的成员无效loadingComplete: false,// 控制元素,每个图片的鼠标响应元素controlElements: [],// 可有可无,如果为 true,强制重新刷新预览功能forceUpdate: false,};let ControlElementsAttributesSample = {// 图片信息,内容如下:// [必需] 图片 idillustId: 0,// [必需] 图片类型(0:普通图片,2:动图)illustType: 0,// [必需] 页数pageCount: 1,// [可选] 标题title: '',// [可选] 作者 iduserId: 0,// [可选] 作者昵称userName: '',// [可选] 收藏数bookmarkCount: 0,};function findToolbarCommon() {// 目前第三级div,除了目标div外,子元素都是divreturn $('#root>div>div>ul').get(0);}function findToolbarOld() {return $('._toolmenu').get(0);}function convertThumbUrlToSmall(thumbUrl) {// 目前发现有以下两种格式的缩略图// https://i.pximg.net/c/128x128/custom-thumb/img/2021/01/31/20/35/53/87426718_p0_custom1200.jpg// https://i.pximg.net/c/128x128/img-master/img/2021/01/31/10/57/06/87425082_p0_square1200.jpglet replace1 = 'c/540x540_70/img-master';//let replace1 = 'img-master'; // 这个是转到regular的,比small的大多了,会很慢let replace2 = '_master';return thumbUrl.replace(/c\/.*\/custom-thumb/, replace1).replace('_custom', replace2).replace(/c\/.*\/img-master/, replace1).replace('_square', replace2);}Pages[PageType.Search] = {PageTypeString: 'SearchPage',CheckUrl: function (url) {// 没有 /artworks 的页面不支持return /^https?:\/\/www.pixiv.net\/tags\/.*\/(artworks|illustrations|manga)/.test(url) ||/^https?:\/\/www.pixiv.net\/en\/tags\/.*\/(artworks|illustrations|manga)/.test(url);},ProcessPageElements: function () {let returnMap = {loadingComplete: false,controlElements: [],};let sections = $('section');DoLog(LogLevel.Info, 'Page has ' + sections.length + ' <section>.');DoLog(LogLevel.Elements, sections);// 先对 section 进行评分let sectionIndex = -1;let bestScore = -99;sections.each(function (i, e) {let section = $(e);let score = 0;if (section.find('ul').length > 0) {let childrenCount = section.children().length;if (childrenCount != 2) {DoLog(LogLevel.Warning, '<ul> was found in this <section>, but it has ' + childrenCount + ' children!');score--;}let ul = section.find('ul');if (ul.length > 1) {DoLog(LogLevel.Warning, 'This section has more than one <ul>?');score--;}if ($(ul.parent().get(0)).css('display') == 'none' || $(ul.get(0)).css('display') == 'none') {DoLog(LogLevel.Info, '<ul> or it\'s parentNode is not visible now, continue waiting.');sectionIndex = -1;bestScore = 999;return false;}if ($(ul.get(0)).next().length === 0) {DoLog(LogLevel.Info, 'Page selector not exists, continue waiting.');sectionIndex = -1;bestScore = 999;return false;}let lis = ul.find('li');if (lis.length === 0) {DoLog(LogLevel.Info, 'This <ul> has 0 children, will be skipped.');return false;}if ($(lis.get(0)).find('figure').length > 0) {DoLog(LogLevel.Warning, '<figure> was found in the first <li>, continue waiting.');sectionIndex = -1;bestScore = 999;return false;}if (lis.length > 4) {score += 5;}// 正确的会在后面if (score >= bestScore) {bestScore = score;sectionIndex = i;}} else {DoLog(LogLevel.Info, 'This section(' + i + ' is not has <ul>, will be skipped.');}});if (sectionIndex == -1) {if (bestScore < 100) {DoLog(LogLevel.Error, 'No suitable <section>!');}return returnMap;}let lis = $(sections[sectionIndex]).find('ul').find('li');lis.each(function (i, e) {let li = $(e);// 只填充必须的几个,其他的目前用不着let ctlAttrs = {illustId: 0,illustType: 0,pageCount: 1,};let img = $(li.find('img').get(0));let imageLink = img.parent().parent();let additionDiv = img.parent().prev();let animationSvg = img.parent().find('svg');let pageCountSpan = additionDiv.find('span');if (img == null || imageLink == null) {DoLog(LogLevel.Warning, 'Can not found img or imageLink, skip this.');return;}let link = imageLink.attr('href');if (link == null) {DoLog(LogLevel.Warning, 'Invalid href, skip this.');return;}let linkMatched = link.match(/artworks\/(\d+)/);let illustId = '';if (linkMatched) {ctlAttrs.illustId = linkMatched[1];} else {DoLog(LogLevel.Error, 'Get illustId failed, skip this list item!');return;}if (animationSvg.length > 0) {ctlAttrs.illustType = 2;}if (pageCountSpan.length > 0) {ctlAttrs.pageCount = parseInt(pageCountSpan.text());}// 添加 attrlet control = li.children('div:first').children('div:first');control.attr({'illustId': ctlAttrs.illustId,'illustType': ctlAttrs.illustType,'pageCount': ctlAttrs.pageCount});control.addClass('pp-control');});returnMap.controlElements = $('.pp-control');this.private.pageSelector = $($(sections[sectionIndex]).find('ul').get(0)).next().get(0);returnMap.loadingComplete = true;this.private.imageListConrainer = $(sections[sectionIndex]).find('ul').get(0);DoLog(LogLevel.Info, 'Process page elements complete.');DoLog(LogLevel.Elements, returnMap);this.private.returnMap = returnMap;return returnMap;},GetProcessedPageElements: function () {if (this.private.returnMap == null) {return this.ProcessPageElements();}return this.private.returnMap;},GetToolBar: function () {return findToolbarCommon();},// 搜索页有 lazyload,不开排序的情况下,最后几张图片可能会无法预览。这里把它当做自动加载处理HasAutoLoad: true,GetImageListContainer: function () {return this.private.imageListConrainer;},GetFirstImageElement: function () {return $(this.private.imageListConrainer).find('li').get(0);},GetPageSelector: function () {return this.private.pageSelector;},private: {imageListContainer: null,pageSelector: null,returnMap: null,},};Pages[PageType.BookMarkNew] = {PageTypeString: 'BookMarkNewPage',CheckUrl: function (url) {return /^https:\/\/www.pixiv.net\/bookmark_new_illust.php.*/.test(url) ||/^https:\/\/www.pixiv.net\/bookmark_new_illust_r18.php.*/.test(url);},ProcessPageElements: function () {let returnMap = {loadingComplete: false,controlElements: [],};let containerDiv = $('#js-mount-point-latest-following').children('div:first');if (containerDiv.length > 0) {DoLog(LogLevel.Info, 'Found container div.');DoLog(LogLevel.Elements, containerDiv);} else {DoLog(LogLevel.Error, 'Can not found container div.');return returnMap;}containerDiv.children().each(function (i, e) {let _this = $(e);let figure = _this.find('figure');if (figure.length === 0) {DoLog(LogLevel.Warning, 'Can not found <fingure>, skip this element.');return;}let link = figure.children('div:first').children('a:first');if (link.length === 0) {DoLog(LogLevel.Warning, 'Can not found <a>, skip this element.');return;}let ctlAttrs = {illustId: 0,illustType: 0,pageCount: 1,};let href = link.attr('href');if (href == null || href === '') {DoLog(LogLevel.Warning, 'No href found, skip.');return;} else {let matched = href.match(/artworks\/(\d+)/);if (matched) {ctlAttrs.illustId = matched[1];} else {DoLog(LogLevel.Warning, 'Can not found illust id, skip.');return;}}if (link.children().length > 1) {if (link.children('div:first').find('span').length > 0) {let span = link.children('div:first').children('span:first');if (span.length === 0) {DoLog(LogLevel.Warning, 'Can not found <span>, skip this element.');return;}ctlAttrs.pageCount = span.text();} else {ctlAttrs.illustType = 2;}}let control = figure.children('div:first');control.attr({'illustId': ctlAttrs.illustId,'illustType': ctlAttrs.illustType,'pageCount': ctlAttrs.pageCount});returnMap.controlElements.push(control.get(0));});DoLog(LogLevel.Info, 'Process page elements complete.');DoLog(LogLevel.Elements, returnMap);returnMap.loadingComplete = true;this.private.returnMap = returnMap;return returnMap;},GetProcessedPageElements: function () {if (this.private.returnMap == null) {return this.ProcessPageElements();}return this.private.returnMap;},GetToolBar: function () {return findToolbarOld();},HasAutoLoad: false,private: {returnMap: null,},};Pages[PageType.Discovery] = {PageTypeString: 'DiscoveryPage',CheckUrl: function (url) {return /^https?:\/\/www.pixiv.net\/discovery.*/.test(url);},ProcessPageElements: function () {let returnMap = {loadingComplete: false,controlElements: [],};let containerDiv = $('.gtm-illust-recommend-zone');if (containerDiv.length > 0) {DoLog(LogLevel.Info, 'Found container div.');DoLog(LogLevel.Elements, containerDiv);} else {DoLog(LogLevel.Error, 'Can not found container div.');return returnMap;}containerDiv.children().each(function (i, e) {let _this = $(e);let figure = _this.find('figure');if (figure.length === 0) {DoLog(LogLevel.Warning, 'Can not found <fingure>, skip this element.');return;}let link = figure.children('div:first').children('a:first');if (link.length === 0) {DoLog(LogLevel.Warning, 'Can not found <a>, skip this element.');return;}let ctlAttrs = {illustId: 0,illustType: 0,pageCount: 1,};let href = link.attr('href');if (href == null || href === '') {DoLog(LogLevel.Warning, 'No href found, skip.');return;} else {let matched = href.match(/artworks\/(\d+)/);if (matched) {ctlAttrs.illustId = matched[1];} else {DoLog(LogLevel.Warning, 'Can not found illust id, skip.');return;}}if (link.children().length > 1) {if (link.children('div:first').find('span').length > 0) {let span = link.children('div:first').children('span:first');if (span.length === 0) {DoLog(LogLevel.Warning, 'Can not found <span>, skip this element.');return;}ctlAttrs.pageCount = span.text();} else if (link.children('div:last').css('background-image').indexOf('.svg') != -1) {ctlAttrs.illustType = 2;}}let control = figure.children('div:first');control.attr({'illustId': ctlAttrs.illustId,'illustType': ctlAttrs.illustType,'pageCount': ctlAttrs.pageCount});returnMap.controlElements.push(control.get(0));});DoLog(LogLevel.Info, 'Process page elements complete.');DoLog(LogLevel.Elements, returnMap);returnMap.loadingComplete = true;this.private.returnMap = returnMap;return returnMap;},GetProcessedPageElements: function () {if (this.private.returnMap == null) {return this.ProcessPageElements();}return this.private.returnMap;},GetToolBar: function () {return findToolbarOld();},HasAutoLoad: true,private: {returnMap: null,},};Pages[PageType.Member] = {PageTypeString: 'MemberPage/MemberIllustPage/MemberBookMark',CheckUrl: function (url) {return /^https?:\/\/www.pixiv.net\/users\/\d+/.test(url);},ProcessPageElements: function () {let returnMap = {loadingComplete: false,controlElements: [],};let sections = $('section');DoLog(LogLevel.Info, 'Page has ' + sections.length + ' <section>.');DoLog(LogLevel.Elements, sections);let lis = sections.find('ul').find('li');lis.each(function (i, e) {let li = $(e);// 只填充必须的几个,其他的目前用不着let ctlAttrs = {illustId: 0,illustType: 0,pageCount: 1,};let img = $(li.find('img').get(0));let imageLink = img.parent().parent();let additionDiv = img.parent().prev();let animationSvg = img.parent().find('svg');let pageCountSpan = additionDiv.find('span');if (!img || !imageLink) {DoLog(LogLevel.Warning, 'Can not found img or imageLink, skip this.');return;}let link = imageLink.attr('href');if (link == null) {DoLog(LogLevel.Warning, 'Can not found illust id, skip this.');return;}let linkMatched = link.match(/artworks\/(\d+)/);let illustId = '';if (linkMatched) {ctlAttrs.illustId = linkMatched[1];} else {DoLog(LogLevel.Error, 'Get illustId failed, skip this list item!');return;}if (animationSvg.length > 0) {ctlAttrs.illustType = 2;}if (pageCountSpan.length > 0) {ctlAttrs.pageCount = parseInt(pageCountSpan.text());}// 添加 attrlet control = li.children('div:first').children('div:first');if (control.length === 0) {control = li.children('div:last').children('div:first');}control.attr({'illustId': ctlAttrs.illustId,'illustType': ctlAttrs.illustType,'pageCount': ctlAttrs.pageCount});control.addClass('pp-control');});returnMap.controlElements = $('.pp-control');returnMap.loadingComplete = true;DoLog(LogLevel.Info, 'Process page elements complete.');DoLog(LogLevel.Elements, returnMap);this.private.returnMap = returnMap;return returnMap;},GetProcessedPageElements: function () {if (this.private.returnMap == null) {return this.ProcessPageElements();}return this.private.returnMap;},GetToolBar: function () {return findToolbarCommon();},// 跟搜索页一样的情况HasAutoLoad: true,private: {returnMap: null,},};Pages[PageType.Home] = {PageTypeString: 'HomePage',CheckUrl: function (url) {return /https?:\/\/www.pixiv.net\/?$/.test(url) ||/https?:\/\/www.pixiv.net\/en\/?$/.test(url);},ProcessPageElements: function () {let returnMap = {loadingComplete: false,controlElements: [],forceUpdate: false,};let illust_div = $('div[type="illust"]');DoLog(LogLevel.Info, 'This page has ' + illust_div.length + ' illust <div>.');if (illust_div.length < 1) {DoLog(LogLevel.Warning, 'Less than one <div>, continue waiting.');return returnMap;}// 实际里面还套了一个 div,处理一下,方便一点let illust_div_c = [];illust_div.each(function(i, e) {illust_div_c.push($(e).children('div:first'));});illust_div = illust_div_c;$.each(illust_div, function (i, e) {let _this = $(e);let a = _this.children('a:first');if (a.length == 0 || a.attr('href').indexOf('artworks') == -1) {DoLog(LogLevel.Warning, 'No href or an invalid href was found, skip this.');return;}let ctlAttrs = {illustId: 0,illustType: 0,pageCount: 1,};let illustId = a.attr('href').match(/\d+/);if (illustId == null) {DoLog(LogLevel.Warning, 'Can not found illust id of this image, skip.');return;} else {ctlAttrs.illustId = illustId[0];}let pageCount = a.children('div:first').find('span');if (pageCount.length > 0) {ctlAttrs.pageCount = parseInt($(pageCount.get(pageCount.length - 1)).text());}if ($(a.children('div').get(1)).find('svg').length > 0) {ctlAttrs.illustType = 2;}let control = a;if (control.attr('illustId') != ctlAttrs.illustId) {returnMap.forceUpdate = true;}control.attr({'illustId': ctlAttrs.illustId,'illustType': ctlAttrs.illustType,'pageCount': ctlAttrs.pageCount});returnMap.controlElements.push(control.get(0));});DoLog(LogLevel.Info, 'Process page elements complete.');DoLog(LogLevel.Elements, returnMap);returnMap.loadingComplete = true;this.private.returnMap = returnMap;return returnMap;},GetProcessedPageElements: function () {if (this.private.returnMap == null) {return this.ProcessPageElements();}return this.private.returnMap;},GetToolBar: function () {return findToolbarCommon();},HasAutoLoad: true,private: {returnMap: null,},};Pages[PageType.Ranking] = {PageTypeString: 'RankingPage',CheckUrl: function (url) {return /^https?:\/\/www.pixiv.net\/ranking.php.*/.test(url);},ProcessPageElements: function () {let returnMap = {loadingComplete: false,controlElements: [],};let works = $('._work');DoLog(LogLevel.Info, 'Found .work, length: ' + works.length);DoLog(LogLevel.Elements, works);works.each(function (i, e) {let _this = $(e);let ctlAttrs = {illustId: 0,illustType: 0,pageCount: 1,};let href = _this.attr('href');if (href == null || href === '') {DoLog('Can not found illust id, skip this.');return;}let matched = href.match(/artworks\/(\d+)/);if (matched) {ctlAttrs.illustId = matched[1];} else {DoLog('Can not found illust id, skip this.');return;}if (_this.hasClass('multiple')) {ctlAttrs.pageCount = _this.find('.page-count').find('span').text();}if (_this.hasClass('ugoku-illust')) {ctlAttrs.illustType = 2;}// 添加 attr_this.attr({'illustId': ctlAttrs.illustId,'illustType': ctlAttrs.illustType,'pageCount': ctlAttrs.pageCount});returnMap.controlElements.push(e);});returnMap.loadingComplete = true;DoLog(LogLevel.Info, 'Process page elements complete.');DoLog(LogLevel.Elements, returnMap);this.private.returnMap = returnMap;return returnMap;},GetProcessedPageElements: function () {if (this.private.returnMap == null) {return this.ProcessPageElements();}return this.private.returnMap;},GetToolBar: function () {return findToolbarOld();},HasAutoLoad: false,private: {returnMap: null,},};Pages[PageType.NewIllust] = {PageTypeString: 'NewIllustPage',CheckUrl: function (url) {return /^https?:\/\/www.pixiv.net\/new_illust.php.*/.test(url);},ProcessPageElements: function () {let returnMap = {loadingComplete: false,controlElements: [],};let ul = $('#root').find('ul:first');if (ul.length === 0) {DoLog(LogLevel.Error, 'Can not found <ul>!');return returnMap;}ul.find('li').each(function (i, e) {let _this = $(e);let link = _this.find('a:first');let href = link.attr('href');if (href == null || href === '') {DoLog(LogLevel.Error, 'Can not found illust id, skip this.');return;}let ctlAttrs = {illustId: 0,illustType: 0,pageCount: 1,};let matched = href.match(/artworks\/(\d+)/);if (matched) {ctlAttrs.illustId = matched[1];} else {DoLog(LogLevel.Warning, 'Can not found illust id, skip this.');return;}if (link.children().length > 1) {let span = link.find('svg').parent().parent().next();if (span.length > 0 && span.get(0).tagName == 'SPAN') {ctlAttrs.pageCount = span.text();} else if (link.find('svg').length > 0) {ctlAttrs.illustType = 2;}}let control = _this.children('div:first').children('div:first');control.attr({'illustId': ctlAttrs.illustId,'illustType': ctlAttrs.illustType,'pageCount': ctlAttrs.pageCount});returnMap.controlElements.push(control.get(0));});returnMap.loadingComplete = true;DoLog(LogLevel.Info, 'Process page elements complete.');DoLog(LogLevel.Elements, returnMap);this.private.returnMap = returnMap;return returnMap;},GetProcessedPageElements: function () {if (this.private.returnMap == null) {return this.ProcessPageElements();}return this.private.returnMap;},GetToolBar: function () {return findToolbarCommon();},HasAutoLoad: true,private: {returnMap: null,},};Pages[PageType.R18] = {PageTypeString: 'R18Page',CheckUrl: function (url) {return /^https?:\/\/www.pixiv.net\/cate_r18.php.*/.test(url);},ProcessPageElements: function () {//},GetToolBar: function () {//},HasAutoLoad: false,};Pages[PageType.BookMark] = {PageTypeString: 'BookMarkPage',CheckUrl: function (url) {return /^https:\/\/www.pixiv.net\/bookmark.php\/?$/.test(url);},ProcessPageElements: function () {let returnMap = {loadingComplete: false,controlElements: [],};let images = $('.image-item');DoLog(LogLevel.Info, 'Found images, length: ' + images.length);DoLog(LogLevel.Elements, images);images.each(function (i, e) {let _this = $(e);let work = _this.find('._work');if (work.length === 0) {DoLog(LogLevel.Warning, 'Can not found ._work, skip this.');return;}let ctlAttrs = {illustId: 0,illustType: 0,pageCount: 1,};let href = work.attr('href');if (href == null || href === '') {DoLog(LogLevel.Warning, 'Can not found illust id, skip this.');return;}let matched = href.match(/artworks\/(\d+)/);if (matched) {ctlAttrs.illustId = matched[1];} else {DoLog(LogLevel.Warning, 'Can not found illust id, skip this.');return;}if (work.hasClass('multiple')) {ctlAttrs.pageCount = _this.find('.page-count').find('span').text();}if (work.hasClass('ugoku-illust')) {ctlAttrs.illustType = 2;}// 添加 attrlet control = _this.children('a:first');control.attr({'illustId': ctlAttrs.illustId,'illustType': ctlAttrs.illustType,'pageCount': ctlAttrs.pageCount});returnMap.controlElements.push(control.get(0));});returnMap.loadingComplete = true;DoLog(LogLevel.Info, 'Process page elements complete.');DoLog(LogLevel.Elements, returnMap);this.private.returnMap = returnMap;return returnMap;},GetProcessedPageElements: function () {if (this.private.returnMap == null) {return this.ProcessPageElements();}return this.private.returnMap;},GetToolBar: function () {return findToolbarOld();},HasAutoLoad: false,private: {returnMap: null,},};Pages[PageType.Stacc] = {PageTypeString: 'Sta###age',CheckUrl: function (url) {return /^https:\/\/www.pixiv.net\/stacc.*/.test(url);},ProcessPageElements: function () {let returnMap = {loadingComplete: false,controlElements: [],};let works = $('._work');DoLog(LogLevel.Info, 'Found .work, length: ' + works.length);DoLog(LogLevel.Elements, works);works.each(function (i, e) {let _this = $(e);let ctlAttrs = {illustId: 0,illustType: 0,pageCount: 1,};let href = _this.attr('href');if (href == null || href === '') {DoLog('Can not found illust id, skip this.');return;}let matched = href.match(/illust_id=(\d+)/);if (matched) {ctlAttrs.illustId = matched[1];} else {DoLog('Can not found illust id, skip this.');return;}if (_this.hasClass('multiple')) {ctlAttrs.pageCount = _this.find('.page-count').find('span').text();}if (_this.hasClass('ugoku-illust')) {ctlAttrs.illustType = 2;}// 添加 attr_this.attr({'illustId': ctlAttrs.illustId,'illustType': ctlAttrs.illustType,'pageCount': ctlAttrs.pageCount});returnMap.controlElements.push(e);});returnMap.loadingComplete = true;DoLog(LogLevel.Info, 'Process page elements complete.');DoLog(LogLevel.Elements, returnMap);this.private.returnMap = returnMap;return returnMap;},GetProcessedPageElements: function () {if (this.private.returnMap == null) {return this.ProcessPageElements();}return this.private.returnMap;},GetToolBar: function () {return findToolbarOld();},HasAutoLoad: true,private: {returnMap: null,},};Pages[PageType.Artwork] = {PageTypeString: 'ArtworkPage',CheckUrl: function (url) {return /^https:\/\/www.pixiv.net\/artworks\/.*/.test(url) ||/^https:\/\/www.pixiv.net\/en\/artworks\/.*/.test(url);},ProcessPageElements: function () {let returnMap = {loadingComplete: false,controlElements: [],};// 是动图let canvas = $('main').find('figure').find('canvas');if ($('main').find('figure').find('canvas').length > 0) {this.private.needProcess = true;canvas.addClass('pp-canvas');}if (location.href.indexOf('#preview') == -1) {// 相关作品,container找不到说明还没加载let containerDiv = $('.gtm-illust-recommend-zone');if (containerDiv.length == 0) {let asides = $('#root').find('aside');$.each(asides, function(i, e) {if ($(e).children('section').length == 1) {containerDiv = $(e);return false;}});}if (containerDiv.length > 0) {DoLog(LogLevel.Info, 'Found container div.');DoLog(LogLevel.Elements, containerDiv);containerDiv.find('ul:first').children().each(function (i, e) {let _this = $(e);let img = _this.find('img');if (img.length === 0) {DoLog(LogLevel.Warning, 'Can not found <img>, skip this element.');return;}let link = _this.find('a:first');if (link.length === 0) {DoLog(LogLevel.Warning, 'Can not found <a>, skip this element.');return;}let ctlAttrs = {illustId: 0,illustType: 0,pageCount: 1,};let href = link.attr('href');if (href == null || href === '') {DoLog(LogLevel.Warning, 'No href found, skip.');return;} else {let matched = href.match(/artworks\/(\d+)/);if (matched) {ctlAttrs.illustId = matched[1];} else {DoLog(LogLevel.Warning, 'Can not found illust id, skip.');return;}}if (link.children().length > 1) {if (link.children('div:first').find('span').length > 0) {let span = link.children('div:first').find('span:first');if (span.length === 0) {DoLog(LogLevel.Warning, 'Can not found <span>, skip this element.');return;}ctlAttrs.pageCount = span.next().text();} else if (link.children('div:last').find('svg').length > 0) {ctlAttrs.illustType = 2;}}let control = link.parent();control.attr({'illustId': ctlAttrs.illustId,'illustType': ctlAttrs.illustType,'pageCount': ctlAttrs.pageCount});returnMap.controlElements.push(control.get(0));});}DoLog(LogLevel.Info, 'Process page elements complete.');DoLog(LogLevel.Elements, returnMap);}returnMap.loadingComplete = true;this.private.returnMap = returnMap;return returnMap;},GetProcessedPageElements: function () {if (this.private.returnMap == null) {return this.ProcessPageElements();}return this.private.returnMap;},GetToolBar: function () {return findToolbarCommon();},HasAutoLoad: true,Work: function () {function AddDownloadButton(button, offsetToOffsetTop) {if (!g_settings.enableAnimeDownload) {return;}let cloneButton = button.clone().css({ 'bottom': '50px', 'padding': 0, 'width': '48px', 'height': '48px', 'opacity': '0.4', 'cursor': 'pointer' });cloneButton.get(0).innerHTML = '<svg viewBox="0 0 120 120" style="width: 40px; height: 40px; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; border-radius: 24px; background-color: black; stroke: limegreen; fill: none;" class="_3Fo0Hjg"><polyline points="60,30 60,90"></polyline><polyline points="30,60 60,90 90,60"></polyline></svg></button>';function MoveButton() {function getOffset(e) {if (e.offsetParent) {let offset = getOffset(e.offsetParent);return {offsetTop: e.offsetTop + offset.offsetTop,offsetLeft: e.offsetLeft + offset.offsetLeft,};} else {return {offsetTop: e.offsetTop,offsetLeft: e.offsetLeft,};}}/*let offset = getOffset(button.get(0));DoLog(LogLevel.Info, 'offset of download button: ' + offset.offsetTop + ', ' + offset.offsetLeft);DoLog(LogLevel.Elements, offset);cloneButton.css({ 'position': 'absolute' }).show();*/}MoveButton();$(window).on('resize', MoveButton);button.after(cloneButton);cloneButton.mouseover(function () {$(this).css('opacity', '0.2');}).mouseleave(function () {$(this).css('opacity', '0.4');}).click(function () {let illustId = '';let matched = location.href.match(/artworks\/(\d+)/);if (matched) {illustId = matched[1];DoLog(LogLevel.Info, 'IllustId=' + illustId);} else {DoLog(LogLevel.Error, 'Can not found illust id!');return;}$.ajax(g_getUgoiraUrl.replace('#id#', illustId), {method: 'GET',success: function (json) {DoLog(LogLevel.Elements, json);if (json.error == true) {DoLog(LogLevel.Error, 'Server response an error: ' + json.message);return;}// 因为浏览器会拦截不同域的 open 操作,绕一下let newWindow = window.open('_blank');newWindow.location = json.body.originalSrc;},error: function () {DoLog(LogLevel.Error, 'Request zip file failed!');}});});}if (this.private.needProcess) {let canvas = $('.pp-canvas');// 预览模式,需要调成全屏,并且添加下载按钮到全屏播放的 div 里if (location.href.indexOf('#preview') != -1) {canvas.click();$('#root').remove();let callbackInterval = setInterval(function () {let div = $('div[role="presentation"]');if (div.length < 1) {return;}DoLog(LogLevel.Info, 'found <div>, continue to next step.');clearInterval(callbackInterval);let presentationCanvas = div.find('canvas');if (presentationCanvas.length < 1) {DoLog(LogLevel.Error, 'Can not found canvas in the presentation div.');return;}let width = 0, height = 0;let tWidth = presentationCanvas.attr('width');let tHeight = presentationCanvas.attr('height');if (tWidth && tHeight) {width = parseInt(tWidth);height = parseInt(tHeight);} else {tWidth = presentationCanvas.css('width');tHeight = presentationCanvas.css('height');width = parseInt(tWidth);height = parseInt(this);}let parent = presentationCanvas.parent();for (let i = 0; i < 3; i++) {parent.get(0).className = '';parent = parent.parent();}presentationCanvas.css({ 'width': width + 'px', 'height': height + 'px', 'cursor': 'default' }).addClass('pp-presentationCanvas');let divForStopClick = $('<div class="pp-disableClick"></div>').css({'width': width + 'px', 'height': height + 'px','opacity': 0,'position': 'absolute', 'top': '0px', 'left': '0px', 'z-index': 99999,});div.append(divForStopClick);div.append(presentationCanvas.next().css('z-index', 99999));presentationCanvas.next().remove();// 防止预览图消失$('html').addClass('pp-main');// 调整 canvas 大小的函数window.ResizeCanvas = function (newWidth, newHeight) {DoLog(LogLevel.Info, 'Resize canvas: ' + newWidth + 'x' + newHeight);$('.pp-disableClick').css({ 'width': newWidth, 'height': newHeight });$('.pp-presentationCanvas').css({ 'width': newWidth, 'height': newHeight });};window.GetCanvasSize = function () {return {width: width,height: height,};}// 添加下载按钮AddDownloadButton(divForStopClick.next(), 0);window.parent.PreviewCallback(width, height);}, 500);}// 普通模式,只需要添加下载按钮到内嵌模式的 div 里else {let div = $('div[role="presentation"]:last');let button = div.find('button');let headerRealHeight = parseInt($('header').css('height')) +parseInt($('header').css('padding-top')) + parseInt($('header').css('padding-bottom')) +parseInt($('header').css('margin-top')) + parseInt($('header').css('margin-bottom')) +parseInt($('header').css('border-bottom-width')) + parseInt($('header').css('border-top-width'));AddDownloadButton(button, headerRealHeight);}}},private: {needProcess: false,returnMap: null,},};function CheckUrlTest() {let urls = ['http://www.pixiv.net','http://www.pixiv.net','https://www.pixiv.net','https://www.pixiv.net/','https://www.pixiv.net/?lang=en','https://www.pixiv.net/search.php?s_mode=s_tag&word=miku','https://www.pixiv.net/search.php?word=VOCALOID&s_mode=s_tag_full','https://www.pixiv.net/discovery','https://www.pixiv.net/discovery?x=1','https://www.pixiv.net/member.php?id=3207350','https://www.pixiv.net/member_illust.php?id=3207350&type=illust','https://www.pixiv.net/bookmark.php?id=3207350&rest=show','https://www.pixiv.net/ranking.php?mode=daily&content=ugoira','https://www.pixiv.net/ranking.php?mode=daily','https://www.pixiv.net/new_illust.php','https://www.pixiv.net/new_illust.php?x=1','https://www.pixiv.net/cate_r18.php','https://www.pixiv.net/cate_r18.php?x=1','https://www.pixiv.net/bookmark.php','https://www.pixiv.net/bookmark.php?x=1','https://www.pixiv.net/stacc?mode=unify','https://www.pixiv.net/artworks/77996773','https://www.pixiv.net/artworks/77996773#preview',];for (let j = 0; j < urls.length; j++) {for (let i = 0; i < PageType.PageTypeCount; i++) {if (Pages[i].CheckUrl(urls[j])) {console.log(urls[j]);console.log('[' + j + '] is ' + Pages[i].PageTypeString);}}}}/* ---------------------------------------- 预览 ---------------------------------------- */let autoLoadInterval = null;function PixivPreview() {// 最终需要显示的预览图ID,用于避免鼠标滑过多张图片时,最终显示的图片错误let previewTargetIllustId = '';// 开启预览功能function ActivePreview() {let returnMap = Pages[g_pageType].GetProcessedPageElements();if (!returnMap.loadingComplete) {DoLog(LogLevel.Error, 'Page not load, should not call Preview!');return;}// 鼠标进入$(returnMap.controlElements).mouseenter(function (e) {// 按住 Ctrl键 不显示预览图if (e.ctrlKey) {return;}let startTime = new Date().getTime();let delay = parseInt(g_settings.previewDelay == null ? g_defaultSettings.previewDelay : g_settings.previewDelay);let _this = $(this);let illustId = _this.attr('illustId');let illustType = _this.attr('illustType');let pageCount = _this.attr('pageCount');if (illustId == null) {DoLog(LogLevel.Error, 'Can not found illustId in this element\'s attrbutes.');return;}if (illustType == null) {DoLog(LogLevel.Error, 'Can not found illustType in this element\'s attrbutes.');return;}if (pageCount == null) {DoLog(LogLevel.Error, 'Can not found pageCount in this element\'s attrbutes.');return;}previewTargetIllustId = illustId;// 鼠标位置g_mousePos = { x: e.pageX, y: e.pageY };// 预览 Divlet previewDiv = $(document.createElement('div')).addClass('pp-main').attr('illustId', illustId).css({'position': 'absolute', 'z-index': '999999', 'left': g_mousePos.x + 'px', 'top': g_mousePos.y + 'px','border-style': 'solid', 'border-color': '#6495ed', 'border-width': '2px', 'border-radius': '20px','width': '48px', 'height': '48px','background-image': 'url(https://pp-1252089172.cos.ap-chengdu.myqcloud.com/transparent.png)','display': 'none'});// 添加到 body$('.pp-main').remove();$('body').append(previewDiv);let waitTime = delay - (new Date().getTime() - startTime);if (waitTime > 0) {setTimeout(function() {previewDiv.show();}, waitTime);} else {previewDiv.show();}// 加载中图片let loadingImg = $(new Image()).addClass('pp-loading').attr('src', g_loadingImage).css({'position': 'absolute', 'border-radius': '20px',});previewDiv.append(loadingImg);// 要显示的预览图节点let loadImg = $(new Image()).addClass('pp-image').css({ 'height': '0px', 'width': '0px', 'display': 'none', 'border-radius': '20px' });previewDiv.append(loadImg);// 原图(笑脸)图标let originIcon = $(new Image()).addClass('pp-original').attr('src', 'https://source.pixiv.net/www/images/pixivcomic-favorite.png').css({ 'position': 'absolute', 'bottom': '5px', 'right': '5px', 'display': 'none' });previewDiv.append(originIcon);// 点击图标新网页打开原图originIcon.click(function () {window.open($(previewDiv).children('img')[1].src);});// 右上角张数标记let pageCountHTML = '<div class="pp-pageCount" style="display: flex;-webkit-box-align: center;align-items: center;box-sizing: border-box;margin-left: auto;height: 20px;color: rgb(255, 255, 255);font-size: 10px;line-height: 12px;font-weight: bold;flex: 0 0 auto;padding: 4px 6px;background: rgba(0, 0, 0, 0.32);border-radius: 10px;margin-top:5px;margin-right:5px;">\<svg viewBox="0 0 9 10" width="9" height="10" style="stroke: none;line-height: 0;font-size: 0px;fill: currentcolor;"><path d="M8,3 C8.55228475,3 9,3.44771525 9,4 L9,9 C9,9.55228475 8.55228475,10 8,10 L3,10 C2.44771525,10 2,9.55228475 2,9 L6,9 C7.1045695,9 8,8.1045695 8,7 L8,3 Z M1,1 L6,1 C6.55228475,1 7,1.44771525 7,2 L7,7 C7,7.55228475 6.55228475,8 6,8 L1,8 C0.44771525,8 0,7.55228475 0,7 L0,2 C0,1.44771525 0.44771525,1 1,1 Z"></path></svg><span style="margin-left:2px;" class="pp-page">0/0</span></div>';let pageCountDiv = $(pageCountHTML).css({ 'position': 'absolute', 'top': '0px', 'display': 'none', 'right': '0px', 'display': 'none' });previewDiv.append(pageCountDiv);$('.pp-main').mouseleave(function (e) {$(this).remove();});let url = '';if (illustType == 2) {// 动图let screenWidth = document.documentElement.clientWidth;let screenHeight = document.documentElement.clientHeight;previewDiv.get(0).innerHTML = '<iframe class="pp-iframe" style="width: 48px; height: 48px; display: none; border-radius: 20px;" src="https://www.pixiv.net/artworks/' + illustId + '#preview" />';previewDiv.append(loadingImg);} else {url = g_getArtworkUrl.replace('#id#', illustId);// 获取图片链接$.ajax(url, {method: 'GET',success: function (json) {DoLog(LogLevel.Info, 'Got artwork urls:');DoLog(LogLevel.Elements, json);if (json.error === true) {DoLog(LogLevel.Error, 'Server responsed an error: ' + json.message);return;}// 已经不需要显示这个预览图了,直接丢弃if (illustId != previewTargetIllustId) {DoLog(LogLevel.Info, 'Drop this preview request.');return;}let regular = [];let original = [];for (let i = 0; i < json.body.length; i++) {regular.push(json.body[i].urls.regular);original.push(json.body[i].urls.original);}DoLog(LogLevel.Info, 'Process urls complete.');DoLog(LogLevel.Elements, regular);DoLog(LogLevel.Elements, original);ViewImages(regular, 0, original, g_settings.original, illustId);},error: function (data) {DoLog(LogLevel.Error, 'Request image urls failed!');if (data) {DoLog(LogLevel.Elements, data);}}});}});// 鼠标移出图片$(returnMap.controlElements).mouseleave(function (e) {let _this = $(this);let illustId = _this.attr('illustId');let illustType = _this.attr('illustType');let pageCount = _this.attr('pageCount');let moveToElement = $(e.relatedTarget);let isMoveToPreviewElement = false;// 鼠标移动到预览图上while (true) {if (moveToElement.hasClass('pp-main') && moveToElement.attr('illustId') == illustId) {isMoveToPreviewElement = true;}if (moveToElement.parent().length < 1) {break;}moveToElement = moveToElement.parent();}if (!isMoveToPreviewElement) {// 非预览图上$('.pp-main').remove();}});// 鼠标移动,调整位置$(returnMap.controlElements).mousemove(function (e) {// Ctrl 和 中键 都可以禁止预览图移动,这样就可以单手操作了if (e.ctrlKey || e.buttons & 4) {return;}let screenWidth = document.documentElement.clientWidth;let screenHeight = document.documentElement.clientHeight;g_mousePos.x = e.pageX; g_mousePos.y = e.pageY;AdjustDivPosition();});// 这个页面有自动加载if (Pages[g_pageType].HasAutoLoad && autoLoadInterval == null) {autoLoadInterval = setInterval(ProcessAutoLoad, 1000);DoLog(LogLevel.Info, 'Auto load interval set.');}// 插一段回调函数window.PreviewCallback = PreviewCallback;DoLog(LogLevel.Info, 'Callback function was inserted.');DoLog(LogLevel.Elements, window.PreviewCallback);DoLog(LogLevel.Info, 'Preview enable succeed!');}// 关闭预览功能,不是给外部用的function DeactivePreview() {let returnMap = Pages[g_pageType].GetProcessedPageElements();if (!returnMap.loadingComplete) {DoLog(LogLevel.Error, 'Page not load, should not call Preview!');return;}// 只需要取消绑定事件, attrs 以及回调都不需要删除$(returnMap.controlElements).unbind('mouseenter').unbind('mouseleave').unbind('mousemove');if (autoLoadInterval) {clearInterval(autoLoadInterval);autoLoadInterval = null;}DoLog(LogLevel.Info, 'Preview disable succeed!');}// iframe 的回调函数function PreviewCallback(canvasWidth, canvasHeight) {DoLog(LogLevel.Info, 'iframe callback, width: ' + canvasWidth + ', height: ' + canvasHeight);let size = AdjustDivPosition();$('.pp-loading').hide();$('.pp-iframe').css({ 'width': size.width, 'height': size.height }).show();}// 调整预览 Div 的位置function AdjustDivPosition() {// 鼠标到预览图的距离let fromMouseToDiv = 30;let screenWidth = document.documentElement.clientWidth;let screenHeight = document.documentElement.clientHeight;let left = 0;let top = document.body.scrollTop + document.documentElement.scrollTop;let width = 0, height = 0;if ($('.pp-main').find('iframe').length > 0) {let iframe = $('.pp-main').find('iframe').get(0);if (iframe.contentWindow.GetCanvasSize) {let canvasSize = iframe.contentWindow.GetCanvasSize();width = canvasSize.width;height = canvasSize.height;} else {width = 0;height = 0;}} else {$('.pp-image').css({ 'width': '', 'height': '' });width = $('.pp-image').get(0) == null ? 0 : $('.pp-image').get(0).width;height = $('.pp-image').get(0) == null ? 0 : $('.pp-image').get(0).height;}let isShowOnLeft = g_mousePos.x > screenWidth / 2;let newWidth = 48, newHeight = 48;if (width > 0 && height > 0) {newWidth = isShowOnLeft ? g_mousePos.x - fromMouseToDiv : screenWidth - g_mousePos.x - fromMouseToDiv;newHeight = height / width * newWidth;// 高度不足以完整显示,只能让两侧留空了if (newHeight > screenHeight) {newHeight = screenHeight;newWidth = newHeight / height * width;}newWidth -= 5;newHeight -= 5;// 设置新的宽高if ($('.pp-main').find('iframe').length > 0) {let iframe = $('.pp-main').find('iframe');iframe.get(0).contentWindow.ResizeCanvas(newWidth, newHeight);iframe.css({ 'width': newWidth, 'height': newHeight });}else {$('.pp-image').css({ 'height': newHeight + 'px', 'width': newWidth + 'px' });}// 调整下一次 loading 出现的位置$('.pp-loading').css({ 'left': newWidth / 2 - 24 + 'px', 'top': newHeight / 2 - 24 + 'px' });}// 图片宽度大于高度很多时,会显示在页面顶部,鼠标碰不到,把它移动到下面if (top + newHeight <= g_mousePos.y) {top = (g_mousePos.y - newHeight - fromMouseToDiv);}// 调整DIV的位置left = isShowOnLeft ? g_mousePos.x - newWidth - fromMouseToDiv : g_mousePos.x + fromMouseToDiv;$('.pp-main').css({ 'left': left + 'px', 'top': top + 'px', 'width': newWidth, 'height': newHeight });// 返回新的宽高return {width: newWidth,height: newHeight,};}// 请求显示的预览图IDlet displayTargetIllustId = '';// 显示预览图function ViewImages(regular, index, original, isShowOriginal, illustId) {displayTargetIllustId = illustId;if (!regular || regular.length === 0) {DoLog(LogLevel.Error, 'Regular url array is null, can not view images!');return;}if (index == null || index < 0 || index >= regular.length) {DoLog(LogLevel.Error, 'Index(' + index + ') out of range, can not view images!');return;}if (original == null || original.length === 0) {DoLog(LogLevel.Warning, 'Original array is null, replace it with regular array.');original = regular;}if (original.length < regular) {DoLog(LogLevel.Warning, 'Original array\'s length is less than regular array, replace it with regular array.');original = regular;}if (isShowOriginal == null) {isShowOriginal = false;}if (original.length > 1) {$('.pp-page').text((index + 1) + '/' + regular.length);$('.pp-pageCount').show();}if (isShowOriginal) {$('.pp-image').addClass('original');} else {$('.pp-image').removeClass('original');}g_settings.original = isShowOriginal ? 1 : 0;// 隐藏页数和原图标签$('.pp-original, .pp-pageCount').hide();// 第一次需要绑定事件if ($('.pp-image').attr('index') == null || $('.pp-image').attr('pageCount') != regular.length) {$('.pp-image').attr('pageCount', regular.length);// 绑定点击事件,Ctrl+左键 单击切换原图$('.pp-image').on('click', function (ev) {let _this = $(this);let isOriginal = _this.hasClass('original');let index = _this.attr('index');if (index == null) {index = 0;} else {index = parseInt(index);}if (ev.ctrlKey) {// 按住 Ctrl 来回切换原图isOriginal = !isOriginal;ViewImages(regular, index, original, isOriginal, illustId);}else if (ev.shiftKey) {// 按住 Shift 点击图片新标签页打开原图window.open(original[index]);} else {if (regular.length == 1) {return;}// 如果是多图,点击切换下一张if (++index >= regular.length) {index = 0;}ViewImages(regular, index, original, isOriginal, illustId);// 预加载for (let i = index + 1; i < regular.length && i <= index + 3; i++) {let image = new Image();image.src = isOriginal ? original[i] : regular[i];;}}});// 图片预加载完成$('.pp-image').on('load', function () {// 显示图片前也判断一下是不是目标图片if (displayTargetIllustId != previewTargetIllustId) {DoLog(LogLevel.Info, '(2)Drop this preview request.');return;}// 调整图片位置和大小let _this = $(this);let size = AdjustDivPosition();let isShowOriginal = _this.hasClass('original');$('.pp-loading').css('display', 'none');// 显示图像、页数、原图标签$('.pp-image').css('display', '');if (regular.length > 1) {$('.pp-pageCount').show();}if (isShowOriginal) {$('.pp-original').show();}// 预加载for (let i = index + 1; i < regular.length && i <= index + 3; i++) {let image = new Image();image.src = isShowOriginal ? original[i] : regular[i];;}}).on('error', function () {DoLog(LogLevel.Error, 'Load image failed!');});}$('.pp-image').attr('src', isShowOriginal ? original[index] : regular[index]).attr('index', index);}// 处理自动加载function ProcessAutoLoad() {if (Pages[g_pageType].GetProcessedPageElements() == null) {DoLog(LogLevel.Error, 'Call ProcessPageElements first!');return;}let oldReturnMap = Pages[g_pageType].GetProcessedPageElements();let newReturnMap = Pages[g_pageType].ProcessPageElements();if (newReturnMap.loadingComplete) {if (oldReturnMap.controlElements.length < newReturnMap.controlElements.length || newReturnMap.forceUpdate) {DoLog(LogLevel.Info, 'Page loaded ' + (newReturnMap.controlElements.length - oldReturnMap.controlElements.length) + ' new work(s).');if (g_settings.linkBlank) {$(newReturnMap.controlElements).find('a').attr('target', '_blank');}SetTargetBlank(newReturnMap);DeactivePreview();ActivePreview();return;} else if (oldReturnMap.controlElements.length > newReturnMap.controlElements.length) {DoLog(LogLevel.Warning, 'works become less?');Pages[g_pageType].private.returnMap = oldReturnMap;return;}}DoLog(LogLevel.Info, 'Page not change.');}// 开启预览ActivePreview();}/* ---------------------------------------- 排序 ---------------------------------------- */let imageElementTemplate = null;function PixivSK(callback) {// 不合理的设定if (g_settings.pageCount < 1 || g_settings.favFilter < 0) {g_settings.pageCount = 1;g_settings.favFilter = 0;}// 当前已经取得的页面数量let currentGettingPageCount = 0;// 当前加载的页面 URLlet currentUrl = 'https://www.pixiv.net/ajax/search/';// 当前加载的是第几张页面let currentPage = 0;// 获取到的作品let works = [];// 仅搜索页启用if (g_pageType != PageType.Search) {return;}// 获取第 currentPage 页的作品let getWorks = function (onloadCallback) {$('#progress').text(Texts[g_language].sort_getWorks.replace('%1', currentGettingPageCount + 1).replace('%2', g_settings.pageCount));let url = currentUrl.replace(/p=\d+/, 'p=' + currentPage);if (location.href.indexOf('?') != -1) {let param = location.href.split('?')[1];param = param.replace(/^p=\d+/, '');param = param.replace(/&p=\d+/, '');url += '&' + param;}if (url.indexOf('order=') == -1) {url += '&order=date_d';}if (url.indexOf('mode=') == -1) {url += '&mode=all';}if (url.indexOf('s_mode=') == -1) {url += '&s_mode=s_tag_full';}DoLog(LogLevel.Info, 'getWorks url: ' + url);let req = new XMLHttpRequest();req.open('GET', url, true);req.onload = function (event) {onloadCallback(req);};req.onerror = function (event) {DoLog(LogLevel.Error, 'Request search page error!');};req.send(null);};function getFollowingOfType(user_id, type, offset) {return new Promise(function(resolve, reject) {if (offset == null) {offset = 0;}let limit = 100;let following_show = [];$.ajax('https://www.pixiv.net/ajax/user/' + user_id + '/following?offset=' + offset + '&limit=' + limit + '&rest=' + type, {async: true,success: function(data) {if (data == null || data.error) {DoLog(LogLevel.Error, 'Following response contains an error.');resolve([]);return;}if (data.body.users.length == 0) {resolve([]);return;}$.each(data.body.users, function(i, user) {following_show.push(user.userId);});getFollowingOfType(user_id, type, offset + limit).then(function(members) {resolve(following_show.concat(members));return;});},error: function() {DoLog(LogLevel.Error, 'Request following failed.');resolve([]);}});});}function getFollowingOfCurrentUser() {return new Promise(function(resolve, reject) {let user_id = '';try {user_id = dataLayer[0].user_id;} catch(ex) {DoLog(LogLevel.Error, 'Get user id failed.');resolve([]);return;}// show/hide$('#progress').text(Texts[g_language].sort_getPublicFollowing);// 首先从Cookie读取let following = GetCookie('followingOfUid-' + user_id);if (following != null) {resolve(following);return;}getFollowingOfType(user_id, 'show').then(function(members) {$('#progress').text(Texts[g_language].sort_getPrivateFollowing);getFollowingOfType(user_id, 'hide').then(function(members2) {let following = members.concat(members2);SetCookie('followingOfUid-' + user_id, following, 1);resolve(following);});});});}// 筛选已关注画师作品let filterByUser = function() {return new Promise(function(resolve, reject) {if (!g_settings.hideFollowed) {resolve();}getFollowingOfCurrentUser().then(function(members) {let tempWorks = [];let hideWorkCount = 0;$(works).each(function (i, work) {let found = false;for (let i = 0; i < members.length; i++) {if (members[i] == work.userId) {found = true;break;}}if (!found) {tempWorks.push(work);} else {hideWorkCount++;}});works = tempWorks;DoLog(LogLevel.Info, hideWorkCount + ' works were hide.');DoLog(LogLevel.Elements, works);resolve();});});};// 排序和筛选let filterAndSort = function () {return new Promise(function(resolve, reject) {DoLog(LogLevel.Info, 'Start sort.');DoLog(LogLevel.Elements, works);// 收藏量低于 FAV_FILTER 的作品不显示let text = Texts[g_language].sort_filtering.replace('%2', g_settings.favFilter);text = text.replace('%1', (g_settings.hideFavorite ? Texts[g_language].sort_filteringHideFavorite : ''));$('#progress').text(text); // 实际上这个太快完全看不到let tmp = [];$(works).each(function (i, work) {let bookmarkCount = work.bookmarkCount ? work.bookmarkCount : 0;if (bookmarkCount >= g_settings.favFilter && !(g_settings.hideFavorite && work.bookmarkData)) {tmp.push(work);}});works = tmp;filterByUser().then(function() {// 排序works.sort(function (a, b) {let favA = a.bookmarkCount;let favB = b.bookmarkCount;if (!favA) {favA = 0;}if (!favB) {favB = 0;}if (favA > favB) {return -1;}if (favA < favB) {return 1;}return 0;});DoLog(LogLevel.Info, 'Sort complete.');DoLog(LogLevel.Elements, works);resolve();});});};if (currentPage === 0) {let url = location.href;if (url.indexOf('&p=') == -1 && url.indexOf('?p=') == -1) {DoLog(LogLevel.Warning, 'Can not found page in url.');if (url.indexOf('?') == -1) {url += '?p=1';DoLog(LogLevel.Info, 'Add "?p=1": ' + url);} else {url += '&p=1';DoLog(LogLevel.Info, 'Add "&p=1": ' + url);}}let wordMatch = url.match(/\/tags\/([^/]*)\//);let searchWord = '';if (wordMatch) {DoLog(LogLevel.Info, 'Search key word: ' + searchWord);searchWord = wordMatch[1];} else {DoLog(LogLevel.Error, 'Can not found search key word!');return;}// pagelet page = url.match(/p=(\d*)/)[1];currentPage = parseInt(page);DoLog(LogLevel.Info, 'Current page: ' + currentPage);let type = url.match(/tags\/.*\/(.*)[?$]/)[1];currentUrl += type + '/';currentUrl += searchWord + '?word=' + searchWord + '&p=' + currentPage;DoLog(LogLevel.Info, 'Current url: ' + currentUrl);} else {DoLog(LogLevel.Error, '???');}let imageContainer = Pages[PageType.Search].GetImageListContainer();// loading$(imageContainer).hide().before('<div id="loading" style="width:100%;text-align:center;"><img src="' + g_loadingImage + '" /><p id="progress" style="text-align: center;font-size: large;font-weight: bold;padding-top: 10px;">0%</p></div>');// pageif (true) {let pageSelectorDiv = Pages[PageType.Search].GetPageSelector();if (pageSelectorDiv == null) {DoLog(LogLevel.Error, 'Can not found page selector!');return;}if ($(pageSelectorDiv).find('a').length > 2) {let pageButton = $(pageSelectorDiv).find('a').get(1);let newPageButtons = [];let pageButtonString = 'Previewer';for (let i = 0; i < 9; i++) {let newPageButton = pageButton.cloneNode(true);$(newPageButton).find('span').text(pageButtonString[i]);newPageButtons.push(newPageButton);}$(pageSelectorDiv).find('button').remove();while ($(pageSelectorDiv).find('a').length > 2) {$(pageSelectorDiv).find('a:first').next().remove();}for (let i = 0; i < 9; i++) {$(pageSelectorDiv).find('a:last').before(newPageButtons[i]);}$(pageSelectorDiv).find('a').attr('href', 'javascript:;');let pageUrl = location.href;if (pageUrl.indexOf('&p=') == -1 && pageUrl.indexOf('?p=') == -1) {if (pageUrl.indexOf('?') == -1) {pageUrl += '?p=1';} else {pageUrl += '&p=1';}}let prevPageUrl = pageUrl.replace(/p=\d+/, 'p=' + (currentPage - g_settings.pageCount > 1 ? currentPage - g_settings.pageCount : 1));let nextPageUrl = pageUrl.replace(/p=\d+/, 'p=' + (currentPage + g_settings.pageCount));DoLog(LogLevel.Info, 'Previous page url: ' + prevPageUrl);DoLog(LogLevel.Info, 'Next page url: ' + nextPageUrl);// 重新插入一遍清除事件绑定let prevButton = $(pageSelectorDiv).find('a:first');prevButton.before(prevButton.clone());prevButton.remove();let nextButton = $(pageSelectorDiv).find('a:last');nextButton.before(nextButton.clone());nextButton.remove();$(pageSelectorDiv).find('a:first').attr('href', prevPageUrl).addClass('pp-prevPage');$(pageSelectorDiv).find('a:last').attr('href', nextPageUrl).addClass('pp-nextPage');}let onloadCallback = function (req) {let no_artworks_found = false;try {let json = JSON.parse(req.responseText);if (json.hasOwnProperty('error')) {if (json.error === false) {let data;if (json.body.illustManga) {data = json.body.illustManga.data;} else if (json.body.manga) {data = json.body.manga.data;} else if (json.body.illust) {data = json.body.illust.data;}if (data.length > 0) {works = works.concat(data);} else {no_artworks_found = true;}} else {DoLog(LogLevel.Error, 'ajax error!');return;}} else {DoLog(LogLevel.Error, 'Key "error" not found!');return;}} catch (e) {DoLog(LogLevel.Error, 'A invalid json string!');DoLog(LogLevel.Info, req.responseText);}currentPage++;currentGettingPageCount++;// 后面已经没有作品了if (no_artworks_found) {DoLog(LogLevel.Warning, 'No artworks found, ignore ' + (g_settings.pageCount - currentGettingPageCount) + ' pages.');currentPage += g_settings.pageCount - currentGettingPageCount;currentGettingPageCount = g_settings.pageCount;}// 设定数量的页面加载完成if (currentGettingPageCount == g_settings.pageCount) {DoLog(LogLevel.Info, 'Load complete, start to load bookmark count.');DoLog(LogLevel.Elements, works);// 获取到的作品里面可能有广告,先删掉,否则后面一些处理需要做判断let tempWorks = [];let workIdsSet = new Set();for (let i = 0; i < works.length; i++) {if (works[i].id && !workIdsSet.has(works[i].id)) {tempWorks.push(works[i]);workIdsSet.add(works[i].id);}}works = tempWorks;DoLog(LogLevel.Info, 'Clear ad container complete.');DoLog(LogLevel.Elements, works);GetBookmarkCount(0);} else {getWorks(onloadCallback);}};getWorks(onloadCallback);}let xhrs = [];let currentRequestGroupMinimumIndex = 0;function FillXhrsArray() {xhrs.length = 0;let onloadFunc = function (event) {let json = null;try {json = JSON.parse(event.currentTarget.responseText);} catch(e) {DoLog(LogLevel.Error, 'Parse json failed!');DoLog(LogLevel.Element, e);return;}if (json) {let illustId = '';let illustIdMatched = event.currentTarget.responseURL.match(/illust_id=(\d+)/);if (illustIdMatched) {illustId = illustIdMatched[1];} else {DoLog(LogLevel.Error, 'Can not get illust id from url!');return;}let indexOfThisRequest = -1;for (let j = 0; j < g_maxXhr; j++) {if (xhrs[j].illustId == illustId) {indexOfThisRequest = j;break;}}if (indexOfThisRequest == -1) {DoLog(LogLevel.Error, 'This url not match any request!');return;}xhrs[indexOfThisRequest].complete = true;if (!json.error) {let bookmarkCount = json.body.illust_details.bookmark_user_total;works[currentRequestGroupMinimumIndex + indexOfThisRequest].bookmarkCount = parseInt(bookmarkCount);DoLog(LogLevel.Info, 'IllustId: ' + illustId + ', bookmarkCount: ' + bookmarkCount);} else {DoLog(LogLevel.Error, 'Some error occured: ' + json.message);}let completeCount = 0;// 真实完成数(不包含没有发起请求的XHR,最后一批请求时)let completeReally = 0;for (let j = 0; j < g_maxXhr; j++) {if (xhrs[j].complete) {completeCount++;if (xhrs[j].illustId != '') {completeReally++;}}}$('#loading').find('#progress').text(Texts[g_language].sort_getBookmarkCount.replace('%1', currentRequestGroupMinimumIndex + completeReally).replace('%2', works.length));if (completeCount == g_maxXhr) {currentRequestGroupMinimumIndex += g_maxXhr;GetBookmarkCount(currentRequestGroupMinimumIndex);}}};let onerrorFunc = function (event) {let illustId = '';let illustIdMatched = event.currentTarget.__sentry_xhr__.url.match(/artworks\/(\d+)/);if (illustIdMatched) {illustId = illustIdMatched[1];} else {DoLog(LogLevel.Error, 'Can not get illust id from url!');return;}DoLog(LogLevel.Error, 'Send request failed, set this illust(' + illustId + ')\'s bookmark count to 0!');let indexOfThisRequest = -1;for (let j = 0; j < g_maxXhr; j++) {if (xhrs[j].illustId == illustId) {indexOfThisRequest = j;break;}}if (indexOfThisRequest == -1) {DoLog('This url not match any request!');return;}xhrs[indexOfThisRequest].complete = true;let completeCount = 0;let completeReally = 0;for (let j = 0; j < g_maxXhr; j++) {if (xhrs[j].complete) {completeCount++;if (xhrs[j].illustId != '') {completeReally++;}}}$('#loading').find('#progress').text(Texts[g_language].sort_getBookmarkCount.replace('%1', currentRequestGroupMinimumIndex + completeReally).replace('%2', works.length));if (completeCount == g_maxXhr) {GetBookmarkCount(currentRequestGroupMinimumIndex + g_maxXhr);}};for (let i = 0; i < g_maxXhr; i++) {xhrs.push({xhr: new XMLHttpRequest(),illustId: '',complete: false,});xhrs[i].xhr.onload = onloadFunc;xhrs[i].xhr.onerror = onerrorFunc;}}let GetBookmarkCount = function (index) {if (index >= works.length) {clearAndUpdateWorks();return;}if (xhrs.length === 0) {FillXhrsArray();}for (let i = 0; i < g_maxXhr; i++) {if (index + i >= works.length) {xhrs[i].complete = true;xhrs[i].illustId = '';continue;}let illustId = works[index + i].id;let url = 'https://www.pixiv.net/touch/ajax/illust/details?illust_id=' + illustId;xhrs[i].illustId = illustId;xhrs[i].complete = false;xhrs[i].xhr.open('GET', url, true);xhrs[i].xhr.send(null);}};/*li-div--div---div----div-----div------a-------div: 多图标签、R18标签-------div: 里面是 img (以及 svg 动图标签)------div: 里面是 like 相关的元素---a: 作品标题,跳转链接---div: 作者头像和昵称*/let clearAndUpdateWorks = function () {filterAndSort().then(function() {let container = Pages[PageType.Search].GetImageListContainer();let firstImageElement = Pages[PageType.Search].GetFirstImageElement();if (imageElementTemplate == null) {imageElementTemplate = firstImageElement.cloneNode(true);// 清理模板// imagelet img = $($(imageElementTemplate).find('img').get(0));let imageDiv = img.parent();let imageLink = imageDiv.parent();let imageLinkDiv = imageLink.parent();let titleLinkParent = imageLinkDiv.parent().next();if (img == null || imageDiv == null || imageLink == null || imageLinkDiv == null || titleLinkParent == null) {DoLog(LogLevel.Error, 'Can not found some elements!');}let titleLink = $('<a></a>');if (titleLinkParent.children().length == 0) {titleLinkParent.append(titleLink);} else {titleLink = titleLinkParent.children('a:first');}// authorlet authorDiv = titleLinkParent.next();let authorLinkProfileImage = authorDiv.find('a:first');let authorLink = authorDiv.find('a:last');let authorName = authorLink;let authorImage = $(authorDiv.find('img').get(0));// otherslet bookmarkDiv = imageLink.next();let bookmarkSvg = bookmarkDiv.find('svg');let additionTagDiv = imageDiv.prev();let animationTag = imageDiv.find('svg');let bookmarkCountDiv = additionTagDiv.clone();bookmarkCountDiv.css({ 'top': 'auto', 'bottom': '0px', 'width': '50%' });additionTagDiv.parent().append(bookmarkCountDiv);// 添加 class,方便后面修改内容img.addClass('ppImg');imageLink.addClass('ppImageLink');//if (titleLink.get(0).tagName == 'A') {titleLink.addClass('ppTitleLink');//} else {// titleLink.append('<a class="ppTitleLink"></a>');//}authorLinkProfileImage.addClass('ppAuthorLinkProfileImage');authorLink.addClass('ppAuthorLink');authorName.addClass('ppAuthorName');authorImage.addClass('ppAuthorImage');bookmarkSvg.attr('class', bookmarkSvg.attr('class') + ' ppBookmarkSvg');additionTagDiv.addClass('ppAdditionTag');bookmarkCountDiv.addClass('ppBookmarkCount');img.attr('src', '');additionTagDiv.empty();bookmarkCountDiv.empty();animationTag.remove();bookmarkSvg.find('path:first').css('fill', 'rgb(31, 31, 31)');bookmarkSvg.find('path:last').css('fill', 'rgb(255, 255, 255)');if (g_settings.linkBlank) {imageLink.attr('target', '_blank');titleLink.attr('target', '_blank');authorLinkProfileImage.attr('target', '_blank');authorLink.attr('target', '_blank');}}$(container).empty();for (let i = 0; i < works.length; i++) {let li = $(imageElementTemplate.cloneNode(true));let regularUrl = works[i].url;if (g_settings.fullSizeThumb) {regularUrl = convertThumbUrlToSmall(works[i].url);}li.find('.ppImg').attr('src', regularUrl).css('object-fit', 'contain');li.find('.ppImageLink').attr('href', '/artworks/' + works[i].id);li.find('.ppTitleLink').attr('href', '/artworks/' + works[i].id).text(works[i].title);li.find('.ppAuthorLink, .ppAuthorLinkProfileImage').attr('href', '/member.php?id=' + works[i].userId).attr({'userId': works[i].userId, 'profileImageUrl': works[i].profileImageUrl, 'userName': works[i].userName});li.find('.ppAuthorName').text(works[i].userName);li.find('.ppAuthorImage').attr('src', works[i].profileImageUrl);li.find('.ppBookmarkSvg').attr('illustId', works[i].id);if (works[i].bookmarkData) {li.find('.ppBookmarkSvg').find('path').css('fill', 'rgb(255, 64, 96)');li.find('.ppBookmarkSvg').attr('bookmarkId', works[i].bookmarkData.id);}if (works[i].xRestrict !== 0) {let R18HTML = '<div style="margin-top: 2px; margin-left: 2px;"><div style="color: rgb(255, 255, 255);font-weight: bold;font-size: 10px;line-height: 1;padding: 3px 6px;border-radius: 3px;background: rgb(255, 64, 96);">R-18</div></div>';li.find('.ppAdditionTag').append(R18HTML);}if (works[i].pageCount > 1) {let pageCountHTML = '<div style="display: flex;-webkit-box-align: center;align-items: center;box-sizing: border-box;margin-left: auto;height: 20px;color: rgb(255, 255, 255);font-size: 10px;line-height: 12px;font-weight: bold;flex: 0 0 auto;padding: 4px 6px;background: rgba(0, 0, 0, 0.32);border-radius: 10px;">\<svg viewBox="0 0 9 10" width="9" height="10" style="stroke: none;line-height: 0;font-size: 0px;fill: currentcolor;"><path d="M8,3 C8.55228475,3 9,3.44771525 9,4 L9,9 C9,9.55228475 8.55228475,10 8,10 L3,10 C2.44771525,10 2,9.55228475 2,9 L6,9 C7.1045695,9 8,8.1045695 8,7 L8,3 Z M1,1 L6,1 C6.55228475,1 7,1.44771525 7,2 L7,7 C7,7.55228475 6.55228475,8 6,8 L1,8 C0.44771525,8 0,7.55228475 0,7 L0,2 C0,1.44771525 0.44771525,1 1,1 Z"></path></svg><span style="margin-left: 2px;">' + works[i].pageCount + '</span></div>';li.find('.ppAdditionTag').append(pageCountHTML);}let bookmarkCountHTML = '<div style="margin-bottom: 6px; margin-left: 2px;"><div style="color: rgb(7, 95, 166);font-weight: bold;font-size: 13px;line-height: 1;padding: 3px 6px;border-radius: 3px;background: rgb(204, 236, 255);">' + works[i].bookmarkCount + ' likes</div></div>';li.find('.ppBookmarkCount').append(bookmarkCountHTML);if (works[i].illustType == 2) {let animationHTML = '<svg viewBox="0 0 24 24" style="width: 48px; height: 48px;stroke: none;fill: rgb(255, 255, 255);line-height: 0;font-size: 0px;vertical-align: middle;position:absolute;"><circle cx="12" cy="12" r="10" style="fill: rgb(0, 0, 0);fill-opacity: 0.4;"></circle><path d="M9,8.74841664 L9,15.2515834 C9,15.8038681 9.44771525,16.2515834 10,16.2515834 C10.1782928,16.2515834 10.3533435,16.2039156 10.5070201,16.1135176 L16.0347118,12.8619342 C16.510745,12.5819147 16.6696454,11.969013 16.3896259,11.4929799 C16.3034179,11.3464262 16.1812655,11.2242738 16.0347118,11.1380658 L10.5070201,7.88648243 C10.030987,7.60646294 9.41808527,7.76536339 9.13806578,8.24139652 C9.04766776,8.39507316 9,8.57012386 9,8.74841664 Z"></path></svg>';li.find('.ppImg').after(animationHTML);}$(container).append(li);}// 监听加入书签点击事件,监听父节点,但是按照 <svg> 节点处理$('.ppBookmarkSvg').parent().on('click', function (ev) {if (g_csrfToken == '') {DoLog(LogLevel.Error, 'No g_csrfToken, failed to add bookmark!');alert('获取 Token 失败,无法添加,请到详情页操作。');return;}// 非公开收藏let restrict = 0;if (ev.ctrlKey) {restrict = 1;}let _this = $(this).children('svg:first');let illustId = _this.attr('illustId');let bookmarkId = _this.attr('bookmarkId');if (bookmarkId == null || bookmarkId == '') {DoLog(LogLevel.Info, 'Add bookmark, illustId: ' + illustId);$.ajax('/ajax/illusts/bookmarks/add', {method: 'POST',contentType: 'application/json;charset=utf-8',headers: { 'x-csrf-token': g_csrfToken },data: '{"illust_id":"' + illustId + '","restrict":' +restrict + ',"comment":"","tags":[]}',success: function (data) {DoLog(LogLevel.Info, 'addBookmark r###lt: ');DoLog(LogLevel.Elements, data);if (data.error) {DoLog(LogLevel.Error, 'Server returned an error: ' + data.message);return;}let bookmarkId = data.body.last_bookmark_id;DoLog(LogLevel.Info, 'Add bookmark success, bookmarkId is ' + bookmarkId);_this.attr('bookmarkId', bookmarkId);_this.find('path').css('fill', 'rgb(255, 64, 96)');}});} else {DoLog(LogLevel.Info, 'Delete bookmark, bookmarkId: ' + bookmarkId);$.ajax('/rpc/index.php', {method: 'POST',headers: { 'x-csrf-token': g_csrfToken },data: { "mode": "delete_illust_bookmark", "bookmark_id": bookmarkId },success: function (data) {DoLog(LogLevel.Info, 'addBookmark r###lt: ');DoLog(LogLevel.Elements, data);if (data.error) {DoLog(LogLevel.Error, 'Server returned an error: ' + data.message);return;}DoLog(LogLevel.Info, 'Delete bookmark success.');_this.attr('bookmarkId', '');_this.find('path:first').css('fill', 'rgb(31, 31, 31)');_this.find('path:last').css('fill', 'rgb(255, 255, 255)');}});}_this.parent().focus();});$('.ppAuthorLink').on('mouseenter', function(e){let _this = $(this);function getOffset(e) {if (e.offsetParent) {let offset = getOffset(e.offsetParent);return {offsetTop: e.offsetTop + offset.offsetTop,offsetLeft: e.offsetLeft + offset.offsetLeft,};} else {return {offsetTop: e.offsetTop,offsetLeft: e.offsetLeft,};}}let isFollowed = false;$.ajax('https://www.pixiv.net/ajax/user/' + _this.attr('userId') + '?full=1', {method: 'GET',async: false,success: function(data) {if (data.error == false && data.body.isFollowed) {isFollowed = true;}},});$('.pp-authorDiv').remove();let pres = $('<div class="pp-authorDiv"><div class="ppa-main" style="position: absolute; top: 0px; left: 0px; border-width: 1px; border-style: solid; z-index: 1; border-color: rgba(0, 0, 0, 0.08); border-radius: 8px;"><div class=""style=" width: 336px; background-color: rgb(255, 255, 255); padding-top: 24px; flex-flow: column;"><div class=""style=" display: flex; align-items: center; flex-flow: column;"><a class="ppa-authorLink"><div role="img"size="64"class=""style=" display: inline-block; width: 64px; height: 64px; border-radius: 50%; overflow: hidden;"><img class="ppa-authorImage" width="64"height="64"style="object-fit: cover; object-position: center top;"></div></a><a class="ppa-authorLink"><div class="ppa-authorName" style=" line-height: 24px; font-size: 16px; font-weight: bold; margin: 4px 0px 0px;"></div></a><div class=""style=" margin: 12px 0px 24px;"><button type="button"class="ppa-follow"style=" padding: 9px 25px; line-height: 1; border: none; border-radius: 16px; font-weight: 700; background-color: #0096fa; color: #fff; cursor: pointer;"><span style="margin-right: 4px;"><svg viewBox="0 0 8 8"width="10"height="10"class=""style=" stroke: rgb(255, 255, 255); stroke-linecap: round; stroke-width: 2;"><line x1="1"y1="4"x2="7"y2="4"></line><line x1="4"y1="1"x2="4"y2="7"></line></svg></span>关注</button></div></div></div></div></div>');$('body').append(pres);let offset = getOffset(this);pres.find('.ppa-main').css({'top': offset.offsetTop - 196 + 'px', 'left': offset.offsetLeft - 113 + 'px'});pres.find('.ppa-authorLink').attr('href', '/member.php?id=' + _this.attr('userId'));pres.find('.ppa-authorImage').attr('src', _this.attr('profileImageUrl'));pres.find('.ppa-authorName').text(_this.attr('userName'));if (isFollowed) {pres.find('.ppa-follow').get(0).outerHTML = '<button type="button" class="ppa-follow followed" data-click-action="click" data-click-label="follow" style="padding: 9px 25px;line-height: 1;border: none;border-radius: 16px;font-size: 14px;font-weight: 700;cursor: pointer;">关注中</button>';}pres.find('.ppa-follow').attr('userId', _this.attr('userId'));pres.on('mouseleave', function(e) {$(this).remove();}).on('mouseenter', function() {$(this).addClass('mouseenter');});pres.find('.ppa-follow').on('click', function() {let userId = $(this).attr('userId');if ($(this).hasClass('followed')) {// 取关$.ajax('https://www.pixiv.net/rpc_group_setting.php', {method: 'POST',headers: { 'x-csrf-token': g_csrfToken },data: 'mode=del&type=bookuser&id=' + userId,success: function(data) {DoLog(LogLevel.Info, 'delete bookmark r###lt: ');DoLog(LogLevel.Elements, data);if (data.type == 'bookuser') {$('.ppa-follow').get(0).outerHTML = '<button type="button"class="ppa-follow"style=" padding: 9px 25px; line-height: 1; border: none; border-radius: 16px; font-weight: 700; background-color: #0096fa; color: #fff; cursor: pointer;"><span style="margin-right: 4px;"><svg viewBox="0 0 8 8"width="10"height="10"class=""style=" stroke: rgb(255, 255, 255); stroke-linecap: round; stroke-width: 2;"><line x1="1"y1="4"x2="7"y2="4"></line><line x1="4"y1="1"x2="4"y2="7"></line></svg></span>关注</button>';}else {DoLog(LogLevel.Error, 'Delete follow failed!');}}});} else {// 关注$.ajax('https://www.pixiv.net/bookmark_add.php', {method: 'POST',headers: {'x-csrf-token': g_csrfToken},data: 'mode=add&type=user&user_id=' + userId + '&tag=&restrict=0&format=json',success: function (data) {DoLog(LogLevel.Info, 'addBookmark r###lt: ');DoLog(LogLevel.Elements, data);// successif (data.length === 0) {$('.ppa-follow').get(0).outerHTML = '<button type="button" class="ppa-follow followed" data-click-action="click" data-click-label="follow" style="padding: 9px 25px;line-height: 1;border: none;border-radius: 16px;font-size: 14px;font-weight: 700;cursor: pointer;">关注中</button>';} else {DoLog(LogLevel.Error, 'Follow failed!');}}});}});}).on('mouseleave', function(e) {setTimeout(function() {if (!$('.pp-authorDiv').hasClass('mouseenter')) {$('.pp-authorDiv').remove();}}, 200);});if (works.length === 0) {$(container).show().get(0).outerHTML = '<div class=""style="display: flex;align-items: center;justify-content: center; height: 408px;flex-flow: column;"><div class=""style="margin-bottom: 12px;color: rgba(0, 0, 0, 0.16);"><svg viewBox="0 0 16 16"size="72"style="fill: currentcolor;height: 72px;vertical-align: middle;"><path d="M8.25739 9.1716C7.46696 9.69512 6.51908 10 5.5 10C2.73858 10 0.5 7.76142 0.5 5C0.5 2.23858 2.73858 0 5.5 0C8.26142 0 10.5 2.23858 10.5 5C10.5 6.01908 10.1951 6.96696 9.67161 7.75739L11.7071 9.79288C12.0976 10.1834 12.0976 10.8166 11.7071 11.2071C11.3166 11.5976 10.6834 11.5976 10.2929 11.2071L8.25739 9.1716ZM8.5 5C8.5 6.65685 7.15685 8 5.5 8C3.84315 8 2.5 6.65685 2.5 5C2.5 3.34315 3.84315 2 5.5 2C7.15685 2 8.5 3.34315 8.5 5Z"transform="translate(2.25 2.25)"fill-rule="evenodd"clip-rule="evenodd"></path></svg></div><span class="sc-LzMCO fLDUzU">' + Texts[g_language].sort_noWork + '</span></div>';}// 恢复显示$('#loading').remove();$(container).show();Pages[PageType.Search].ProcessPageElements();// 监听键盘的左右键,用来翻页$(document).keydown(function (e) {if (g_settings.pageByKey != 1) {return;}if (e.keyCode == 39) {let btn = $('.pp-nextPage');if (btn.length < 1 || btn.attr('hidden') == 'hidden') {return;}// 很奇怪不能用 click()location.href = btn.attr('href');} else if (e.keyCode == 37) {let btn = $('.pp-prevPage');if (btn.length < 1 || btn.attr('hidden') == 'hidden') {return;}location.href = btn.attr('href');}});if (callback) {callback();}});}};/* ---------------------------------------- 设置 ---------------------------------------- */function SetCookie(name, value, days) {let Days = 180;if (days) {Days = days;}let exp = new Date();exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);let str = JSON.stringify(value);document.cookie = name + "=" + str + ";expires=" + exp.toGMTString() + ';path=\/';}function GetCookie(name) {let arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");if (arr = document.cookie.match(reg)) {return unescape(arr[2]);}else {return null;}}function ShowInstallMessage() {$('#pp-bg').remove();let bg = $('<div id="pp-bg"></div>').css({'width': document.documentElement.clientWidth + 'px', 'height': document.documentElement.clientHeight + 'px', 'position': 'fixed','z-index': 999999, 'background-color': 'rgba(0,0,0,0.8)','left': '0px', 'top': '0px'});$('body').append(bg);bg.get(0).innerHTML = '<img id="pps-close"src="https://pp-1252089172.cos.ap-chengdu.myqcloud.com/Close.png"style="position: absolute; right: 35px; top: 20px; width: 32px; height: 32px; cursor: pointer;"><div style="position: absolute;width: 40%;left: 30%;top: 25%;font-size: 25px; text-align: center; color: white;">' + Texts[g_language].install_title + g_version + '</div><br>' + Texts[g_language].install_body;$('#pps-close').click(function () {$('#pp-bg').remove();});}function GetSettings() {let settings;let cookie = GetCookie('PixivPreview');// 新安装if (cookie == null || cookie == 'null') {settings = g_defaultSettings;SetCookie('PixivPreview', settings);ShowInstallMessage();} else {settings = JSON.parse(cookie);}// 升级if (settings.version != g_version) {ShowInstallMessage();}if (settings.version == null || settings.version != g_version) {settings.version = g_version;SetCookie('PixivPreview', settings);}return settings;}function ShowSetting() {let screenWidth = document.documentElement.clientWidth;let screenHeight = document.documentElement.clientHeight;$('#pp-bg').remove();let bg = $('<div id="pp-bg"></div>').css({'width': screenWidth + 'px', 'height': screenHeight + 'px', 'position': 'fixed','z-index': 999999, 'background-color': 'rgba(0,0,0,0.8)','left': '0px', 'top': '0px'});$('body').append(bg);let settings = GetSettings();let settingHTML = '<div style="color: white; font-size: 1em;">' +'<img id="pps-close" src="https://pp-1252089172.cos.ap-chengdu.myqcloud.com/Close.png" style="position: absolute; right: 35px; top: 20px; width: 32px; height: 32px; cursor: pointer;">' +'<div style="position: absolute; width: 60%; left: 25%; top: 10%; overflow: hidden;">' +'<ul id="pps-ul" style="list-style: none; padding: 0; margin: 0;"></ul></div>' +'<div style="margin-top: 10px;position: absolute;bottom: 20%;width: 100%;text-align: center;">' +'<button id="pps-save" style="font-size: 25px; border-radius: 12px; height: 48px; min-width: 138px; max-width: 150px; background-color: green; color: white; margin: 0 32px 0 32px; cursor: pointer; border: none;">' + Texts[g_language].setting_save + '</button>' +'<button id="pps-reset" style="font-size: 25px; border-radius: 12px; height: 48px; min-width: 138px; max-width: 150px; background-color: darkred; color: white; margin: 0 32px 0 32px; cursor: pointer; border: none;">' + Texts[g_language].setting_reset + '</button>' +'</div></div>';bg.get(0).innerHTML = settingHTML;let ul = $('#pps-ul');function getImageAction(id) {return '<img id="' + id + '" src="https://pp-1252089172.cos.ap-chengdu.myqcloud.com/On.png" style="height: 32px; cursor: pointer; margin-right: 20px; vertical-align: middle;"/>';}function getInputAction(id) {return '<input id="' + id + '" style="font-size: 24px; padding: 0; margin-right: 16px; border-width: 0px; width: 64px; text-align: center;"/>'}function getSelectAction(id) {return '<select id="' + id + '" style="font-size: 20px; margin-right: 10px;"></select>';}function addItem(action, text) {ul.append('<li style="font-size: 25px; padding-bottom: 5px;">' + action + text + '</li>');}ul.empty();addItem(getSelectAction('pps-lang'), Texts[g_language].setting_language);addItem(getImageAction('pps-preview'), Texts[g_language].setting_preview);addItem(getImageAction('pps-sort'), Texts[g_language].setting_sort);addItem(getImageAction('pps-anime'), Texts[g_language].setting_anime);addItem(getImageAction('pps-original'), Texts[g_language].setting_origin);addItem(getInputAction('pps-previewDelay'), Texts[g_language].setting_previewDelay);addItem('', ' ');addItem(getInputAction('pps-maxPage'), Texts[g_language].setting_maxPage);addItem(getInputAction('pps-hideLess'), Texts[g_language].setting_hideWork);addItem(getImageAction('pps-hideBookmarked'), Texts[g_language].setting_hideFav);addItem(getImageAction('pps-hideFollowed'), Texts[g_language].setting_hideFollowed + ' <button id="pps-clearFollowingCache" style="cursor:pointer;background-color:gold;border-radius:12px;" title="' + Texts[g_language].setting_clearFollowingCacheHelp + '">' + Texts[g_language].setting_clearFollowingCache + '</button>');addItem(getImageAction('pps-newTab'), Texts[g_language].setting_blank);addItem(getImageAction('pps-pageKey'), Texts[g_language].setting_turnPage);addItem(getImageAction('pps-fullSizeThumb'), Texts[g_language].sort_fullSizeThumb);let imgOn = 'https://pp-1252089172.cos.ap-chengdu.myqcloud.com/On.png';let imgOff = 'https://pp-1252089172.cos.ap-chengdu.myqcloud.com/Off.png'$('#pps-preview').attr('src', settings.enablePreview ? imgOn : imgOff).addClass(settings.enablePreview ? 'on' : 'off').css('cursor: pointer');$('#pps-sort').attr('src', settings.enableSort ? imgOn : imgOff).addClass(settings.enableSort ? 'on' : 'off').css('cursor: pointer');$('#pps-anime').attr('src', settings.enableAnimeDownload ? imgOn : imgOff).addClass(settings.enableAnimeDownload ? 'on' : 'off').css('cursor: pointer');$('#pps-original').attr('src', settings.original ? imgOn : imgOff).addClass(settings.original ? 'on' : 'off').css('cursor: pointer');$('#pps-previewDelay').val(settings.previewDelay == null ? g_defaultSettings.previewDelay : settings.previewDelay);$('#pps-maxPage').val(settings.pageCount == null ? g_defaultSettings.pageCount : settings.pageCount);$('#pps-hideLess').val(settings.favFilter == null ? g_defaultSettings.favFilter : settings.favFilter);$('#pps-hideBookmarked').attr('src', settings.hideFavorite ? imgOn : imgOff).addClass(settings.hideFavorite ? 'on' : 'off').css('cursor: pointer');$('#pps-hideFollowed').attr('src', settings.hideFollowed ? imgOn : imgOff).addClass(settings.hideFollowed ? 'on' : 'off').css('cursor: pointer');$('#pps-newTab').attr('src', settings.linkBlank ? imgOn : imgOff).addClass(settings.linkBlank ? 'on' : 'off').css('cursor: pointer');$('#pps-pageKey').attr('src', settings.pageByKey ? imgOn : imgOff).addClass(settings.pageByKey ? 'on' : 'off').css('cursor: pointer');$('#pps-fullSizeThumb').attr('src', settings.fullSizeThumb ? imgOn : imgOff).addClass(settings.fullSizeThumb ? 'on' : 'off').css('cursor: pointer');$('#pps-lang').append('<option value="-1">Auto</option>').append('<option value="' + Lang.zh_CN + '">简体中文</option>').append('<option value="' + Lang.en_US + '">English</option>').append('<option value="' + Lang.ru_RU + '">Русский язык</option>').val(g_settings.lang == undefined ? Lang.auto : g_settings.lang);$('#pps-ul').find('img').click(function () {let _this = $(this);if (_this.hasClass('on')) {_this.attr('src', imgOff).removeClass('on').addClass('off');} else {_this.attr('src', imgOn).removeClass('off').addClass('on');}});$('#pps-clearFollowingCache').click(function() {let user_id = dataLayer[0].user_id;SetCookie('followingOfUid-' + user_id, null, -1);alert(Texts[g_language].setting_followingCacheCleared);});$('#pps-save').click(function () {if ($('#pps-maxPage').val() === '') {$('#pps-maxPage').val(g_defaultSettings.pageCount);}if ($('#pps-hideLess').val() == '') {$('#pps-hideLess').val(g_defaultSettings.favFilter);}let settings = {'lang': $('#pps-lang').val(),'enablePreview': $('#pps-preview').hasClass('on') ? 1 : 0,'enableSort': $('#pps-sort').hasClass('on') ? 1 : 0,'enableAnimeDownload': $('#pps-anime').hasClass('on') ? 1 : 0,'original': $('#pps-original').hasClass('on') ? 1 : 0,'previewDelay': parseInt($('#pps-previewDelay').val()),'pageCount': parseInt($('#pps-maxPage').val()),'favFilter': parseInt($('#pps-hideLess').val()),'hideFavorite': $('#pps-hideBookmarked').hasClass('on') ? 1 : 0,'hideFollowed': $('#pps-hideFollowed').hasClass('on') ? 1 : 0,'linkBlank': $('#pps-newTab').hasClass('on') ? 1 : 0,'pageByKey': $('#pps-pageKey').hasClass('on') ? 1 : 0,'fullSizeThumb': $('#pps-fullSizeThumb').hasClass('on') ? 1 : 0,'version': g_version,}SetCookie('PixivPreview', settings);location.href = location.href;});$('#pps-reset').click(function () {let comfirmText = Texts[g_language].setting_resetHint;if (confirm(comfirmText)) {SetCookie('PixivPreview', null);location.href = location.href;}});$('#pps-close').click(function () {$('#pp-bg').remove();});if (screenWidth < 1400) {let fontSize = parseInt(25 - (1400 - screenWidth) / 40);$('#pp-bg').find('li').css('font-size', fontSize + 'px');}}function SetTargetBlank(returnMap) {if (g_settings.linkBlank) {let target = [];$.each(returnMap.controlElements, function(i, e) {if (e.tagName == 'A') {target.push(e);}});$.each($(returnMap.controlElements).find('a'), function(i, e) {target.push(e);});$.each(target, function(i, e) {$(e).attr({'target': '_blank', 'rel': 'external'});// 主页这里用的是js监听跳转,特殊处理if (g_pageType == PageType.Home || g_pageType == PageType.Member || g_pageType == PageType.Artwork) {e.addEventListener("click", function(ev) {ev.stopPropagation();})}});}}/* --------------------------------------- 主函数 --------------------------------------- */let loadInterval = null;let itv = null;function Load() {// 匹配当前页面for (let i = 0; i < PageType.PageTypeCount; i++) {if (Pages[i].CheckUrl(location.href)) {g_pageType = i;break;}}if (g_pageType >= 0) {DoLog(LogLevel.Info, 'Current page is ' + Pages[g_pageType].PageTypeString);} else {DoLog(LogLevel.Info, 'Unsupported page.');clearInterval(loadInterval);return;}// 设置按钮let toolBar = Pages[g_pageType].GetToolBar();if (toolBar) {DoLog(LogLevel.Elements, toolBar);clearInterval(loadInterval);} else {DoLog(LogLevel.Warning, 'Get toolbar failed.');return;}window.onresize = function() {if ($('#pps-save').length > 0) {let screenWidth = document.documentElement.clientWidth;let screenHeight = document.documentElement.clientHeight;$('#pp-bg').css({'width': screenWidth + 'px', 'height': screenHeight + 'px'});if (screenWidth < 1400) {let fontSize = parseInt(25 - (1400 - screenWidth) / 40);$('#pp-bg').find('li').css('font-size', fontSize + 'px');}}};if ($('#pp-settings').length == 0) {toolBar.appendChild(toolBar.firstChild.cloneNode(true));toolBar.lastChild.outerHTML = '<button id="pp-settings" style="background-color: rgb(0, 0, 0);margin-top: 5px;opacity: 0.8;cursor: pointer;border: none;padding: 12px;border-radius: 24px;width: 48px;height: 48px;"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve" style="fill: white;"><metadata> Svg Vector Icons : http://www.sfont.cn </metadata><g><path d="M377.5,500c0,67.7,54.8,122.5,122.5,122.5S622.5,567.7,622.5,500S567.7,377.5,500,377.5S377.5,432.3,377.5,500z"></path><path d="M990,546v-94.8L856.2,411c-8.9-35.8-23-69.4-41.6-100.2L879,186L812,119L689,185.2c-30.8-18.5-64.4-32.6-100.2-41.5L545.9,10h-94.8L411,143.8c-35.8,8.9-69.5,23-100.2,41.5L186.1,121l-67,66.9L185.2,311c-18.6,30.8-32.6,64.4-41.5,100.3L10,454v94.8L143.8,589c8.9,35.8,23,69.4,41.6,100.2L121,814l67,67l123-66.2c30.8,18.6,64.5,32.6,100.3,41.5L454,990h94.8L589,856.2c35.8-8.9,69.4-23,100.2-41.6L814,879l67-67l-66.2-123.1c18.6-30.7,32.6-64.4,41.5-100.2L990,546z M500,745c-135.3,0-245-109.7-245-245c0-135.3,109.7-245,245-245s245,109.7,245,245C745,635.3,635.3,745,500,745z"></path></g></svg></button>';$(toolBar.lastChild).css('margin-top', '10px');$(toolBar.lastChild).css('opacity', '0.8');$(toolBar.lastChild).click(function () {ShowSetting();});}// 读取设置g_settings = GetSettings();// 自动检测语言g_language = g_settings.lang == undefined ? Lang.auto : g_settings.lang;if (g_language == Lang.auto) {let lang = $('html').attr('lang');if (lang && lang.indexOf('zh') != -1) {// 简体中文和繁体中文都用简体中文g_language = Lang.zh_CN;} else {// 其他的统一用英语,其他语言也不知道谷歌翻译得对不对g_language = Lang.en_US;}}// g_csrfTokenif (g_pageType == PageType.Search) {$.get(location.href, function (data) {let matched = data.match(/token":"([a-z0-9]{32})/);if (matched.length > 0) {g_csrfToken = matched[1];DoLog(LogLevel.Info, 'Got g_csrfToken: ' + g_csrfToken);} else {DoLog(LogLevel.Error, 'Can not get g_csrfToken, so you can not add works to bookmark when sorting has enabled.');}});}// 排序、预览itv = setInterval(function () {let returnMap = Pages[g_pageType].ProcessPageElements();if (!returnMap.loadingComplete) {return;}DoLog(LogLevel.Info, 'Process page comlete, sorting and prevewing begin.');DoLog(LogLevel.Elements, returnMap);clearInterval(itv);SetTargetBlank(returnMap);try {if (g_pageType == PageType.Artwork) {Pages[g_pageType].Work();if (g_settings.enablePreview) {PixivPreview();}}else if (g_pageType == PageType.Search) {if (g_settings.enableSort) {g_sortComplete = false;PixivSK(function() {g_sortComplete = true;if (g_settings.enablePreview) {PixivPreview();}});} else if (g_settings.enablePreview) {PixivPreview();}} else if (g_settings.enablePreview) {PixivPreview();}}catch (e) {DoLog(LogLevel.Error, 'Unknown error: ' + e);}}, 500);}loadInterval = setInterval(Load, 1000);setInterval(function() {if (location.href != initialUrl) {// 排序中点击搜索tag,可能导致进行中的排序出现混乱,加取消太麻烦,直接走刷新if (!g_sortComplete) {location.href = location.href;return;}// fix 主页预览图出现后点击图片,进到详情页,预览图不消失的问题if ($('.pp-main').length > 0) {$('.pp-main').remove();}initialUrl = location.href;clearInterval(loadInterval);clearInterval(itv);clearInterval(autoLoadInterval);autoLoadInterval = null;g_pageType = -1;loadInterval = setInterval(Load, 300);}}, 1000);