If you hate reading long texts, just read what's in bold, that's the most important.👍
Most of my On-Hold Animes are the ones that I wasn't able to find/ on the internet.The only exceptions are animes without the "I couldn't find" tag, I'm waiting for these to finish airing. (My On-Hold live actions and animes are one's that I cannot find!) If you have found any of them (even if they don't have subtitles and are in poor quality), please PM me 🙏! If you know that I'm missing something, please tell me! Click here to see the list of animes that I couldn't find
I have a little bit more than 234 animes (+29 animes that I watched when I was a kid) that I found on MAL, and "completed" and also Re-watched a lot of times, that I didn't put in MAL.
597 animes that I marked as completed are just music (excluding from this number the 3 "music" ReBoot, Shelter, and Change Our Mirai!: Our 7 Lights, because I consider them as being animes and not only music!)
There's a 95% chance that I've all the hard-to-find animes/live actions on my completed list in some kind of media form. Just talk to me.
I probably started watching anime in 2007/2008. I've just learned that I really liked animes when I was +/- 12 years old, that's when I started organizing my own Anime List.
I didn't watch any anime for 2 years! (From 16/09/2016 to +/- 20/09/2018!). All of my completed animes without start/end dates, are the ones that I've most likely watched before 16/09/2016!
(PS* I've also watched a lot of animes (MOSTLY MOVIES) after +/- 20/09/2018 and in 2019! But I didn't set any start/end dates for these animes anywhere, I just started doing it when I created my on MAL!).
PS* I have a total of +/- 194 animes on my completed list that are with just the approximated year. I have a total of 298 completed animes that I don't know when I started/finished them. (I will always add dates to all animes that I watch from now on, so this number will never be outdated!
My Anime Rating Scores are... (Mainly just) Trash(1)-Bad(4)-Good(7)-Great(9)(Almost became my favorite Anime)-(10)Excellent MasterPiece😍 (I also call some animes scored with 10 as Freaking Excellent! and FAVORITES!😍).
Score 1 TRASH!&( Freaking TRASH!) They can't be called animes at all!. There's a word in Japanese that is あの世 (Ano Yo), which means "The world of the dead", I think that a world with this name is a really awful place, and if there was a place in my mind like this, I would send all Animes scored with 1 to this place, to send them to the limbo of my mind! To forget them forever and ever if possible! Score 2 Appalling&(Almost 1(Trash)) - These animes are trash, but not enough to be called trash and rated with 1. Score 3 Horrible&(Almost, Almost 2(Trash)) These animes are not just bad (calling them bad would be too much praise for them). Score 4 - These animes are just Bad. Score 5(Almost 4(Bad)) These animes are neither bad neither fine. Score 6 Fine&(Almost 7(Good)) These animes are neither almost bad nor good.If a few things were different the anime could become good and be rated with 7.
I've probably just wasted my time watching Animes scored with 5,6 or less. (I mean that I wish I was watching an anime that I would rate with 7 or +).
Score 7 Good&(Almost, Almost 8) I've quickly checked all animes titles that I've scored 7 till April day 19 of 2020, and I can say that animes scored 7 were animes almost scored 8, but animes scored with 7 didn't have anything really really special that made me think about rating them with 8 or +. I enjoyed watching these animes, they probably made me laugh/cry and be involved with the story/characters at least a little bit (like at least for half of the whole anime), but animes scored with 8 did this almost all the time (or all the time). I can also totally recommend others to watch animes that I've scored with 7 or +! Score 8 Great&(Almost, Almost 9 (My favorite animes!)) - They would probably be my favorite animes in another parallel world... They were close to being scored with 9 because they are better than just good... But I can not really consider them as being almost my favorite animes... Score 9 Almost became 10 (My favorite animes) Score 10 Are my favorites ones 😍
I always heard that Naruto and animes were for gays and nerds, on a beautiful day I chose to try to DDOS a Naruto website, but then I thought "Is this "rumor" true?, Can I really know it without watching animes/naruto?".
I chose to watch a few episodes and then I fell in love with Naruto and this Crazy World.
The list is organized in the following way - LIVE ACTION NAME, SCORE, RELEASE YEAR - DURATION/EPS (STATUS)
Live actions without status are just completed. (If you find a link to watch my On-Hold live actions (or if you have them) please PM me!)🙏.They don't have to be subbed and can be of any quality. If you know that I'm missing something, please tell me!🙏
The list order doesn't mean anything. I will be keeping track of them here.
I've tried to find ALL Live actions on 02/May/2020, for every single anime that I've watched till 02/May/2020.
Colorful (2000) 1h 38min (On-Hold,not found online)
Iketeru Futari (2009) 1h 19min (On-Hold,not found online)
Toki wo Kakeru Shoujo (1972) 2 eps (On-Hold, not found online)
Toki wo Kakeru Shoujo (1997) 1h 46min (On-Hold, not found online)
Toki wo Kakeru Shoujo (1983) short story (On-Hold, not found online)
Arakawa Under the Bridge Special (2012), 1 special ep of 24min (On-Hold, not found online)
Ultraman (Live-Action series, watched when I was a kid so I won't really count this one) Futari Ecchi (Dropped all the live actions)
Nozoki Ana (2014) 2h 10min (Dropped)
March Comes in Like a Lion (2017) 2h 18min (Dropped)
March Comes in Like a Lion 2 (2017) 2h 19min (Dropped)
Beck,1,(2010) 2h 26min
Nana,6,(2005) 1h 53min
Gantz,5,(2011) 2h 10min
Nana 2,5,(2006) 2h 10min
ReLIFE,4,(2017) 1h 59min
Orange,6,(2015) 2h 19min
Nisekoi,10,(2018) 1h 56min
Mushishi,4,(2007) 2h 11min
Another,10,(2012) 1h 49min
Inuyashiki,6,(2018) 2h 6min
Tokyo Revengers,7,(2021) 2h
Re/Member,5,(2022) 1h 42min
Homestay,10,(2018) 2h 16min
Usagi Drop,6,(2011) 1h 53min
Ousama Game,3,(2011) 1h 22min
Tokyo Ghoul,5,(2017) 1h 59min
Black Butler,6,(2014) 1h 59min
Silver Spoon,4,(2014) 1h 50min
Corpse Party,6,(2015) 1h 34min
Jigoku Shoujo,8,(2019) 1h 47min
Another Gantz,4,(2011) 1h 37min
Time Traveller,9,(2010) 2h 2min
The Borrowers,8,(1997) 1h 29min
Tokyo Ghoul S,5,(2019) 1h 40min
xxxHolic,5,(2013) 8 eps of 26min
Lovely★Complex,10,(2006) 1h 39min
Parasyte: Part 1,7,(2014) 1h 49min
Parasyte: Part 2,6,(2015) 1h 57min
One Piece,10,(2023) 8 eps of 1h
Sukitte ii na yo,4,(2014) 1h 43min
Kakegurui,6,(2018) 10 eps of 24min
Detroit Metal City,4,(2008) 1h 44min
Ghost in the Shell,10,(2017) 1h 47min
Kakegurui the Movie,9,(2019) 1h 59min
Grave of the Fireflies,4,(2008) 1h 40min
Kakegurui Twin,6,(2021) 8 eps of 26min
Fullmetal Alchemist 1,7,(2017) 2h 13min
GANTZ Perfect Answer,5,(2011) 2h 42min
Baccano Audio Drama,5,(2007) 19 eps 1h
Toki wo Kakeru Shojo,4,(1983) 1h 44min
Grave of the Fireflies,10,(2005) 2h 28min
Yakusoku no neverland,8,(2020) 1h 59min
Shigatsu wa Kimi no Uso,6,(2016) 2h 1min
Kiki's Delivery Service,9,(2014) 1h 48min
Assassination Classroom,7,(2015) 1h 50min
Blood: The Last Vampire,7,(2009) 1h 31min
Kakegurui Season 2,5,(2019) 5 eps of 24min
Arakawa Under the Bridge,3,(2012) 1h 55min
Bungo Stray Dogs: Beast,10,(2022) 2h 14min
I"s (Pure),7,(2018) 13 eps of 54min per ep
Kimi no suizou wa tabetai,7,(2017) 1h 55min
Death Note,10,(2015) 11 eps of 45min per ep
Hyouka: Forbidden Secrets,8,(2017) 1h 54min
Kanojo, Okarishimasu,7,(2022) 10 eps of 23min
Gokushufudou,6,(2020) 10 eps of 46min per ep
Isshuukan Friends,7,(2017) live action of 2h
Death Note: The First Name,10,(2006) 2h 6min
Death Note: The Last Name,10,(2006) 2h 21min
Cowboy Bebop,8,(2021) 10 eps of 40min per ep
Erased (Boku Dake ga Inai Machi),8,(2016) 2h
Wotaku ni Koi wa Muzukashii,8,(2020) 1h 54min
Jigoku Shoujo,9,(2006) 12 eps of 24min per ep
Danshi Koukousei no Nichijou,3,(2013) 1h 25min
Corpse Party: Book of Shadows,4,(2016) 1h 27min
Hanbun no Tsuki ga Noboru Sora,4(2010) 1h 52min
Death Note L: Change the World,10,(2008) 2h 9min
Kaguya-sama: Love Is War Final,10,(2021) 1h 56min
Asura Girl: A Blood-C Tale(iken),5,(2017) 1h 29min
Alice in borderland,7,(2020) 16 eps (Total 893min)
Shinigami no Ballad,4,(2007) 12 eps of 25min per ep
Fullmetal Alchemist 2: Revenge Scar,7,(2022) 2h 5min
Gokushufudou Bakusho! Kachikomi SP,5,(2022) 1h 33min
Toki wo Kakeru Shoujo,7,(2016) 5 eps of 54min per ep
Haganai: I Don't Have Many Friends,5,(2014) 1h 54min
Assassination Classroom: Graduation,7,(2016) 1h 58min
Death Note: Light Up the New World,10,(2016) 2h 14min
Shingeki no Kyojin: End of the World,7?,(2015) 1h 26min
Kakegurui 2: Ultimate Russian Roulette,5,(2021) 1h 59min
Morning Musume: Shinshun! Love Stories,4,(2002) 2h 14min
Fullmetal Alchemist 3: Final Transmutation,7,(2022) 2h 24min
Arakawa Under The Bridge,3,(2011) 10 eps of 25min per ep
The Way of the Househusband: The Movie,6,(2022) 1h 57min
Toki wo Kakeru Shoujo,5, (Fuji TV, 1985), 1h 11min (1 ep)
Prison School(Kangoku Gakuen),8,(2015) 9 eps of 24min per ep
Kuzu no Honkai,8,(2017) 12_eps_of_28min per ep (Total 328min)
Hanbun no tsuki ga noboru sora,7,(2006) 13 eps of 25min per ep
Kimi ni todoke,8,(2010) 2h_8min (Re-Watched 2x) (Total 256min)
Kaguya-sama: Love is War - Mini,7,(2021) 5 eps of 10min per ep
Death Note: Light Up the New World (Netflix),10,(2017) 2h 14min
Tokyo Revengers 2: Bloody Halloween - Destiny,7,(2023) 1h 30min
Erased (Boku Dake ga Inai Machi),9,(2017) 12 eps of 28min per ep
Alita: Battle Angel,7,(2019) 2h_2min (Re-Watched 2x) (Total 324min)
Saikin, Imouto no Yousu ga Chotto Okashiinda ga.,8,(2014) 1h 57min
Mirai Nikki Live Action: Another World,10,(2012) 11 eps of 35min per ep
Tokyo Revengers 2: Bloody Halloween - Decisive Battle,8,(2023) 1h 36min
Tonari No Seki-Kun To Rumi-Chan No Jishou,5,(2015) 8 eps of 24min per ep
Shingeki no Kyojin (ATTACK ON TITAN THE MOVIE),10,(2015) PART 2, 1h 27min
Shingeki no Kyojin (ATTACK ON TITAN THE MOVIE),10,(2015) PART 1, 1h 38min
The Kingdom of Dreams and Madness,10,(2013) (Ghibli Documentary) 1h 58min
Ano hi mita hana no namae wo boku wa shiranai (AnoHana),10,(2015) 1h 53min
Kaguya-sama wa kokurasetai ~ Tensai tachi no ren'ai zunô sen,10,(2019) 1h 53min
The Ingenuity of the House Husband,6,(2021) 10_eps_of_5min per ep, (Total 45min)
Toki wo Kakeru Shoujo,6,(1994) 5 eps of 46min per ep from 1994-Feb-19 to 1994-Mar-19
Yamishibai: Japanese Ghost Stories, Dark Drama (Raw) (2020),2,(2020) 12 eps of 23min per ep
Yamada-kun to 7-nin no Majo,7,(2013) 8_eps_of_36min per ep (But ep 2 has 38min) (Total 290min)
Death Note: New Generation,10,(2016) 3_eps_of_20min per ep,1_ep_of_20min,2_ep_of_22min,3_ep_of_27min (Total 68min)
Shingeki no Kyojin Attack on Titan: Counter Rockets, also known as Attack on Titan: Hangeki no Noroshi and Attack on Titan: Smoke Signal of Fight Back,10,(2015) 3_eps_of_30min per ep,1_ep_of_28min and 2_ep_of_32min, 3_ep_of_40min (Total 100min)
Live-Actions/Doramas: Total Watched=107 | Total Time Spent=17274.min
Animes that have only the "Re-watched" tag, are the ones that I've Watched once and then Re-Watched only 1 time.
Because MAL doesn't feature an easy way to check what anime you have re-watched, I will be keeping track of them using the tags feature.
Category 1 = Animes WITH Scores and WITH the "Dropped" tag are the ones that I've really tried to watch but dropped.To accurately see which Animes I tried to watch and dropped (and how many), open my dropped list and click on the score, or click here!
Category 2 = Animes WITHOUT the Dropped tag and WITHOUT scores, are actually my "Don't wanna watch list", I've never tried to watch these. This includes ALL HENTAIS, ALL YAOIS, ALL CHINESE AND KOREAN ANIMES ON MAL, AND THEIR RELATED ENTRIES!
*If I counted my dropped animes from the 3 categories without counting ALL HENTAIS, ALL YAOIS, ALL CHINESE AND KOREAN ANIMES ON MAL, AND THEIR RELATED ENTRIES, I would have less than 400 dropped animes.
Category 3 = Animes WITHOUT scores but WITH the "Dropped" tag, are somehow connected with Category 1 (Category 1 = an Anime that I've tried to watch, scored, and dropped).To accurately see Category 1 and 3 (and their total number), open my dropped list and click on the Dropped tag, or click here!
(Category 3 Example: I watched some (or all the) eps of the 1 season of an Anime (that I scored and has the tag "Dropped"), and if I didn't like that 1 season I will also drop the Anime OVA's, specials and everything else related to that anime on MAL). I do that because when (and if) I accidentally open their page on MAL, I can quickly know that I can close that anime page.
I've never tried to watch half of the anime that are in my Dropped List, because half of them are just my "Don't wanna watch list" (Category 2)!
(Total of 29 Animes!)
I didn't put them in MAL because I didn't want to mess up the MAL and Anime Graph Numbers. The list order doesn't mean anything.
I don't a lot of things about most of them, nor how many eps I watched/re-watched, that's also why I didn't put them in my MAL list. I watched all of them dubbed and out of order on TV, so it's hard for me to consider some of them as being real Japanese anime.
Pucca
Hamtaro
Pokémon
Stitch!
Beyblade
Inuyasha
Yu-Gi-Oh!
Beast Wars
Dragon Ball
Speed Racer
ThunderCats
Transformers
Yu-Gi-Oh! GX
Dragon Ball GT
Monster Rancher
Digimon Frontier
Digimon Adventure
Pingu in the City
Konjiki no Gash Bell!!
Bakugan Battle Brawlers
Yu-Gi-Oh! Duel Monsters
Dragon Ball Z (Plus a few movies)
Saint Seiya: Knights of the Zodiac
Medabots (80% sure that I watched this)
Hana no Ko Lunlun (I'm not sure about this one)
MegaMan NT Warrior (80% sure that I watched this)
Ultraman (Live-Action series, so I won't count this one)
Beast Wars Second Chou Seimeitai Transformers: Lio Convoy Kiki Ippatsu! Movie
Fullmetal Alchemist (I had the original DVD and I probably re-watched the DVD 2+ times)
Sem to Chihiro no Kamikakkushi (Because I watched it when I was I kid, I can count that I watched this anime 2x, but I've chosen not to put it as re-watched it in MAL)
also looks like Imagen 3.0 costs 0.03 cents per image which isn't crazy expensive, but it adds up especially if numberOfImages is 4, so best to use gemini-2.0-flash-exp-image-generation by default and check their api key if imagen 3.0 exists then have a checkbox or setting that becomes visible so if they have imagen 3.0 they can click on it to enable it.
that way you can fine tune your prompts for free before using Imagen.
// ==Script==
// @name Highlight & Gemini Interaction
// @namespace http://tampermonkey.net/
// @version 0.0
// @description Highlight text, offers options (text, translate, image), to interact with Gemini AI.
// @author You
// @match *://*/*
// @grant GM_xmlhttpRequest
// @grant GM_addStyle
// @require https://code.jquery.com/jquery-3.6.0.min.js
// @require https://cdn.jsdelivr.net/npm/marked/marked.min.js
// @grant GM_setValue
// @grant GM_getValue
// @run-at document-end
// @connect google.com
// @connect generativelanguage.googleapis.com
// ==/Script==
(function() {
'use strict';
// Global Variables
let selectedText = '';
let geminiOverlay;
let promptOverlay;
let inputArea;
let responseArea;
let closeButton;
let translateButton;
let imageButton;
let textButton;
let askButton;
let imageCheckbox;
let imageCheckbox2;
const textModel = 'gemini-1.5-flash';
const imageModel = 'gemini-2.0-flash-exp-image-generation';
const imagenModel = 'imagen-3.0-generate-002';
let generateImageModel = imageModel;
// API Key Setup
if ((location.href === 'https://aistudio.google.com/app/apikey' && document.querySelector(".apikey-link") !== null) && (GM_getValue("APIKey") === undefined || GM_getValue("APIKey") === null || GM_getValue("APIKey") === '')) {
window.onload = setTimeout(function() {
document.querySelectorAll(".apikey-link")[1].click();
setTimeout(function() {
GM_setValue("APIKey", document.querySelector(".apikey-text").innerText);
alert((GM_getValue("APIKey") !== undefined && GM_getValue("APIKey") !== null && GM_getValue("APIKey") !== '') ? 'API Key automatically added!' : 'Failed to automatically add API Key!');
}, 500);
}, 1000);
}
// --- HELPER FUNCTION TO EXTRACT TEXT ---
function tryExtractText(data) {
const possiblePaths = [
() => data?.candidates?.[0]?.content?.parts?.[0]?.text,
() => data?.content,
() => data?.choices?.[0]?.message?.content,
() => data?.response?.candidates?.[0]?.content?.parts?.[0]?.text //Another possibility
];
for (const pathFn of possiblePaths) {
try {
const text = pathFn();
if (text) {
console.log("Text Extracted with PATH:", pathFn.name);
return text;
}
} catch (e) {
console.warn("Path extraction failed", pathFn.name, e);
}
}
return null;
}
// ... (previous code before callGeminiAPI function)
// Function to handle API requests
function callGeminiAPI(prompt, callback, model = textModel, isImage = false) {
console.log("callGeminiAPI called with prompt:", prompt, " and model:", model, " and isImage:", isImage);
let requestData;
const responseModalities = isImage ? ['TEXT', 'IMAGE'] : ['TEXT'];
let generateContentEndpoint = isImage ? 'predict' : 'generateContent';
if (model !== imagenModel) {
generateContentEndpoint = 'generateContent'; // For other models, it's 'generateContent'
console.log(`https://generativelanguage.googleapis.com/v1beta/models/${model}:${generateContentEndpoint}?key=`);
requestData = JSON.stringify({
contents: [{
parts: [{
text: prompt
}]
}],
generationConfig: {
response_modalities: responseModalities
}
});
} else {
console.log(`https://generativelanguage.googleapis.com/v1beta/models/${model}:${generateContentEndpoint}?key=`);
requestData = JSON.stringify({
instances: [
{ "prompt": prompt }
],
parameters: {
numberOfImages: 4,
personGeneration: "allow_all"
}
});
}
GM_xmlhttpRequest({
method: 'POST',
url: `https://generativelanguage.googleapis.com/v1beta/models/${model}:${generateContentEndpoint}?key=${GM_getValue("APIKey")}`,
headers: {
'Content-Type': 'application/json'
},
data: requestData,
onload: function(response) {
console.log("Gemini API response:", response);
console.log("Raw response text:", response.responseText);
generateImageModel = imageModel;
try {
const data = JSON.parse(response.responseText);
if (isImage) { // Handle image responses
if (model === imagenModel && data && data.predictions && data.predictions.length > 0) {
// Handle Imagen Model response structure (multiple images)
const generatedImages = [];
for (const prediction of data.predictions) {
if (prediction.mimeType && prediction.bytesBase64Encoded) {
const imageSrc = `data:${prediction.mimeType};base64,${prediction.bytesBase64Encoded}`;
generatedImages.push(imageSrc);
}
}
if (generatedImages.length > 0) {
callback({
imagesSrc: generatedImages, // Changed to an array of image sources
imageText: null // Imagen response typically only returns image data
});
} else {
callback("Error: Imagen response missing image data for all predictions.");
}
} else if (data && data.candidates && data.candidates[0] && data.candidates[0].content && data.candidates[0].content.parts) {
// Handle standard Gemini image responses (single image)
const parts = data.candidates[0].content.parts;
let imageSrc = null;
let imageText = null;
for (const part of parts) {
if (part.inlineData && part.inlineData.mimeType && part.inlineData.data) {
const base64Data = part.inlineData.data;
imageSrc = `data:${part.inlineData.mimeType};base64,${base64Data}`;
} else if (part.text) {
imageText = part.text;
}
}
if (imageSrc) {
callback({
imageSrc: imageSrc, // Single image source
imageText: imageText
});
} else {
callback("Error: No image data found in the response for non-Imagen model.");
}
} else {
callback("Error: Could not retrieve image data. Check JSON structure or model type. See console for raw response.");
}
} else { // Handle non-image responses
const extractedText = tryExtractText(data);
if (extractedText) {
callback(extractedText);
} else {
callback("Error: Could not retrieve text response from Gemini. Check JSON structure. See console for raw response.");
}
}
} catch (e) {
console.error("Error parsing JSON:", e);
console.log("Raw response text:", response.responseText);
callback("Error: Could not parse JSON response from Gemini.");
}
},
onerror: function(error) {
console.error("Gemini API Error:", error);
callback("Error: Failed to connect to Gemini API.");
}
});
}
// ... (rest of your code, especially generateImage function)
// You will also need to modify your generateImage function to handle the array of images:
function generateImage(text, callback) {
console.log("generateImage called with text:", text);
const imagePrompt = `Generate an image based on the following text: ${text}`;
responseArea.innerHTML = "Generating image(s)..."; // Update loading message
callGeminiAPI(imagePrompt, function(response) {
if (typeof response == 'object' && response !== null && response.imagesSrc) {
responseArea.innerHTML = ''; // Clear previous content
// Loop through each image source and append it
response.imagesSrc.forEach(src => {
const img = document.createElement('img');
img.src = src;
img.style.maxWidth = '100%'; // Ensure images fit
img.style.display = 'block'; // Stack images vertically
img.style.marginBottom = '10px'; // Add some spacing
responseArea.appendChild(img);
});
if (response.imageText) { // This part might not be used for Imagen, but good to keep for consistency
const textDiv = document.createElement('div');
textDiv.textContent = response.imageText;
responseArea.appendChild(textDiv);
}
callback(response);
} else if (typeof response == 'object' && response !== null && response.imageSrc) {
// Handle single image response from non-Imagen models (if applicable)
responseArea.innerHTML = '';
const img = document.createElement('img');
img.src = response.imageSrc;
img.style.maxWidth = '100%';
responseArea.appendChild(img);
if (response.imageText) {
const textDiv = document.createElement('div');
textDiv.textContent = response.imageText;
responseArea.appendChild(textDiv);
}
callback(response);
} else {
responseArea.innerHTML = response; // Display error or text response directly
callback(response);
}
}, generateImageModel, true);
}
// Function to translate text
function translateText(text, language, callback) {
console.log("translateText called with text:", text, "and language:", language);
if (language = null) language = "English";
const translationPrompt = `Translate the following text to ${language}: ${text}`;
callGeminiAPI(translationPrompt, function(response) {
responseArea.innerHTML = response;
callback(response);
}, textModel, false);
}
// ------------------------------ createGeminiOverlay function ------------------------------
function createGeminiOverlay() {
console.log("createGeminiOverlay called");
geminiOverlay = document.createElement('div');
geminiOverlay.id = 'geminiOverlay';
geminiOverlay.style.cssText = `
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background-color: #fff;
border: 1px solid #ccc;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
padding: 20px;
z-index: 10000;
width: 600px;
max-height: 80vh;
overflow-y: auto; /* Enable scrolling if content overflows */
border-radius: 8px;
font-family: sans-serif;
color: black !important;
`;
closeButton = document.createElement('button');
closeButton.textContent = 'X';
closeButton.style.cssText = `
position: absolute;
top: 5px;
right: 5px;
background-color: #f44336;
color: white;
border: none;
padding: 5px 10px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 12px;
cursor: pointer;
border-radius: 4px;
`;
closeButton.addEventListener('click', closeGeminiOverlay);
geminiOverlay.appendChild(closeButton);
responseArea = document.createElement('div');
responseArea.id = 'geminiResponse';
responseArea.style.cssText = `
margin-bottom: 10px;
padding: 10px;
border: 1px solid #eee;
border-radius: 4px;
min-height: 50px;
font-size: 14px;
overflow-wrap: break-word;
white-space: pre-wrap; /* Important for preserving formatting */
`;
geminiOverlay.appendChild(responseArea);
inputArea = document.createElement('textarea');
inputArea.id = 'geminiInput';
inputArea.placeholder = 'Ask a question about the text...';
inputArea.style.cssText = `
width: 95%;
padding: 8px;
margin-bottom: 10px;
border: 1px solid #ccc;
border-radius: 4px;
font-size: 14px;
resize: vertical;
min-height: 50px;
`;
geminiOverlay.appendChild(inputArea);
// Button container
const buttonContainer = document.createElement('div');
buttonContainer.style.cssText = `
display: flex;
justify-content: flex-end;
gap: 10px;
margin-top: 10px;
`;
geminiOverlay.appendChild(buttonContainer);
// Image Checkbox
imageCheckbox = document.createElement('input');
imageCheckbox.type = 'checkbox';
imageCheckbox.id = 'generateImageCheckbox';
const imageCheckboxLabel = document.createElement('label');
imageCheckboxLabel.textContent = 'Generate Image';
imageCheckboxLabel.htmlFor = 'generateImageCheckbox';
buttonContainer.insertBefore(imageCheckboxLabel, buttonContainer.firstChild);
buttonContainer.insertBefore(imageCheckbox, buttonContainer.firstChild);
// Image Checkbox 2
imageCheckbox2 = document.createElement('input');
imageCheckbox2.type = 'checkbox';
imageCheckbox2.id = 'generateImageCheckbox2';
const imageCheckboxLabel2 = document.createElement('label');
imageCheckboxLabel2.textContent = '$$$ Imagen $$$';
imageCheckboxLabel2.htmlFor = 'generateImageCheckbox2';
buttonContainer.insertBefore(imageCheckboxLabel2, buttonContainer.firstChild);
buttonContainer.insertBefore(imageCheckbox2, buttonContainer.firstChild);
askButton = document.createElement('button');
askButton.textContent = 'Ask Gemini';
askButton.style.cssText = `
background-color: #4285f4; /* Gemini Blue */
color: white;
border: none;
padding: 8px 16px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
cursor: pointer;
border-radius: 4px;
`;
askButton.addEventListener('click', () => {
console.log("Ask Gemini button clicked");
const question = inputArea.value;
const generateImageFlag = imageCheckbox.checked;
const generateImageFlag2 = imageCheckbox2.checked;
console.log("generateImageModel: ", generateImageFlag2);
responseArea.textContent = "Loading...";
if (question) {
if (generateImageFlag || generateImageFlag2) {
if (generateImageFlag2) generateImageModel = imagenModel;
generateImage(selectedText + "\n 's question: " + question, function(response) {
// --- START OF MODIFIED SECTION ---
if (typeof response == 'object' && response !== null && response.imagesSrc) { // Check for imagesSrc array
responseArea.innerHTML = ''; // Clear previous content
// Loop through each image source and append it
response.imagesSrc.forEach(src => {
const img = document.createElement('img');
img.src = src;
img.style.maxWidth = '100%'; // Ensure images fit
img.style.display = 'block'; // Stack images vertically
img.style.marginBottom = '10px'; // Add some spacing
responseArea.appendChild(img);
});
if (response.imageText) { // This part might not be used for Imagen
const textDiv = document.createElement('div');
textDiv.textContent = response.imageText;
responseArea.appendChild(textDiv);
}
} else if (typeof response == 'object' && response !== null && response.imageSrc) {
// Fallback for single image (e.g., if you switch back to a Gemini image model)
responseArea.innerHTML = '';
const img = document.createElement('img');
img.src = response.imageSrc;
img.style.maxWidth = '100%';
responseArea.appendChild(img);
if (response.imageText) {
const textDiv = document.createElement('div');
textDiv.textContent = response.imageText;
responseArea.appendChild(textDiv);
}
}
else {
responseArea.innerHTML = response; // Display error or text response
}
// --- END OF MODIFIED SECTION ---
});
} else {
callGeminiAPI(selectedText + "\n 's question: " + question, function(response) {
responseArea.innerHTML = response;
});
}
}
});
buttonContainer.appendChild(askButton);
document.body.appendChild(geminiOverlay);
// Add event listener to close overlay when clicking outside
document.addEventListener('mousedown', outsideClickListener);
}
// ------------------------------ createPromptOverlay function ------------------------------
function createPromptOverlay() {
console.log("createPromptOverlay called");
// Remove existing prompt overlay
let existingPromptOverlay = document.getElementById('promptOverlay');
if (existingPromptOverlay) {
closePromptOverlay();
}
promptOverlay = document.createElement('div');
promptOverlay.id = 'promptOverlay';
promptOverlay.style.cssText = `
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background-color: #fff;
border: 1px solid #ccc;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
padding: 10px;
z-index: 10001; /* Higher than Gemini overlay */
border-radius: 5px;
display: flex;
gap: 5px;
color: black !important;
`;
textButton = document.createElement('button');
textButton.textContent = 'Text';
textButton.addEventListener('click', (event) => {
console.log("Text button clicked");
event.stopPropagation();
closePromptOverlay();
createGeminiOverlay();
callGeminiAPI(selectedText, function(response) {
responseArea.innerHTML = response;
});
});
promptOverlay.appendChild(textButton)
translateButton = document.createElement('button');
translateButton.textContent = 'Translate';
translateButton.addEventListener('click', (event) => {
console.log("Translate button clicked");
event.stopPropagation();
closePromptOverlay();
createGeminiOverlay();
const language = prompt("Enter target language (e.g., Spanish, French):");
if (language) {
translateText(selectedText, language, function(response) {
responseArea.innerHTML = response;
});
} else {
alert("Please enter a language.");
}
});
promptOverlay.appendChild(translateButton);
imageButton = document.createElement('button');
imageButton.textContent = 'Image';
imageButton.addEventListener('click', (event) => {
console.log("Image button clicked");
event.stopPropagation();
closePromptOverlay();
createGeminiOverlay();
responseArea.textContent = "Generating image...";
generateImage(selectedText, function(response) {});
});
promptOverlay.appendChild(imageButton);
document.body.appendChild(promptOverlay);
return promptOverlay;
}
// ------------------------------ Helper Functions (closeOverlay, outsideClickListener) ------------------------------
function closeGeminiOverlay() {
console.log("closeGeminiOverlay called");
if (geminiOverlay) {
geminiOverlay.remove();
geminiOverlay = null;
}
document.removeEventListener('mousedown', outsideClickListener);
}
function closePromptOverlay() {
console.log("closePromptOverlay called");
if (promptOverlay) {
promptOverlay.remove();
promptOverlay = null;
}
}
function outsideClickListener(event) {
if (geminiOverlay && !geminiOverlay.contains(event.target)) {
closeGeminiOverlay();
}
}
// ------------------------------ Event Listener for Mouseup ------------------------------
document.addEventListener('mouseup', function(event) {
if (GM_getValue("APIKey") === undefined || GM_getValue("APIKey") === null || GM_getValue("APIKey") === '') {
GM_setValue("APIKey", prompt('Enter your API key\n*Press OK\n\nYou can get a free API key at https://aistudio.google.com/app/apikey'));
}
if (GM_getValue("APIKey") !== null && GM_getValue("APIKey") !== '') {
selectedText = window.getSelection().toString().trim();
console.log("mouseup event - selectedText:", selectedText);
// Check if the click occurred inside the promptOverlay
if (promptOverlay && promptOverlay.contains(event.target)) {
console.log("Click inside promptOverlay, not closing.");
return;
}
if (selectedText) {
createPromptOverlay();
} else {
closePromptOverlay();
}
}
});
// ------------------------------ CSS Styling ------------------------------
GM_addStyle(`
#promptOverlay button {
background-color: #4285f4;
color: white;
border: none;
padding: 8px 12px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
cursor: pointer;
border-radius: 4px;
}
#promptOverlay button:hover {
background-color: #1a73e8;
}
`);
})();
Edit:
actually, just tested it again with a new project and API key and for some reason Imagen shows up on 2nd page still without even needing to add billing or Vertex AI API to that project or API key, but will return with "Imagen API is only accessible to billed s at this time." so doesn't look like we need to check for what api models they have.
ah, okay, I just been clicking REST on the doc pages of the models, so that will be a bit easier, but so far the URL is pretty easy since the only thing that changes is the model name and edGenerationMethods
I figured it out, I was using the wrong responseModalities/Post Parameters for data when I switched from gemini-2.0-flash-exp-image-generation:generateContent to imagen-3.0-generate-002:predict
tried starting a trial for gemini pro, added billing to my cloud project and api key to Tier 1 and enabled Vertex AI API and it's still not letting me use Imagen 3.0, so seems to be a pain to even access.
Well that is why i said collective answers not individual answers. It essentially follows patterns in text of common words and order of them that appear. That is why it also can hallucinate because similar patterns leading to very different answers can make it respond strangely.
Well you just ask. All it is doing is taking info from past questions people have asked and spitting back out a collective answer is how I understand it.
Well not really too different from before with everyone just looking if some code is already made and copy and pasting it. It kept making huge errors like trying to create logs then later id say it has errors what are they then it says that is trying to log when it shouldnt for a bookmarklet, then it later in another round adds it again lol
I wound up getting bored and tried to see what happens if i vibe coded a bookmarklet for the lulz. I basically just kept hounding gpt4 via duck.ai if anything was wrong with the code it showed me by just copy and pasting it after a question as if it is new so it wouldnt be argumentative trying to defend it lol It is supposed to fix broken images. obviously it has issues like there should be no comments in a bookmarklet.
javascript:(function() {
var imgs = document.getElementsByTagName('img');
var failedImages = []; // Array to track failed images
Array.from(imgs).forEach(function(img) {
if (img.complete && img.naturalHeight === 0) {
var attempts = parseInt(img.getAttribute('data-reload-attempts')) || 0;
if (++attempts <= 3) {
img.src = img.src.split('?')[0] + '?t=' + Date.now();
img.setAttribute('data-reload-attempts', attempts);
// Reset attempts on successful load
img.onload = function() {
img.removeAttribute('data-reload-attempts');
};
} else {
// Track failed images
failedImages.push(img.src);
}
}
});
// Provide to the if there are failed images
if (failedImages.length > 0) {
alert('Some images failed to load after 3 attempts:\n' + failedImages.('\n'));
}
})();
All Comments (1300) Comments 1g2i5a
Sure whatever you need, anytime, I'll see what I can do.
that way you can fine tune your prompts for free before using Imagen.
Edit:
actually, just tested it again with a new project and API key and for some reason Imagen shows up on 2nd page still without even needing to add billing or Vertex AI API to that project or API key, but will return with "Imagen API is only accessible to billed s at this time." so doesn't look like we need to check for what api models they have.
https://ai.google.dev/gemini-api/docs/image-generation#imagen
but the problem is the only edGenerationMethods was "predict" which didn't work, not sure why generateImage or generateImages isn't showing up so maybe still a problem with how I'm configuring it, I tried https://us-central1-aiplatform.googleapis.com/v1/projects/my-google-cloud-project-12345/locations/us-central1/models/imagen-3.0-generate-002:predict with no success either
though I tried to list the Google API models for my apikey https://generativelanguage.googleapis.com/v1beta/models?key= and imagen didn't show up https://shaggyze.website/GoogleAPI_Models.txt and I tried switching to it with mine but it resulted in a 404 because I believe you need to be on a Paid tier of Google API which currently I am not.
https://myanimelist.sitesdebloques.com/forum/?topicid=2178399