Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ==UserScript==
- // @name Bing AI SLOP
- // @namespace http://tampermonkey.net/
- // @version 0.6.1
- // @description Auto Slop
- // @author (You)s
- // @match https://www.bing.com/images/create*
- // @run-at document-end
- // @grant GM_addStyle
- // @grant GM_download
- // @grant unsafeWindow
- // ==/UserScript==
- // --- Guide ---
- // Request = alternative generate button.
- //
- // U(ltra) = do 3 requests at once
- // B(oost) = boost mode
- // S(low) = slow mode (saves boosts)
- // - Slow mode takes the time needed as you were out of Boosts
- // - Note it still counts on your daily request limit
- //
- // Download All = will download all not earlier downloaded images, except the deleted ones
- //
- // Auto-Download = automatically triggers 'Download All' after the Request is ready
- //
- // INF = auto click is enabled and won't stop even after an image is successfully generated.
- // ON = auto click if dogged
- // OFF = auto click disabled
- //
- // L(andscape) = automatic request landscape version of the generated image
- // OFF = disabled
- //
- // Slider 10 to 70s = Refresh time in seconds during a request
- // - When out of Boosts, set a shorter time to check if a request is ready more frequent
- //
- // --- Settings ---
- // File name
- var file_name_format = 'timestamp'; // 'timestamp', 'prompt' or 'timestamp+prompt'
- var file_name_length = 80; // Max 170
- var file_img_type = 'jpg';
- // Audio (May not work with browsers with anti-autoplay rules)
- var audio_enabled = true; // Enable audio notifications (true = enabled, false = disabled)
- var audio_done_link = 'https://bigsoundbank.com/UPLOAD/ogg/1111.ogg'; // Url to a sound that plays when the request is sucessfully done and the tab/window is idle. (Only in 'ON' mode)
- var audio_error_link = 'https://bigsoundbank.com/UPLOAD/mp3/2061.mp3'; // Url to a sound that plays when error notification occurs. (Only in 'INF' mode)
- var audio_debug_link = 'https://bigsoundbank.com/UPLOAD/ogg/0477.ogg'; // Url to a sound that plays when debug notification. (Only in debug mode, can be ignored)
- var audio_volume = 0.3; // 0.0 to 1.0
- // Options
- var auto_login = true; // Try re-login when session is lost (true = enabled, false = disabled)
- var hide_loader_image = true; // Hide the "loader image" while making a request
- var remove_related_content = true; // Remove the related content from the web shown under the detail view of the image (true = enabled, false = disabled)
- var auto_delete_sets = 50; // When you reach this number of sets in Recent list, the oldest set will be automatically deleted. (You can still revive it by clicking the show deleted toggle.)
- var max_stored_sets = 200; // When you reach this number of temporary locally stored sets, the oldest set will be automatically removed. (You can not revive it)
- var debug = false; // Debug mode (for developers)
- // -------------
- function elementBanner(doc) { return doc.getElementById('giscope'); } // banner with input prompt bar
- function elementSearchBox(doc) { return doc.getElementById('sb_form_q'); } // input prompt bar ("search box")
- function elementTokenBalance(doc) { return doc.getElementById('token_bal'); } // token balance
- function elementCreateButton(doc) { return doc.getElementById('create_btn_c'); } // create button when doing requests
- function elementPatiance(doc) { return doc.querySelector('#gilen_c.gi_nb.gi_nb_r.show_n'); }; // patiance pop-up appearing after a wile during request
- function elementPreviewContainer(doc) { return doc.getElementById('girrcc'); } // preview images container
- function elementPreviewGrids(doc) { return doc.getElementsByClassName('girrgrid'); } // cells containing preview images
- function elementPreviewLinks(doc) { return doc.querySelectorAll('a.girr_set'); } // all preview cells containing the request result links
- function elementPreviewImage(doc) { return doc.querySelector('#girrcc'); } // first image element
- function elementShareButton(doc) { return doc.getElementsByClassName('action share rm nofocus')[0]; }
- function elementLoaderImage(doc) { return doc.getElementById('giloadc'); }
- function elementDetailsImage(doc) { return doc.getElementById('detailMeta'); }
- function isWorking(doc) { let btn = elementCreateButton(doc); return btn ? btn.classList.contains('ellipsis') : false; }
- function isLoggedOut(doc) { let btn = elementCreateButton(doc); return btn ? btn.classList.contains('land_login_create') : false; }
- function isDogged(doc) { let div = doc.getElementById('girer'); return div ? div.classList.contains('blocked_bd') : false; } // "Unsafe image content detected"
- function isContent(doc) { let div = doc.getElementById('girer'); return div ? div.getElementsByClassName('gi_btn_s').length: false } // "Content warning"
- function isPanda(doc) { // "We're sorry — we've run into an issue."
- let div = doc.getElementById("girer");
- if (!div) return false;
- let img = div.getElementsByClassName('gil_err_img rms_img');
- if (!img.length) return false;
- if (!('src' in img[0])) return false;
- let splits = img[0].src.split('/');
- let fileName = splits[splits.length - 1];
- if (fileName == '6su9d9mQOs47jDoNH2YyzqVpyzU.jpg') { return true; }
- return false;
- }
- function isRobot(doc) { // "There was a problem creating your images"
- let div = doc.getElementById("girer");
- if (!div) return false;
- let img = div.getElementsByClassName('gil_err_img rms_img');
- if (!img.length) return false;
- if (!('src' in img[0])) return false;
- let splits = img[0].src.split('/');
- let fileName = splits[splits.length - 1];
- if (fileName == 'kLOji6rqeUcntDWPg9Jj-mZqSq4.jpg') { return true; }
- return false;
- }
- function isLimit(doc) { // "You can't submit any more prompts"
- let div = doc.getElementById("girer");
- if (!div) return false;
- let img = div.getElementsByClassName('gil_err_img block_icon rms_img');
- if (img.length) { return true; }
- return false;
- }
- let playAudio = (function() {
- var timeOut = null;
- return function(type, time) {
- let link = audio_done_link;
- if (type == 'error') { link = audio_error_link; }
- if (type == 'debug') { link = audio_debug_link; }
- if (audio_enabled && link) {
- let audio = new Audio(link);
- audio.volume = audio_volume;
- timeOut = setTimeout(function() { audio.play(); }, time || 0);
- if (time) {
- let abort = function() {
- clearTimeout(timeOut);
- document.body.removeEventListener('mousemove', abort);
- document.body.removeEventListener('scroll', abort);
- document.body.removeEventListener('keydown', abort);
- document.body.removeEventListener('click', abort);
- document.body.removeEventListener('touchstart', abort);
- };
- document.body.addEventListener('mousemove', abort);
- document.body.addEventListener('scroll', abort);
- document.body.addEventListener('keydown', abort);
- document.body.addEventListener('click', abort);
- document.body.addEventListener('touchstart', abort);
- }
- }
- }
- })();
- function sleep(ms) {
- return new Promise(resolve => setTimeout(resolve, ms));
- }
- async function wait(cond, timeOut) {
- let time = new Date();
- while (!cond()) {
- if (timeOut && (new Date() - time) > timeOut) { return false; }
- await sleep(50);
- }
- return true;
- }
- class Storage {
- constructor(name, initValue) {
- this.name = name + GM_info.script.version.split('.').join('');
- if (initValue != undefined && localStorage.getItem(this.name) === null) {
- localStorage.setItem(this.name, JSON.stringify(initValue));
- return;
- }
- }
- get value() {
- return JSON.parse(localStorage.getItem(this.name));
- }
- set value(value) {
- if (value === undefined) { return; }
- localStorage.setItem(this.name, JSON.stringify(value));
- }
- }
- function createElementFromHTML(htmlString) {
- var div = document.createElement('div');
- div.innerHTML = htmlString.trim();
- return div.firstChild;
- }
- function getTimeStamp(date) {
- let year = date.getFullYear();
- let month = (date.getMonth() + 1).toString().padStart(2, '0');
- let day = date.getDate().toString().padStart(2, '0');
- let hours = date.getHours().toString().padStart(2, '0');
- let minutes = date.getMinutes().toString().padStart(2, '0');
- let seconds = date.getSeconds().toString().padStart(2, '0');
- let dateTime = year + '-' + month + '-' + day + ' ' + hours + '_' + minutes + '_' + seconds;
- return dateTime;
- }
- function inIframe() {
- try { return window.self !== window.top; }
- catch (e) { return true; }
- }
- function insertBefore(referenceNode, newNode) {
- referenceNode.parentNode.insertBefore(newNode, referenceNode);
- }
- function insertAfter(referenceNode, newNode) {
- referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
- }
- function getId(href) {
- if (href.includes('create?q')) {
- let search = href.split('?')[1];
- let params = new URLSearchParams(search);
- let id = params.get('id');
- return id;
- }
- let splits = href.split('/');
- return splits[splits.length - 1].split('?')[0];
- }
- function getThid(href) {
- let search = href.split('?')[1];
- let params = new URLSearchParams(search);
- let thid = params.get('thId');
- return thid;
- }
- function checkForDuplicates(top) {
- let images = [];
- let sets = document.querySelectorAll('a.girr_set');
- for (let set of sets) {
- if (!top--) { break };
- if (isSetIncomplete(set)) { continue; }
- let girrgrid = set.childNodes[0];
- for (let img of girrgrid.childNodes) {
- if (img.className == "gir_wide") { img = img.childNodes[0]; }
- if (!img.hasAttribute('src')) { continue; } // probably gipholder
- let splits = img.src.split('/');
- let name = splits[splits.length - 1].split('?')[0];
- if (images.includes(name)) { return true; }
- images.push(name);
- }
- }
- return false;
- }
- function post(url, data, respFunc, respData, errorFunc) {
- let a = {};
- if (data) { a = {'body': data, 'method': 'POST'}; }
- if (data == 'post') { a = {'method': 'POST'}; }
- fetch(url, a).then(response => {
- if (response.status == 500) {
- if (debug) { console.log(response); }
- throw new Error('Something went wrong');
- }
- return response.text();
- }).then(data => {
- if (respData) { respData(data); }
- }).catch((error) => {
- if (debug) { console.log(error); }
- if (errorFunc) { errorFunc(error); }
- });
- }
- function getUrlParam(par) {
- let params = new URLSearchParams(document.location.search);
- let val = params.get(par.toLowerCase()) || params.get(par.toUpperCase());
- return val;
- }
- let setObserver = (function() {
- var observers = [];
- return function(conditionFunc, doFunc, pop, body) {
- if (!pop) { pop = true; }
- if (!body) { body = document.body; }
- if (conditionFunc()) {
- doFunc();
- if (pop) { return; }
- }
- let observer = {};
- observer.index = observers.length;
- observer.cond = conditionFunc;
- observer.do = doFunc;
- observer.pop = pop;
- observer.observer = new MutationObserver(function() {
- if (observer.cond()) {
- observer.do();
- if (observer.pop) {
- observer.observer.disconnect();
- observers.splice(observer.index, 1);
- }
- }
- });
- observer.observer.observe(body, { childList: true, subtree: true });
- observers.push(observer);
- }
- })();
- function downloadImage(url, date, prompt, index, total, edit) {
- let name = 'Bing - ';
- if (file_name_format == 'prompt') { name += prompt; }
- if (file_name_format.slice(0, 9) == 'timestamp') { name += date; }
- if (file_name_format == 'timestamp+prompt') { name += " - " + prompt; }
- name = name.slice(0, file_name_length);
- if (index != undefined) {name += ' (' + index.toString() + '-' + total.toString() + ')'; }
- if (edit) { name += '-E'}
- if (debug) { console.log('download: ' + name); }
- GM_download({url: url, name: name + '.' + file_img_type});
- }
- let doRequest = (function() {
- var errorCount = 0;
- var requestData = function(data) {
- let parser = new DOMParser();
- let doc = parser.parseFromString(data, 'text/html');
- let links = elementPreviewLinks(doc);
- if (links.length) {
- let extractedHref = links[0].getAttribute('href');
- let finalUrl = "https://www.bing.com" + extractedHref;
- finalUrl = finalUrl.replace(/&/g, '&');
- window.location.href = finalUrl; // visit ongoing request
- return;
- }
- // something went wrong with the request
- (new Storage('autoRequestCount')).value = 0;
- setRequestButton('Error', false);
- if (isContent(doc)) {
- setInfoLabel('Content warning (Prompt filter triggered)');
- document.getElementById('auto_option_OFF').click(); // stop auto clicking
- setTimeout(function() { setRequestButton(); }, 3000);
- return;
- }
- if (isRobot(doc)) {
- if (!elementBanner(doc)) {
- setInfoLabel('There was a problem creating your images (You may be logged out)');
- setRequestButton('Auto Login', function() { window.location.href = 'https://www.bing.com/images/create?sude=1'; });
- return;
- }
- setInfoLabel('There was a problem creating your images (Robot)');
- errorCount++;
- setTimeout(function() { setRequestButton(); }, 1000 * errorCount);
- if (errorCount > 2 && (new Storage('autoOption')).value == 'INF') {
- document.getElementById('auto_option_OFF').click();
- playAudio('error');
- }
- return;
- }
- if (isPanda(doc)) {
- setInfoLabel('We\'re sorry — we\'ve run into an issue. (Panda)');
- setRequestButton('Solve Panda', function() {
- let newTab = window.open('https://www.bing.com/profile/history?FORM=O2HV46', '_blank');
- if (newTab == null || typeof(newTab)=='undefined') {
- playAudio('error');
- setTimeout(function() { alert('Please disable your pop-up blocker to resolve Panda'); }, 1000);
- return;
- }
- setTimeout(function() { elementCreateButton(document).click(); }, 3000);
- });
- return;
- }
- if (isLimit(doc)) {
- setInfoLabel('You can\'t submit any more prompts (Daily request limit reached)');
- setRequestButton('Daily Limit', false);
- if ((new Storage('autoOption')).value != 'OFF') {
- document.getElementById('auto_option_OFF').click();
- playAudio('error');
- }
- return;
- }
- setInfoLabel('Response not found or unavailable (Peak hours)');
- setTimeout(function() { setRequestButton(); }, 3000);
- };
- var requestError = function(error) {
- // unknown error
- setRequestButton('Error', false);
- if (debug) { playAudio('debug') };
- setInfoLabel('Error: ' + error);
- setTimeout(function() { setRequestButton(); }, 5000);
- };
- return function() {
- // disable boost if tokens is out
- let token_bal = elementTokenBalance(document);
- let tokens = parseInt(token_bal.innerText);
- let boostOption = new Storage('boostOption');
- if (tokens == 0 && boostOption.value == 'B') {
- let boostOff = document.getElementById('boost_option_S');
- boostOff.click(); // disable boosts
- }
- // store last prompt
- let prompt = elementSearchBox(document).value; // todo: add check that prompt is not empty
- (new Storage('lastPrompt')).value = prompt;
- // create request url
- let url = new URL('https://www.bing.com/images/create');
- url.searchParams.append('q', prompt);
- if (tokens && (boostOption.value == 'B' || boostOption.value == 'U')) {
- url.searchParams.append('rt', '4');
- } else {
- url.searchParams.append('rt', '3');
- }
- let data = 'q=' + encodeURIComponent(prompt) + '&qs=ds';
- (new Storage('requestCount')).value++;
- (new Storage('newSetsCount', 0)).value = 0;
- // do request
- post(url, data, null, requestData, requestError);
- };
- })();
- function eventRequest() {
- let autoRequestCount = new Storage('autoRequestCount', 0);
- if (autoRequestCount.value) { return; }
- let boostOption = new Storage('boostOption');
- autoRequestCount.value = boostOption.value == 'U' ? 3 : 1;
- (new Storage('latestAutoRequestCount', 0)).value = autoRequestCount.value;
- setRequestButton('Sending', false, true);
- setTimeout(updateRequests, 2000);
- }
- let clickRequestButton = eventRequest;
- let setRequestButton = (function() {
- var animationInterval = null;
- return function (text, clickFunc, wait) {
- let button = document.getElementById("request_button");
- if (!text) { text = 'Request'; }
- button.innerText = text;
- if (animationInterval) { clearInterval(animationInterval); }
- animationInterval = null;
- if (clickFunc === false) {
- button.disabled = true;
- button.style.cursor = 'default';
- button.style.backgroundColor = '#787673';
- button.style.border = '0';
- if (wait) {
- let count = 0;
- animationInterval = setInterval(function() {
- if (count < 3) {
- button.innerText += '.';
- count++;
- } else {
- button.innerText = button.innerText.slice(0, -3);
- count = 0;
- }
- }, 500);
- }
- return;
- }
- if (clickFunc === undefined) {clickFunc = eventRequest}
- clickRequestButton = clickFunc;
- button.disabled = false;
- button.style.cursor = '';
- button.style.backgroundColor = '';
- button.style.border = '';
- }
- })();
- function createRequestButton() {
- let button = document.createElement('button');
- button.style.display = 'inline-block';
- button.style.marginLeft = '15px';
- button.id = 'request_button';
- button.className = 'gi_btn_p';
- button.innerText = 'Request';
- button.addEventListener('click', function() { clickRequestButton(); });
- return button
- }
- // todo: update label when requests in auto edit
- function createRequestCountLabel() {
- let requestCount = new Storage('requestCount', 0);
- let label = document.createElement('label');
- label.className = 'text';
- label.id = 'requestCountLabel'
- label.innerText = requestCount.value.toString();
- label.style.position = 'relative';
- label.display = 'inline-block';
- label.style.display = 'inline-flex';
- label.style.top = '-10px';
- label.style.marginLeft = '15px';
- return label;
- }
- function updatePromptLength() {
- let label = document.getElementById('promptLengthLabel');
- let searchBox = elementSearchBox(document);
- let maxLength = searchBox.getAttribute('maxlength');
- let currentLength = searchBox.value.length;
- label.innerText = '[' + (currentLength) + '/' + (maxLength) + ']';
- }
- function createPromptLengthLabel() {
- let label = document.createElement('label');
- label.className = 'text';
- label.id = 'promptLengthLabel';
- label.style.position = 'relative';
- label.display = 'inline-block';
- label.style.display = 'inline-flex';
- label.style.top = '-10px';
- label.style.marginLeft = '15px';
- label.innerText = '-';
- let searchBox = elementSearchBox(document);
- searchBox.addEventListener('input', updatePromptLength);
- return label;
- }
- function createToolTip() {
- let div = document.createElement('div');
- div.id = 'tooltip';
- div.className = 'tooltip';
- div.style.position = 'absolute';
- div.style.left = '100px';
- div.style.top = '100px';
- div.style.width = '450px';
- div.style.zIndex = '11';
- let span = document.createElement('span');
- span.className = 'tooltiptext';
- span.innerHTML = 'Tooltip text';
- span.style.position = 'absolute';
- div.appendChild(span);
- div.style.display = 'none';
- return div;
- }
- let showTooltip = (function() {
- var toolTipTimeOut = null;
- var showToolTip = function(element) {
- let tooltip = document.getElementById('tooltip');
- let span = tooltip.childNodes[0];
- tooltip.style.display = "block";
- let rectElement = element.getBoundingClientRect();
- let rectToggle = element.getBoundingClientRect();
- tooltip.style.left = (rectElement.left + (rectElement.right - rectElement.left)/2 - span.offsetWidth/2 + window.scrollX).toString() + 'px';
- tooltip.style.top = (rectElement.top - span.offsetHeight - 10 + window.scrollY).toString() + 'px';
- }
- return function (show, tip, element) {
- let tooltip = document.getElementById('tooltip');
- if (!show) {
- tooltip.style.display = 'none';
- if (toolTipTimeOut) { clearTimeout(toolTipTimeOut); toolTipTimeOut = null; }
- return;
- }
- let span = tooltip.childNodes[0];
- span.innerHTML = tip;
- if (!toolTipTimeOut) { toolTipTimeOut = setTimeout(function() { showToolTip(element); }, 1000); }
- }
- })();
- function createBoostToggle() {
- let boostOption = new Storage('boostOption', 'S');
- let toggle = document.createElement('div');
- toggle.className = 'toggle-switch';
- toggle.id = 'boost_toggle';
- toggle.style.width = '75px';
- toggle.style.display = 'inline-flex';
- toggle.style.marginLeft = '15px';
- let tip =
- 'U(ltra) = do 3 requests at once<br/>' +
- 'B(oost) = boost mode<br/>' +
- 'S(low) = slow mode (saves boosts)<br/>' +
- '- Slow mode takes the time needed as you were out of Boosts<br/>' +
- '- Note it still counts on your daily request limit';
- toggle.addEventListener("mouseover", function() { showTooltip(true, tip, this); } );
- toggle.addEventListener("mouseout", function() { showTooltip(false); } );
- let options = ['U', 'B', 'S'];
- for (let i = 0; i < options.length; i++) {
- let input = document.createElement('input');
- input.type = 'radio';
- input.id = 'boost_option_' + options[i];
- input.name = 'boost';
- input.setAttribute('option', options[i]);
- let label = document.createElement('label');
- label.htmlFor = 'boost_option_' + options[i];
- label.innerText = options[i];
- toggle.appendChild(input);
- toggle.appendChild(label);
- input.addEventListener('change', function() {
- boostOption.value = this.getAttribute('option');
- });
- if (boostOption.value == options[i]) {
- input.checked = true;
- }
- }
- return toggle;
- }
- function updateDownloadAllButton(button) {
- if (!button) { button = document.getElementById('download_all_btn'); }
- let count = 0;
- let localSets = (new Storage('localSets', [])).value;
- for (let set of localSets) {
- for (let image of set.images) {
- if (set.deleted) { continue; }
- if (image.downloaded == 'downloaded') { continue; }
- count++;
- }
- }
- if (count) {
- button.innerText = 'Download All (' + count.toString() + ')';
- button.disabled = false;
- button.style.cursor = '';
- button.style.backgroundColor = '';
- button.style.border = '';
- } else {
- button.innerText = 'Download All';
- button.disabled = true;
- button.style.cursor = 'default';
- button.style.backgroundColor = '#787673';
- button.style.border = '0';
- }
- }
- function createDownloadAllButton() {
- let button = document.createElement('button');
- button.className = 'gi_btn_p';
- button.id = 'download_all_btn';
- button.style.display = 'inline-block';
- button.style.marginLeft = '15px';
- button.addEventListener('click', function() {
- updateAutoDownload(true);
- });
- let tip =
- 'Will download all not earlier downloaded images,<br/>' +
- 'except the deleted ones';
- button.addEventListener("mouseover", function() { showTooltip(true, tip, this); } );
- button.addEventListener("mouseout", function() { showTooltip(false); } );
- updateDownloadAllButton(button);
- return button;
- }
- function createAutoDownloadButton() {
- let autoDownload = new Storage('autoDownload', true)
- let button = document.createElement('button');
- button.className = 'gi_btn_p';
- button.id = 'auto_download_btn';
- button.innerText = autoDownload.value ? 'Auto-Download: ON' : 'Auto-Download: OFF';
- button.style.display = 'inline-block';
- button.style.marginLeft = '15px';
- button.addEventListener('click', function() {
- autoDownload.value = !autoDownload.value;
- this.innerText = autoDownload.value ? 'Auto-Download: ON' : 'Auto-Download: OFF';
- });
- let tip =
- 'Auto-Download = automatically triggers \'Download All\' after the Request is ready';
- button.addEventListener("mouseover", function() { showTooltip(true, tip, this); } );
- button.addEventListener("mouseout", function() { showTooltip(false); } );
- return button;
- }
- function createAutoToggle() {
- let autoOption = new Storage('autoOption', 'OFF');
- let toggle = document.createElement('div');
- toggle.className = 'toggle-switch';
- toggle.id = 'auto_toggle';
- toggle.style.display = 'inline-flex';
- toggle.style.marginLeft = '15px';
- let tip =
- 'INF = auto click enabled and won\'t stop even after an image is generated.<br/>' +
- 'ON = auto click if dogged<br/>' +
- 'OFF = auto click disabled';
- toggle.addEventListener("mouseover", function() { showTooltip(true, tip, this); } );
- toggle.addEventListener("mouseout", function() { showTooltip(false); } );
- let options = ['INF', 'ON', 'OFF'];
- for (let i = 0; i < options.length; i++) {
- let input = document.createElement('input');
- input.type = 'radio';
- input.id = 'auto_option_' + options[i];
- input.name = 'auto';
- input.setAttribute('option', options[i]);
- let label = document.createElement('label');
- label.htmlFor = 'auto_option_' + options[i];
- label.innerText = options[i];
- toggle.appendChild(input);
- toggle.appendChild(label);
- input.addEventListener('change', function() {
- autoOption.value = this.getAttribute('option');
- updateAutoRequest();
- });
- if (autoOption.value == options[i]) {
- input.checked = true;
- }
- }
- return toggle;
- }
- function getEditPendingCount() {
- let localSets = (new Storage('localSets', [])).value;
- let count = 0;
- for (let set of localSets) {
- for (let image of set.images) {
- if (image.edit == 'pending') { count++; }
- }
- }
- return count;
- }
- function createEditToggle() {
- let editOption = new Storage('editOption', 'OFF');
- let toggle = document.createElement('div');
- toggle.className = 'toggle-switch';
- toggle.id = 'edit_toggle';
- toggle.style.width = '75px';
- toggle.style.display = 'inline-flex';
- toggle.style.marginLeft = '15px';
- let tip =
- 'L(andscape) = automatic request landscape version of the generated image<br/>' +
- 'OFF = disabled';
- toggle.addEventListener("mouseover", function() { showTooltip(true, tip, this); } );
- toggle.addEventListener("mouseout", function() { showTooltip(false); } );
- let options = ['L', 'OFF'];
- for (let i = 0; i < options.length; i++) {
- let input = document.createElement('input');
- input.type = 'radio';
- input.id = 'edit_option_' + options[i];
- input.name = 'edit';
- input.setAttribute('option', options[i]);
- let label = document.createElement('label');
- label.htmlFor = 'edit_option_' + options[i];
- label.innerText = options[i];
- toggle.appendChild(input);
- toggle.appendChild(label);
- input.addEventListener('change', function() {
- editOption.value = this.getAttribute('option');
- });
- if (editOption.value == options[i]) {
- input.checked = true;
- }
- }
- return toggle;
- }
- function createReloadSlider() {
- let reloadTime = new Storage('reloadTime', 70);
- let slider = document.createElement('div');
- slider.className = 'value-slider';
- slider.id = 'reload_slider';
- slider.style.display = 'inline-block';
- slider.style.marginLeft = '15px';
- let tip =
- 'Refresh time in seconds during a request<br/><br/>' +
- 'When out of Boosts, set a shorter time <br/>' +
- 'to check if a request is ready more frequent';
- slider.addEventListener("mouseover", function() { showTooltip(true, tip, this); } );
- slider.addEventListener("mouseout", function() { showTooltip(false); } );
- let input = document.createElement('input');
- input.type = 'range';
- input.min = '10';
- input.max = '70';
- input.value = reloadTime.value.toString();
- input.addEventListener('input', function() {
- label.innerText = input.value + ' s';
- reloadTime.value = parseInt(input.value);
- });
- slider.appendChild(input);
- let label = document.createElement('label');
- label.innerText = input.value + ' s';
- slider.appendChild(label);
- return slider;
- }
- function setInfoLabel(text) {
- let infoLabel = document.getElementById('infoLabel');
- if (infoLabel) { infoLabel.innerText = text; }
- }
- function createInfoLabel() {
- let label = document.createElement('label');
- label.className = 'text';
- label.id = 'infoLabel'
- label.innerText = '-';
- label.display = 'inline-block';
- label.style.display = 'inline-flex';
- return label;
- }
- function createFrame() {
- let iframe = document.createElement('iframe');
- iframe.id = 'iframe'
- iframe.setAttribute('src', 'https://www.bing.com/profile/history?FORM=O2HV46');
- iframe.style.visibility = 'hidden';
- iframe.style.position = 'absolute';
- iframe.style.top = '100px';
- iframe.style.left = '0px';
- iframe.style.width = '400px';
- iframe.style.height = '300px';
- if (debug) {
- GM_addStyle(`#iframe { zoom: 0.33;
- -moz-transform: scale(0.33);
- -moz-transform-origin: 0 0;
- -o-transform: scale(0.33);
- -o-transform-origin: 0 0;
- -webkit-transform: scale(0.33);
- -webkit-transform-origin: 0 0; }`);
- iframe.style.visibility = 'visible';
- if (navigator.userAgent.toLowerCase().includes('firefox')) {
- iframe.style.top = '400px';
- iframe.style.width = '1200px';
- iframe.style.height = '900px';
- }
- else {
- iframe.style.top = '1200px';
- iframe.style.width = '4000px';
- iframe.style.height = '3000px';
- }
- }
- return iframe;
- }
- function downloadSetById(id) {
- let localSets = new Storage('localSets').value;
- for (let localSet of localSets) {
- if (localSet.id != id) { continue; }
- for (let image of localSet.images) { image.downloaded = 'pending'; }
- break;
- }
- (new Storage('localSets')).value = localSets;
- updateAutoDownload();
- }
- function requestEditsBySetId(id) {
- let localSets = (new Storage('localSets', [])).value;
- for (let localSet of localSets) {
- if (localSet.id != id) { continue; }
- for (let image of localSet.images) { image.edit = 'pending'; }
- break;
- }
- (new Storage('localSets')).value = localSets;
- updateAutoRequests();
- }
- function deleteSet(id) {
- let localSets = (new Storage('localSets', [])).value;
- for (let localSet of localSets) {
- if (localSet.id != id) { continue; }
- localSet.deleted = true;
- localSet.downloaded = 'skipped'
- break;
- }
- (new Storage('localSets')).value = localSets;
- updateSitePreviewSets();
- updateDownloadAllButton();
- }
- function createSetSubMenu()
- {
- let menu = document.createElement('div');
- menu.id = 'set-submenu';
- menu.style.position = 'absolute';
- menu.style.left = '10px';
- menu.style.top = '10px';
- menu.style.width = '170px';
- menu.style.display = 'none';
- menu.style.backgroundColor = getBackgroundColor();
- let hideSubmenu = function() {
- menu = document.getElementById('set-submenu');
- if (!menu) { return; }
- menu.style.display = 'none';
- };
- window.addEventListener('click', hideSubmenu);
- let girrcc = document.getElementById('girrcc');
- if (girrcc) {
- girrcc.addEventListener('scroll', hideSubmenu);
- }
- let button = document.createElement('button');
- button.className = 'gi_btn_p';
- button.id = 'set-submenu-download';
- button.innerText = 'Download Set';
- button.style.width = '100%';
- button.style.height = '34px';
- button.style.fontSize ='14px';
- button.style.marginBottom ='4px';
- button.addEventListener('click', function() {
- downloadSetById(this.set_id);
- });
- menu.appendChild(button);
- button = document.createElement('button');
- button.className = 'gi_btn_p';
- button.id = 'set-submenu-request-edit';
- button.innerText = 'Request Landscape';
- button.style.width = '100%';
- button.style.height = '34px';
- button.style.fontSize ='14px';
- button.style.marginBottom ='4px';
- button.addEventListener('click', function() {
- requestEditsBySetId(this.set_id);
- });
- menu.appendChild(button);
- button = document.createElement('button');
- button.className = 'gi_btn_p';
- button.id = 'set-submenu-delete';
- button.innerText = 'Delete';
- button.style.width = '100%';
- button.style.height = '34px';
- button.style.fontSize ='14px';
- button.style.marginBottom ='4px';
- button.addEventListener('click', function() {
- deleteSet(this.set_id);
- });
- menu.appendChild(button);
- return menu;
- }
- function createVersion() {
- let div = document.createElement('div');
- div.id = 'version';
- div.style.marginLeft = '4px';
- let span = document.createElement('span');
- span.className = 'text';
- span.innerHTML = 'with Bing AI SLOP (' + GM_info.script.version + ')';
- span.style.fontSize ='16px';
- div.appendChild(span);
- return div;
- }
- function createSlider() {
- let div = document.createElement('div');
- div.className = 'girrfil';
- div.setAttribute('tabindex', '0');
- div.setAttribute('data-hidetext', 'Hide deleted');
- div.setAttribute('data-showtext', 'Show deleted');
- div.setAttribute('data-tooltip', 'Show deleted');
- if (mobile) {
- div.style.right = '125px'
- }
- let span = document.createElement('span');
- span.className = 'girrfil_label';
- span.innerHTML = 'Show deleted';
- div.appendChild(span);
- let label = document.createElement('label');
- label.id = 'girrfil_tog';
- label.className = 'switch'
- let input = document.createElement('input');
- input.id = 'girrfil_tog_input_show_deleted';
- input.type = 'checkbox';
- input.checked = '';
- input.addEventListener('change', function() {
- if (this.checked) {
- div.setAttribute('data-tooltip', 'Hide deleted');
- span.innerHTML = 'Hide deleted';
- } else {
- div.setAttribute('data-tooltip', 'Show deleted');
- span.innerHTML = 'Show deleted';
- }
- updateSitePreviewSets();
- });
- label.appendChild(input);
- let span2 = document.createElement('span');
- span2.className = 'slider round';
- label.appendChild(span2);
- div.appendChild(label);
- return div;
- }
- function createBanner() {
- let banner = document.createElement('div');
- banner.id = 'newBanner';
- banner.className = 'gihead';
- banner.role = 'banner';
- banner.style.height = '10%'
- banner.style.width = '100%'
- banner.style.marginTop = '10px'
- banner.style.backgroundColor = 'rgba(0,0,0,.0)';
- let wrapper = document.createElement('div');
- wrapper.style.textAlign = 'center';
- wrapper.style.width = '100%';
- wrapper.style.justifyContent = 'center';
- wrapper.style.alignItems = 'center';
- wrapper.appendChild(createRequestCountLabel());
- wrapper.appendChild(createRequestButton());
- wrapper.appendChild(createBoostToggle());
- wrapper.appendChild(createDownloadAllButton());
- wrapper.appendChild(createAutoDownloadButton());
- wrapper.appendChild(createAutoToggle());
- wrapper.appendChild(createEditToggle());
- wrapper.appendChild(createReloadSlider());
- wrapper.appendChild(createPromptLengthLabel());
- wrapper.appendChild(document.createElement('br'));
- wrapper.appendChild(createInfoLabel());
- wrapper.appendChild(document.createElement('br'));
- wrapper.appendChild(createFrame());
- banner.appendChild(wrapper);
- return banner;
- }
- function getBackgroundColor() {
- let banner = elementBanner(document);
- let style = window.getComputedStyle(banner);
- return style.getPropertyValue('background-color');
- }
- function setTheme() {
- let switchColor = window.getComputedStyle(document.getElementById('auto_download_btn')).getPropertyValue('background-color');
- let textColor = window.getComputedStyle(elementTokenBalance(document)).getPropertyValue('color');
- GM_addStyle(`
- .toggle-switch {
- border: 2px solid ${switchColor};
- }
- .toggle-switch input:checked + label {
- background-color: ${switchColor};
- }
- .value-slider input::-webkit-slider-thumb {
- background: ${switchColor};
- }
- .value-slider input::-moz-range-thumb {
- background: ${switchColor};
- }
- .text {
- color: ${textColor};
- }
- /*.toggle-switch label {
- background-color: ${textColor};
- }*/
- `);
- }
- GM_addStyle(`
- .toggle-switch {
- position: relative;
- width: 110px;
- border-radius: 15px;
- overflow: hidden;
- }
- .toggle-switch input {
- display: none;
- }
- .toggle-switch label {
- float: left;
- width: 50%;
- margin: 0;
- padding: 5px 0;
- text-align: center;
- background-color: #777;
- color: #fff;
- cursor: pointer;
- transition: background-color 0.3s ease-in-out;
- border-right: 1px solid #fff;
- box-sizing: border-box;
- }
- .toggle-switch label:last-child {
- border-right: none;
- }
- .value-slider {
- position: relative;
- width: 80px;
- }
- .value-slider label {
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- pointer-events: none;
- -moz-user-select: none;
- -khtml-user-select: none;
- -webkit-user-select: none;
- -ms-user-select: none;
- user-select: none;
- color: #fff;
- }
- .value-slider input {
- -webkit-appearance: none;
- appearance: none;
- width: 100%;
- height: 25px;
- border-radius: 15px;
- background: #777;
- outline: none;
- }
- .value-slider input::-webkit-slider-thumb {
- -webkit-appearance: none;
- appearance: none;
- width: 25px;
- height: 25px;
- border-radius: 15px;
- cursor: pointer;
- }
- .value-slider input::-moz-range-thumb {
- width: 25px;
- height: 25px;
- cursor: pointer;
- }
- #request_button {
- height: 48px;
- width: 140px;
- font-size: 14px;
- }
- #download_all_btn, #auto_download_btn {
- height: 34px;
- width: 170px;
- font-size: 14px;
- }
- .tooltiptext {
- font-family: "Roboto",Helvetica,sans-serif;
- background-color: #555;
- color: #fff;
- font-size: 12px;
- text-align: left;
- border-radius: 6px;
- padding: 10px 10px;
- position: absolute;
- }
- .tooltiptext::after {
- content: "";
- position: absolute;
- top: 100%;
- left: 50%;
- margin-left: -5px;
- border-width: 5px;
- border-style: solid;
- border-color: #555 transparent transparent transparent;
- }
- .text {
- font-family: "Roboto",Helvetica,sans-serif;
- font-size: 16px;
- }
- #girrcc::-webkit-scrollbar {
- width: 6px;
- }
- `);
- var requestEditByImageId = (function() {
- var busy = false;
- var skey = null;
- var href = null;
- var intervalPoll = null;
- var doPoll = true;
- var sid = null;
- var iid = null;
- var pollEditStatus = function(skey, id, retrieveImage, errorResp, exception) {
- var getResponce = function(data) {
- let resp = JSON.parse(data);
- if (resp._type == 'RetrieveImagesResponse') {
- if (resp.hasOwnProperty('images')) { retrieveImage(resp.images[0]); }
- return;
- }
- if (resp._type == 'ErrorResponse') {
- if (errorResp) { errorResp(resp.errors[0]); }
- return;
- }
- }
- var getException = function(error) {
- if (exception) { exception(error); }
- }
- let url = '/images/edit/poll?iid=ey%3D%3D&skey=' + skey + '&id=' + id + '&q=a+cute-stone&partner=Sydney';
- post(url, null , null, getResponce, getException);
- }
- var postException = function(error) {
- setInfoLabel('Fail to request landscape (Post edit image request)');
- if (intervalPoll) { clearInterval(intervalPoll); }
- intervalPoll = null;
- let localSets = (new Storage('localSets', [])).value;
- let found = false;
- for (let set of localSets) {
- for (let image of set.images) {
- if (image.id == iid && image.edit == 'pending') {
- image.edit = 'fail';
- found = true;
- break;
- }
- }
- if (found) { break; }
- }
- (new Storage('localSets')).value = localSets;
- busy = false;
- }
- var postResponse = function(data) {
- let resp = JSON.parse(data);
- if (resp.hasOwnProperty('errors')) {
- if (resp.errors[0].message.includes("InvalidOwner")) { setInfoLabel('Fail to request landscape (Invalid Owner)'); }
- if (resp.errors[0].code == 'RateLimitExceeded') { setInfoLabel('Fail to request landscape (Daily Limit)'); }
- if ((new Storage('editOption')).value == 'L') {
- document.getElementById('edit_option_OFF').click();
- }
- return;
- }
- let splits = resp.webSearchUrl.split('/');
- let id = splits[splits.length - 1];
- href = "/images/create/a-cute-stone/" + id + "?_dbe=1&skey=" + skey;
- let iframe = document.getElementById('iframe');
- iframe.src = href;
- var poll = function() {
- if (intervalPoll) { clearInterval(intervalPoll); }
- else { pollEditStatus(skey, id, retrieveImage, errorResponse, exception); }
- intervalPoll = setInterval(function() {
- pollEditStatus(skey, id, retrieveImage, errorResponse, exception)
- }, 5000);
- }
- var exception = function(error) {
- //setInfoLabel('Fail auto edit image (Get edit status)');
- if (intervalPoll) { clearInterval(intervalPoll); }
- intervalPoll = null;
- busy = false;
- }
- var errorResponse = function(error) {
- setInfoLabel('Fail to request landscape (Dogged)');
- if (intervalPoll) { clearInterval(intervalPoll); }
- intervalPoll = null;
- let localSets = (new Storage('localSets', [])).value;
- let found = false;
- for (let set of localSets) {
- for (let image of set.images) {
- if (image.id == iid) { image.edit = 'blocked'; found = true; break; }
- }
- if (found) { break; }
- }
- (new Storage('localSets')).value = localSets;
- busy = false;
- }
- var retrieveImage = function(image) {
- if (intervalPoll) { clearInterval(intervalPoll); }
- intervalPoll = null;
- setInfoLabel('Successfully generated landscape');
- let newSet = {};
- newSet.id = getId(href);
- newSet.prompt = ''; // todo: add prompt?
- newSet.href = href;
- newSet.date = getTimeStamp(new Date());
- newSet.skey = skey;
- newSet.images = []
- //newSet.edit = sid;
- newSet.status = 'done';
- let newImage = {};
- let src = image.thumbnailUrl;
- newImage.src = src + '&w=100';
- newImage.url = src.split('?')[0];
- let splits = src.split('/');
- newImage.thid = splits[splits.length - 1].split('?')[0];
- newImage.id = iid;
- newImage.downloaded = (new Storage('autoDownload')).value ? 'pending' : 'skipped';
- newImage.edit = 'skipped';
- newImage.deleted = false;
- newImage.format = 'landscape';
- newSet.images.push(newImage);
- let localSets = (new Storage('localSets', [])).value;
- let insertIndex = 0;
- let i = 0;
- for (let localSet of localSets) {
- for (let image of localSet.images) {
- if (image.id == iid && image.edit == 'pending') {
- image.edit = 'done';
- newSet.prompt = localSet.prompt;
- insertIndex = i;
- break;
- }
- }
- if (insertIndex) { break; }
- i++;
- }
- localSets.splice(insertIndex, 0, newSet);
- (new Storage('localSets')).value = localSets;
- updateSitePreviewSets();
- updateAutoDownload();
- busy = false;
- }
- poll();
- }
- return function(id) { // image id
- if (busy) { return true; }
- if (!id) { return false; }
- busy = true;
- iid = id;
- let localSets = (new Storage('localSets')).value;
- let setEdit;
- let imageEdit;
- for (let set of localSets) {
- for (let image of set.images) {
- if (image.id == id && image.edit == "pending") {
- setEdit = set;
- imageEdit = image;
- break;
- }
- }
- if (imageEdit) { break; }
- }
- if (!setEdit || !imageEdit) { return; }
- sid = setEdit.id;
- skey = setEdit.skey;
- let q = 'a cute stone';
- let ar = 1; //'Wide'; // landscape,
- let partner = 'Sydney'
- let s = 'original'; // style
- let url = new URL('https://www.bing.com/images/edit/resize?');
- url.searchParams.append('iid', imageEdit.id);
- url.searchParams.append('skey', skey);
- url.searchParams.append('id', setEdit.id);
- url.searchParams.append('q', q);
- url.searchParams.append('partner', partner);
- url.searchParams.append('ar', ar);
- url.searchParams.append('s', s);
- let tokens = parseInt(elementTokenBalance(document).innerText);
- let boostOption = new Storage('boostOption');
- if (tokens && (boostOption.value == 'B' || boostOption.value == 'U')) {
- url.searchParams.append('rt', '4');
- } else {
- url.searchParams.append('rt', '3');
- }
- let requestCount = new Storage('requestCount');
- requestCount.value++;
- setInfoLabel('Request landscape (left: ' + getEditPendingCount() + ')');
- post(url, 'post', null, postResponse, postException);
- return true;
- }
- })();
- function iframeFetchImageSkey() {
- let fetchSet = (new Storage('fetchSet')).value;
- if (!fetchSet) { return; }
- let iframe = document.getElementById('OverlayIFrame');
- let win = unsafeWindow;
- if (iframe) { win = iframe.contentWindow.window; }
- let id = getId(win.location.href);
- if (fetchSet.id != id) { return; }
- let queryStrings = win.ImageDetailReducers.g_PageConfig.persistedQueryStrings;
- let params = new URLSearchParams(queryStrings);
- let skey = params.get('skey');
- let localSets = (new Storage('localSets', [])).value;
- for (let localSet of localSets) {
- if (localSet.id != fetchSet.id) { continue; }
- localSet.skey = skey;
- for (let i = 0; i < localSet.images.length; i++) {
- localSet.images[i].id = fetchSet.images[i].id;
- }
- break;
- }
- (new Storage('localSets')).value = localSets;
- (new Storage('fetchSet')).value = null;
- }
- function fetchImageIds(set) {
- let id = getId(window.location.href);
- if (set.id != id) { return null; }
- let href = null;
- let images = document.getElementsByClassName('iusc');
- if (images.length) {
- href = images[0].getAttribute('href');
- for (let image of images) {
- let m = image.getAttribute('m');
- let info = JSON.parse(m);
- let url = info.ClickThroughUrl;
- let search = url.split('?')[1];
- let params = new URLSearchParams(search);
- let thid = params.get('thId');
- let iid = params.get('id');
- for (let newImage of set.images) {
- if (newImage.thid == thid) { newImage.id = iid; break; }
- }
- }
- }
- let image = document.getElementsByClassName('single-img-link')[0];
- if (image) {
- href = image.getAttribute('href');
- let url = href;
- let search = url.split('?')[1];
- let params = new URLSearchParams(search);
- let thid = params.get('thId');
- let iid = params.get('id');
- if (set.images[0].thid == thid) { set.images[0].id = iid; }
- }
- return set;
- }
- function iframeFetchImageIds() {
- let fetchSet = (new Storage('fetchSet')).value;
- if (!fetchSet) { return; }
- fetchSet = fetchImageIds(fetchSet)
- if (!fetchSet) { return; }
- (new Storage('fetchSet')).value = fetchSet;
- let href = null;
- let images = document.getElementsByClassName('iusc');
- if (images.length) { href = images[0].getAttribute('href'); }
- let image = document.getElementsByClassName('single-img-link')[0];
- if (image) { href = image.getAttribute('href'); }
- window.location.href = href;
- }
- function autoClick() {
- let autoOption = new Storage('autoOption');
- if (autoOption.value == 'OFF') { return; }
- let button = document.getElementById("request_button");
- button.click();
- }
- function updateAutoRequest() {
- let autoOption = new Storage('autoOption');
- if (autoOption.value == 'INF' || (autoOption.value == 'ON' && isDogged(document))) {
- setTimeout(autoClick, 3000);
- setInterval(autoClick, 10000);
- }
- }
- let updateLocalSets = (function() {
- var mobile = false;
- var tries = 3;
- var fetchSiteSets = function() { // fetch image sets from site and ad it to local stored sets
- if (checkForDuplicates(3)) {
- if (tries--) { setTimeout(fetchSiteSets, 1000); }
- if (debug) {
- let duplicates = (new Storage('duplicates', [])).value;
- duplicates.push(tries);
- (new Storage('duplicates', [])).value = duplicates;
- playAudio('debug');
- }
- return;
- }
- let siteSets = document.querySelectorAll('a.girr_set');
- let localSets = (new Storage('localSets', [])).value;
- for (let i = siteSets.length - 1; i >= 0; i--) {
- let siteSet = siteSets[i];
- let id = getId(siteSet.href);
- let exist = false;
- for (let localSet of localSets) {
- if (localSet.id != id) { continue; }
- exist = true;
- if (localSet.href.includes('?q=')) { localSet.href = siteSet.href; } // update href (pending request is done)
- if (localSet.status != 'pending') { continue; }
- let girrgrid = siteSet.childNodes[0];
- if (girrgrid.className.includes('inc')) { continue; } // set is not done
- if (parseInt(girrgrid.getAttribute('data-imgcount')) == 0) { localSet.status = 'blocked'; continue; }
- localSet.status = 'done';
- localSet.href = siteSet.href;
- for (let img of girrgrid.childNodes) {
- if (img.className == "gir_wide") { img = img.childNodes[0]; }
- if (!img.hasAttribute('src')) { continue; } // probably gipholder
- let image = {}
- image.src = img.src; // preview
- image.url = img.src.split('?')[0];
- let splits = img.src.split('/');
- image.thid = splits[splits.length - 1].split('?')[0]; // todo: use help function
- image.id = null;
- image.downloaded = (new Storage('autoDownload')).value ? 'pending' : 'skipped';
- image.edit = (new Storage('editOption')).value == 'L' ? 'pending' : 'skipped';
- //if (getLocalImage(image.thid) ) { continue; } // image exist already (probably due to load bug on recent set list)
- localSet.images.push(image);
- }
- (new Storage('newSetsCount')).value++;
- }
- if (exist) { continue; }
- let newSet = {};
- newSet.id = id;
- newSet.prompt = siteSet.title;
- newSet.date = getTimeStamp(new Date());
- newSet.href = siteSet.href;
- newSet.skey = null;
- newSet.images = [];
- newSet.status = 'pending';
- localSets.unshift(newSet);
- }
- (new Storage('localSets')).value = localSets;
- }
- var deleteOldSets = function() {
- let localSets = (new Storage('localSets')).value;
- localSets = localSets.slice(0, max_stored_sets);
- let count = 0;
- for (let set of localSets) {
- if (set.deleted) { continue; }
- if (!set.images.length) { continue; }
- count++;
- if (count > auto_delete_sets) {
- set.deleted = true;
- }
- }
- (new Storage('localSets')).value = localSets;
- }
- return function()
- {
- fetchSiteSets();
- deleteOldSets();
- }
- })();
- function updatePreviewImages() {
- let id = getId(window.location.href);
- let localSets = (new Storage('localSets')).value;
- for (let localSet of localSets) {
- if (localSet.id == id) {
- if (localSet.images.length && !localSet.images[0].id) {
- fetchImageIds(localSet);
- (new Storage('localSets')).value = localSets;
- }
- break;
- }
- }
- let previewImages = document.getElementsByClassName('mimg');
- if (!previewImages.length) { previewImages = document.getElementsByClassName('gir_mmimg'); }
- for (let previewImage of previewImages) {
- previewImage.addEventListener('click', function() {
- initDetailsPage();
- });
- }
- }
- function isSetIncomplete(set) {
- let girrgrid = set.childNodes[0];
- return girrgrid.className.includes('inc');
- }
- // add local stored sets to the "recent sets list"
- let updateSitePreviewSets = (function() {
- var selected = null;
- var addLocalPreviews = function() {
- let localSets = (new Storage('localSets')).value;
- if (!localSets) { return true; } // No local sets to add
- // fetch sets from site (recent list)
- let gircc = document.getElementById('girrcc');
- if (!gircc) { return true; } // no preview grid
- // clear recent list
- let siteSets = gircc.childNodes;
- let i = 0;
- while (i < siteSets.length) {
- let set = siteSets[i];
- if (isSetIncomplete(set)) { i++; continue; }
- set.remove();
- }
- let createElementSet = function(set, select) {
- let a = document.createElement('a');
- a.className = select ? 'girr_set seled' : 'girr_set ';
- a.title = set.prompt;
- a.setAttribute('data-imgcount', set.images.length.toString());
- a.role = 'button';
- a.typeof = 'button';
- a.href = set.href;
- if (mobile) {
- a.className = select ? 'girr_set girrcswp seled' : 'girr_set girrcswp';
- }
- let div = document.createElement('div');
- div.className = 'girrgrid ';
- div.setAttribute('data-imgcount', set.images.length.toString());
- a.appendChild(div);
- for (let image of set.images) {
- let img = document.createElement('img');
- img.src = image.src;
- if (image.hasOwnProperty('format') && image.format == 'landscape') {
- img.style.height = '57px';
- if (select) { a.setAttribute('data-imgcount', '2'); } //Hack a wide selection
- }
- img.alt = set.prompt;
- div.appendChild(img);
- }
- return a;
- };
- let createBlockedSet = function(set) {
- let a = document.createElement('a');
- a.className = (new Storage('hideFailed')).value ? 'girr_blocked hide' : 'girr_blocked';
- a.title = set.prompt;
- a.setAttribute('tabindex', '0');
- if (mobile) {
- //a.className = select ? 'girr_set girrcswp seled' : 'girr_set girrcswp';
- }
- a.appendChild(createElementFromHTML('<div class="girrgrid"><div class="gipholder"></div><div class="gipholder"></div></div>'));
- a.appendChild(createElementFromHTML('<div class="girr_blorur_info">' +
- '<div class="girr_blorur_icon"><span class="girr_blorur_blocked" role="presentation"></span></div>' +
- '<div class="girr_blorur_text"><span>Prompt blocked</span></div></div>'));
- return a;
- };
- // add local sets to the recent list
- let input = document.getElementById('girrfil_tog_input_show_deleted')
- let showDeleted = input.checked;
- let insert = null; //document.getElementById('girrcc').childNodes[0];
- for (let localSet of localSets) {
- if (localSet.deleted && !showDeleted) { continue; }
- let a = null;
- if (localSet.status == 'done') {
- let select = (localSet.id == getId(window.location.href));
- a = createElementSet(localSet, select);
- if (select) { selected = a; }
- }
- else if (localSet.status == 'blocked') {
- a = createBlockedSet(localSet);
- }
- if (!a) { continue; }
- if (!insert) {
- document.getElementById('girrcc').appendChild(a);
- insert = a;
- continue;
- }
- insertAfter(insert, a);
- insert = a;
- }
- };
- var addMenuButtons = function() {
- let gircc = document.getElementById('girrcc');
- if (!gircc) { return; } // no recent grid
- let createSetMenu = function(set_id) {
- let button = document.createElement('button');
- button.className = 'gi_btn_p menu';
- button.id = 'set_button';
- button.innerText = 'Menu';
- button.set_id = set_id;
- button.style.position = 'relative';
- button.style.width = '50px';
- button.style.height = '22px';
- button.style.marginLeft = '10px';
- button.style.marginTop = '-18px';
- if (mobile) {
- button.style.fontSize = '11pt'
- button.style.width = '';
- button.style.height = '50px';
- button.style.writingMode = 'vertical-rl';
- button.style.marginLeft = '-18px';
- button.style.marginTop = '';
- }
- button.addEventListener("mouseenter", function( event ) { event.target.style.backgroundColor = '#555'; }, false);
- button.addEventListener("mouseleave", function( event ) { event.target.style.backgroundColor = ''; }, false);
- button.addEventListener('click', function(event) {
- event.stopPropagation();
- let menu = document.getElementById('set-submenu');
- let download = document.getElementById('set-submenu-download');
- download.set_id = set_id;
- let requestEdit = document.getElementById('set-submenu-request-edit');
- requestEdit.set_id = set_id;
- let del = document.getElementById('set-submenu-delete');
- del.set_id = set_id;
- var rect = this.getBoundingClientRect();
- menu.style.display = 'block';
- menu.style.left = (rect.left - menu.offsetWidth - 10 + window.scrollX).toString() + 'px';
- menu.style.top = (rect.bottom - menu.offsetHeight - 10 + window.scrollY).toString() + 'px';
- if (mobile) {
- menu.style.left = (rect.left).toString() + 'px';
- menu.style.top = (rect.top - menu.offsetHeight - 10 + window.scrollY).toString() + 'px';
- }
- });
- let menu = document.createElement('div');
- menu.id = 'set-menu-' + set_id;
- menu.appendChild(button);
- return menu;
- }
- for (let set of gircc.childNodes) {
- let className = set.getAttribute('class');
- if (!className) { continue; }
- className = className.split(' ')[0];
- if (className != 'girr_set') { continue; }
- if (set.hasAttribute('menu')) { continue; }
- set.setAttribute('menu', '1');
- let menu = createSetMenu(getId(set.href));
- insertAfter(set, menu)
- }
- };
- var initUpdateHide = true;
- var updateHide = function() {
- let toggle = document.getElementById('girrfil_tog_input');
- if (!toggle) { return; }
- if (initUpdateHide) {
- initUpdateHide = false;
- let hideFailed = new Storage('hideFailed', false);
- if (hideFailed.value) { toggle.click() }
- toggle.addEventListener('click', function() {
- hideFailed.value = !hideFailed.value;
- });
- }
- }
- var scrollToSelected = function() {
- if (!selected) { return; }
- let gircc = document.getElementById('girrcc')
- if (mobile) {
- gircc.scrollLeft = selected.offsetLeft - gircc.offsetWidth/2;
- return;
- }
- gircc.scrollTop = selected.offsetTop - gircc.offsetHeight/2;
- }
- var adjustRecentWidth = function() {
- if (mobile) { return; }
- let small = false;
- let img = document.querySelector('.girrgrid[data-imgcount="1"] img');
- if (!img) { img = document.querySelector('.girrgrid img'); small = true}
- if (!img) { return; }
- let style = getComputedStyle(img);
- let width = parseInt(style.width);
- if (small) { width = width * 2 + 2; }
- let girrvc = document.getElementById('girrvc')
- girrvc.style.width = (width + 40).toString() + 'px';
- if (!navigator.userAgent.toLowerCase().includes('firefox')) { return; }
- girrvc.style.width = (width + 45).toString() + 'px';
- let girrcc = document.getElementById('girrcc')
- girrcc.style.width = (width + 35).toString() + 'px';
- }
- return function() {
- addLocalPreviews();
- addMenuButtons();
- updateHide();
- scrollToSelected();
- adjustRecentWidth();
- }
- })();
- var updateAutoDownload = (function() {
- var run = false;
- var force = false;
- return async function(doForce) {
- force = doForce || force;
- if (run) { return; }
- run = true;
- updateDownloadAllButton();
- let autoDownload = new Storage('autoDownload');
- while (true) {
- let restart = false;
- let localSets = (new Storage('localSets', [])).value;
- for (let i = localSets.length - 1; i >= 0; i--) {
- let localSet = localSets[i];
- let index = 0;
- for (let image of localSet.images) {
- index++;
- if (image.downloaded == 'downloaded') { continue; }
- if (image.downloaded == 'skipped' && !force) { continue; }
- downloadImage(image.url, localSet.date, localSet.prompt, index, localSet.images.length);
- image.downloaded = 'downloaded';
- (new Storage('localSets')).value = localSets;
- updateDownloadAllButton();
- await sleep(3000);
- restart = true;
- break;
- }
- if (restart) { break; }
- }
- if (!restart) {
- run = false;
- force = false;
- break;
- }
- }
- }
- })();
- function updateRequests() {
- let autoRequestCount = new Storage('autoRequestCount');
- if (!autoRequestCount.value) { return; }
- setTimeout(function() { doRequest(); }, ((new Storage('boostOption')).value =='U' && autoRequestCount.value < 3) ? 1500 : 0);
- autoRequestCount.value--;
- }
- let updateWorking = (function() {
- var reloadTimeOut = null;
- var hideLoaderImage = function() {
- let loader = elementLoaderImage(document);
- if (loader && hide_loader_image) { loader.style.display = "none"; }
- };
- return function() {
- if (isWorking(document)) {
- document.title = "Working..."
- setRequestButton('Creating', false, true);
- let reloadTime = parseInt(document.getElementById('reload_slider').getElementsByTagName('input')[0].value);
- if (!reloadTimeOut) { reloadTimeOut = setTimeout(function() { location.reload(); }, reloadTime*1000); }
- setObserver(function() { return elementPatiance(document); }, function() { setTimeout(function() { location.reload(); }, 2000); });
- setObserver(function() { return elementLoaderImage(document); }, hideLoaderImage);
- return true;
- }
- setRequestButton();
- if (reloadTimeOut) {clearTimeout(reloadTimeOut); reloadTimeOut = null; }
- return false;
- }
- })();
- function updateClickUnfinishedCell() {
- let top = 3
- let images = [];
- let sets = document.querySelectorAll('a.girr_set');
- for (let set of sets) {
- if (!top--) { break };
- if (isSetIncomplete(set)) {
- setTimeout(function() { isDogged(document) ? set.click() : location.reload(); }, 2000);
- return;
- }
- let girrgrid = set.childNodes[0];
- for (let img of girrgrid.childNodes) {
- if (img.className == "gir_wide") { img = img.childNodes[0]; }
- if (!img.hasAttribute('src')) { continue; } // probably gipholder
- let splits = img.src.split('/');
- let name = splits[splits.length - 1].split('?')[0];
- if (images.includes(name)) { setTimeout(function() { location.reload(); }, 2000); return; } // duplicate images in wrong set, need refresh
- images.push(name);
- }
- }
- if (isDogged(document)) {
- if (!(new Storage('newSetsCount')).value) { return; }
- sets = document.querySelectorAll('a.girr_set');
- for (let set of sets) { setTimeout(function() { set.click(); }, 2000); return; }
- }
- }
- let updateAutoRequests = (function() {
- var doAutoEditRequests = async function() {
- while (true) {
- let found = false;
- let localSet;
- let image;
- let localSets = (new Storage('localSets')).value;
- loop: for (localSet of localSets) {
- for (image of localSet.images) {
- if (image.edit == 'pending') {
- found = true;
- break loop;
- }
- }
- }
- if (!found) { return; }
- if (!localSet.skey || !image.id) {
- let fetchSet = new Storage('fetchSet');
- fetchSet.value = localSet;
- let iframe = document.getElementById('iframe');
- iframe.src = localSet.href;
- if (!await wait(function() { return !fetchSet.value; }, 10000)) {
- if (debug) { console.log('time out fetch skey and id'); }
- return;
- }
- continue;
- }
- requestEditByImageId(image.id);
- if (!await wait(function() {return !requestEditByImageId(); }, 30000)) {
- if (debug) { console.log('time out request edit'); }
- return;
- }
- }
- }
- return async function() {
- await doAutoEditRequests();
- updateAutoRequest();
- }
- })();
- let updateDone = (function() {
- return function() {
- document.title = 'Done!';
- if ((new Storage('autoOption')).value == 'ON' && (new Storage('newSetsCount')).value) {
- playAudio('done', 8000);
- }
- }
- })();
- function update() {
- updateLocalSets();
- updatePreviewImages();
- updateSitePreviewSets();
- updateAutoDownload();
- updateRequests()
- let working = updateWorking();
- if (working) {
- setObserver(function() { return !isWorking(document); }, function() { update(); });
- return;
- }
- updateClickUnfinishedCell();
- updateAutoRequests();
- updateDone();
- }
- var mobile = null;
- function initMobile() {
- mobile = document.head.querySelector('meta[name="mobileoptimized"]') ? true : false;
- }
- function initVersion() {
- let loggo = document.getElementById('giheadlgsrch');
- let version = createVersion();
- loggo.appendChild(version);
- }
- let initBanner = (function() {
- var addLastPrompt = function() {
- if (elementSearchBox(document).value) { return; }
- let lastPrompt = new Storage('lastPrompt', '');
- elementSearchBox(document).value = lastPrompt.value;
- }
- return function() {
- let banner = createBanner();
- let existingBanner = elementBanner(document);
- existingBanner.insertAdjacentElement('afterend', banner);
- setTheme();
- addLastPrompt();
- updatePromptLength();
- }
- })();
- function initSubMenu() {
- let subMenu = createSetSubMenu();
- let content = document.getElementById('gi_content')
- if (!content) { return; }
- content.appendChild(subMenu);
- }
- function initToolTip() {
- let toolTip = createToolTip();
- let content = document.getElementById('b_content')
- if (!content) { content = document.getElementById('bpage'); }
- if (!content) { return; }
- content.appendChild(toolTip);
- }
- function addHideDeletedSlider()
- {
- let girrvc = document.getElementById('girrvc');
- if (!girrvc) { return; }
- let girrheader = girrvc.getElementsByClassName('girrheader')[0];
- let slider = createSlider();
- girrheader.appendChild(slider);
- }
- function init() {
- initMobile();
- initVersion();
- initBanner();
- initSubMenu();
- initToolTip();
- addHideDeletedSlider();
- update();
- }
- let addEditButton = (function() { // replace share button with edit
- var navigationLeft = null;
- var navigationRight = null;
- return function() {
- let editButton = document.createElement('a');
- editButton.id = 'edit-button';
- editButton.textContent = 'Edit';
- editButton.target = '_blank';
- editButton.classList.add('action');
- editButton.classList.add('share');
- let updateButtons = function() {
- let navl = document.getElementById('navl');
- if (navl) {
- if (!navigationLeft) {
- navigationLeft = navl;
- if (navigationLeft) { navigationLeft.addEventListener('click', function() { setTimeout(updateButtons, 250); }); }
- }
- } else {
- navigationLeft = null;
- }
- let navr = document.getElementById('navr');
- if (navr) {
- if (!navigationRight) {
- navigationRight = navr;
- if (navigationRight) { navigationRight.addEventListener('click', function() { setTimeout(updateButtons, 250); }); }
- }
- } else {
- navigationRight = null;
- }
- let id = getId(window.location.href);
- let container = document.getElementById('canvas_cc');
- if (container) {
- container = container.getElementsByClassName('curr')[0];
- } else {
- container = document.getElementById('mainImageContainer');
- container = container.getElementsByClassName('mainImage current curimgonview')[0];
- }
- let img = container.getElementsByTagName('img')[0];
- let src = img.src;
- let splits = src.split('/');
- let thid = splits[splits.length - 1].split('?')[0];
- let localSets = (new Storage('localSets')).value
- let image = null;
- let localSet = null;
- loop: for (localSet of localSets) {
- if (localSet.id != id) { continue; }
- for (image of localSet.images) {
- if (image.thid == thid) { break loop; }
- }
- }
- let url = new URL(window.location.href.split('?')[0]);
- url.searchParams.append('id', image.id);
- url.searchParams.append('thId', image.thid);
- url.searchParams.append('FORM', 'GCRIDP');
- let href = url.href + '&edit=1&clientName=BING+CHAT&sappdirectloa=1&showselective=1&FORM=SYDBIC';
- editButton.href = href;
- }
- updateButtons();
- let share = elementShareButton(document);
- if (share) {
- share.innerHTML = "";
- share.appendChild(editButton);
- }
- setObserver(function() { return elementShareButton(document) && !document.getElementById('edit-button'); }, addEditButton);
- }
- })();
- function initDetailsPage()
- {
- let doc = document;
- let iframe = document.getElementById('OverlayIFrame')
- if (iframe) {doc = iframe.contentWindow.document; }
- let init = function() {
- addEditButton();
- iframeFetchImageSkey();
- }
- setObserver(function() { return doc.getElementsByClassName('action share rm nofocus').length; }, init, true, iframe);
- if (!remove_related_content) { return; }
- let removeRelatedContent = function() {
- let elements = doc.getElementsByClassName('idp-refresh-page-bottom-page');
- if (!elements.length) { return; }
- let div = elements[0];
- div.remove();
- }
- setObserver(function() { return doc.getElementsByClassName('idp-refresh-page-bottom-page').length; }, removeRelatedContent, true, iframe);
- }
- function autoLogin() {
- let loginAttempts = new Storage('loginAttempts', 0);
- if (!isLoggedOut(document)) {
- loginAttempts.value = auto_login ? 3 : 0;
- return false;
- }
- if (loginAttempts.value) {
- loginAttempts.value--;
- window.location.href = 'https://www.bing.com/images/create?sude=1';
- }
- return true;
- }
- function autoReload() {
- if (!elementBanner(document)) {
- setTimeout(function() { window.location.href = 'https://www.bing.com/images/create?'; }, 2000);
- return true;
- }
- return false;
- }
- function auto() {
- if (autoLogin()) { return; }
- if (autoReload()) { return; }
- }
- function load() {
- if (getUrlParam("FORM") == "BICREC") { return; }
- if (getUrlParam("FORM") == "GCRIDP") { initDetailsPage(); return; }
- if (inIframe()) {
- setObserver(function() { return document.getElementById('gir_async'); }, function() { setTimeout(iframeFetchImageIds, 1000); });
- return;
- }
- setObserver(function() { return elementBanner(document); }, function() { setTimeout(init, 0); } );
- setTimeout(auto, 3000);
- }
- window.onload = setTimeout(load, 0);
Advertisement
Add Comment
Please, Sign In to add comment