, 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 = $('
').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 };
// 预览 Div
let 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 = '
';
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 = '
';
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,
};
}
// 请求显示的预览图ID
let 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;
// 当前加载的页面 URL
let 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;
}
// page
let 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('
0%
');
// page
if (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 = [];
for (let i = 0; i < works.length; i++) {
if (works[i].id) {
tempWorks.push(works[i]);
}
}
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('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);
// 清理模板
// image
let 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 = $('
');
if (titleLinkParent.children().length == 0) {
titleLinkParent.append(titleLink);
} else {
titleLink = titleLinkParent.children('a:first');
}
// author
let 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));
// others
let 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('
');
//}
authorLinkProfileImage.addClass('ppAuthorLinkProfileImage');
authorLink.addClass('ppAuthorLink');
authorName.addClass('ppAuthorName');
authorImage.addClass('ppAuthorImage');
bookmarkSvg.addClass('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));
li.find('.ppImg').attr('src', works[i].url);
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 = '
';
li.find('.ppAdditionTag').append(R18HTML);
}
if (works[i].pageCount > 1) {
let pageCountHTML = '
\
' + works[i].pageCount + ' ';
li.find('.ppAdditionTag').append(pageCountHTML);
}
let bookmarkCountHTML = '
' + works[i].bookmarkCount + ' likes
';
li.find('.ppBookmarkCount').append(bookmarkCountHTML);
if (works[i].illustType == 2) {
let animationHTML = '
';
li.find('.ppImg').after(animationHTML);
}
$(container).append(li);
}
// 监听加入书签点击事件,监听父节点,但是按照
节点处理
$('.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 result: ');
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 result: ');
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 = $('');
$('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 = '关注中 ';
}
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 result: ');
DoLog(LogLevel.Elements, data);
if (data.type == 'bookuser') {
$('.ppa-follow').get(0).outerHTML = ' 关注 ';
}
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 result: ');
DoLog(LogLevel.Elements, data);
// success
if (data.length === 0) {
$('.ppa-follow').get(0).outerHTML = '关注中 ';
} 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 = '' + Texts[g_language].sort_noWork + ' ';
}
// 恢复显示
$('#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 = $('
').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 = '' + Texts[g_language].install_title + g_version + '
' + 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 = $('
').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 = '' +
'
' +
'
' +
'
' +
'' + Texts[g_language].setting_save + ' ' +
'' + Texts[g_language].setting_reset + ' ' +
'
';
bg.get(0).innerHTML = settingHTML;
let ul = $('#pps-ul');
function getImageAction(id) {
return ' ';
}
function getInputAction(id) {
return ' '
}
function getSelectAction(id) {
return ' ';
}
function addItem(action, text) {
ul.append('' + action + text + ' ');
}
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 + ' ' + Texts[g_language].setting_clearFollowingCache + ' ');
addItem(getImageAction('pps-newTab'), Texts[g_language].setting_blank);
addItem(getImageAction('pps-pageKey'), Texts[g_language].setting_turnPage);
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-lang')
.append('Auto ')
.append('简体中文 ')
.append('English ')
.append('Русский язык ')
.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,
'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 = ' Svg Vector Icons : http://www.sfont.cn ';
$(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_csrfToken
if (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);