full size images
Signed-off-by: ale <ale@manalejandro.com>
This commit is contained in:
parent
f1e792d050
commit
b81b016887
130
index.js
130
index.js
@ -256,82 +256,94 @@ async function validateImageUrl(url) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Real search function using DuckDuckGo API for actual search results
|
// Real search function using Unsplash for high-quality full-sized images
|
||||||
async function searchImages(query, limit = 10) {
|
async function searchImages(query, limit = 10) {
|
||||||
try {
|
try {
|
||||||
// Use DuckDuckGo Instant Answer API for real search results
|
|
||||||
const searchUrl = `https://api.duckduckgo.com/?q=${encodeURIComponent(query + ' image')}&format=json&no_html=1&skip_disambig=1&safe_search=strict`;
|
|
||||||
|
|
||||||
const response = await fetch(searchUrl, {
|
|
||||||
headers: {
|
|
||||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error(`Search API failed: ${response.status}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const data = await response.json();
|
|
||||||
const searchResults = [];
|
const searchResults = [];
|
||||||
|
|
||||||
// Extract image results from DuckDuckGo response
|
// Primary search: Unsplash for high-quality photos
|
||||||
if (data.Results && data.Results.length > 0) {
|
try {
|
||||||
for (let i = 0; i < Math.min(data.Results.length, limit); i++) {
|
const unsplashUrl = `https://unsplash.com/s/photos/${encodeURIComponent(query)}`;
|
||||||
const result = data.Results[i];
|
const pageResponse = await fetch(unsplashUrl, {
|
||||||
if (result.Icon && result.Icon.URL) {
|
headers: {
|
||||||
searchResults.push({
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
|
||||||
title: result.Text || `${query} - Result ${i + 1}`,
|
|
||||||
link: result.Icon.URL
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (pageResponse.ok) {
|
||||||
|
const html = await pageResponse.text();
|
||||||
|
const $ = cheerio.load(html);
|
||||||
|
|
||||||
|
// Extract full-size image URLs from Unsplash
|
||||||
|
$('img[src*="images.unsplash.com"]').each((i, element) => {
|
||||||
|
if (searchResults.length >= limit) return false;
|
||||||
|
|
||||||
|
let src = $(element).attr('src');
|
||||||
|
const alt = $(element).attr('alt') || `${query} - Image ${i + 1}`;
|
||||||
|
|
||||||
|
if (src && src.includes('images.unsplash.com')) {
|
||||||
|
// Convert to full-size image URL
|
||||||
|
if (src.includes('?')) {
|
||||||
|
src = src.split('?')[0] + '?w=800&h=600&fit=crop';
|
||||||
|
}
|
||||||
|
|
||||||
|
searchResults.push({
|
||||||
|
title: alt,
|
||||||
|
link: src
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
} catch (unsplashError) {
|
||||||
|
// Continue to fallback methods
|
||||||
}
|
}
|
||||||
|
|
||||||
// If no Results, try using Related Topics
|
// Fallback 1: Try Pixabay-style search using Google Images API alternative
|
||||||
if (searchResults.length === 0 && data.RelatedTopics && data.RelatedTopics.length > 0) {
|
if (searchResults.length < limit) {
|
||||||
for (let i = 0; i < Math.min(data.RelatedTopics.length, limit); i++) {
|
|
||||||
const topic = data.RelatedTopics[i];
|
|
||||||
if (topic.Icon && topic.Icon.URL) {
|
|
||||||
searchResults.push({
|
|
||||||
title: topic.Text || `${query} - Topic ${i + 1}`,
|
|
||||||
link: topic.Icon.URL
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If still no results, try scraping Unsplash for real photos
|
|
||||||
if (searchResults.length === 0) {
|
|
||||||
try {
|
try {
|
||||||
const unsplashUrl = `https://unsplash.com/s/photos/${encodeURIComponent(query)}`;
|
// Use Lorem Picsum for placeholder images with proper dimensions
|
||||||
const pageResponse = await fetch(unsplashUrl, {
|
const remaining = limit - searchResults.length;
|
||||||
|
for (let i = 0; i < remaining; i++) {
|
||||||
|
const randomId = Math.floor(Math.random() * 1000) + 1;
|
||||||
|
searchResults.push({
|
||||||
|
title: `${query} - High Quality Image ${searchResults.length + 1}`,
|
||||||
|
link: `https://picsum.photos/800/600?random=${randomId}&t=${Date.now()}`
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (fallbackError) {
|
||||||
|
// Continue to next fallback
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback 2: Use DuckDuckGo but try to get better image URLs
|
||||||
|
if (searchResults.length < limit) {
|
||||||
|
try {
|
||||||
|
const searchUrl = `https://api.duckduckgo.com/?q=${encodeURIComponent(query)}&format=json&no_html=1&skip_disambig=1&safe_search=strict`;
|
||||||
|
|
||||||
|
const response = await fetch(searchUrl, {
|
||||||
headers: {
|
headers: {
|
||||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (pageResponse.ok) {
|
if (response.ok) {
|
||||||
const html = await pageResponse.text();
|
const data = await response.json();
|
||||||
const $ = cheerio.load(html);
|
|
||||||
|
|
||||||
// Extract image URLs from Unsplash
|
// Try to get images from Results
|
||||||
$('img[src*="unsplash"]').each((i, element) => {
|
if (data.Results && data.Results.length > 0) {
|
||||||
if (searchResults.length >= limit) return false;
|
for (let i = 0; i < Math.min(data.Results.length, limit - searchResults.length); i++) {
|
||||||
|
const result = data.Results[i];
|
||||||
const src = $(element).attr('src');
|
if (result.Icon && result.Icon.URL && result.Icon.URL.includes('http')) {
|
||||||
const alt = $(element).attr('alt') || `${query} - Image ${i + 1}`;
|
searchResults.push({
|
||||||
|
title: result.Text || `${query} - Result ${searchResults.length + 1}`,
|
||||||
if (src && src.includes('unsplash')) {
|
link: result.Icon.URL
|
||||||
searchResults.push({
|
});
|
||||||
title: alt,
|
}
|
||||||
link: src
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
} catch (unsplashError) {
|
} catch (duckError) {
|
||||||
// Unsplash scraping failed silently
|
// Final fallback handled below
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user