Files
linguamate/backend/routes/photosearch.js
2026-02-21 08:06:37 -05:00

124 lines
2.9 KiB
JavaScript

var express = require('express')
var router = express.Router()
const axios = require('axios')
/**
* Services to add:
* - https://unsplash.com/developers
* - https://pixabay.com/api/docs/
*
* Pronounciation will require $2/mo sub:
* https://api.forvo.com/plans-and-pricing/
*/
async function pexelsSearch(query) {
// https://help.pexels.com/hc/en-us/articles/47678194141337-Can-I-change-the-search-language-when-using-the-Pexels-API
// pexels has a monthly rate limit and an hourly rate limit, only the monthly is returned in the headers
// limit is also 200 per hour, will need to manually track that
const resp = await axios.get(
`https://api.pexels.com/v1/search?query=${encodeURIComponent(query)}&per_page=5`,
{
headers: {
Authorization: process.env.PEXELS_API,
},
}
)
const { data, headers } = resp
const photos = data.photos
let filtered = photos.map((p) => (
{
url: p.src.medium,
desc: p.alt,
credit: p.photographer,
id: p.id
}
))
let response = {
photos: filtered,
ratelimit: {
limit: headers['x-ratelimit-limit'],
remaining: headers['x-ratelimit-remaining'],
reset: new Date(Number(headers['x-ratelimit-reset']) * 1000)
}
}
return response;
}
async function shutterstockSearch(query) {
// shutterstock has an hourly rate limit and no monthly limit
// https://api-reference.shutterstock.com/?shell#assets-api
// higher quality is available with shutterstock watermarks, look into [photo].assets objects
const SHUTTERSTOCK_API_TOKEN = process.env.SHUTTERSTOCK_API
try {
const resp = await axios.get(
'https://api.shutterstock.com/v2/images/search',
{
headers: {
'Accept': 'application/json',
'Authorization': `Bearer ${SHUTTERSTOCK_API_TOKEN}`
},
params: {
query,
per_page: 5,
sort: 'popular',
safe: false,
image_type: 'photo'
}
}
)
let { data, headers } = resp
let filtered = data.data.map((p) => (
{
url: p.assets.mosaic.url,
desc: p.description,
credit: p.contributor.id,
id: Number(p.id)
}
))
let response = {
photos: filtered,
ratelimit: {
limit: headers['ratelimit-limit'],
remaining: headers['ratelimit-remaining'],
reset: new Date(Number(headers['ratelimit-reset']))
}
}
return response;
} catch (error) {
console.error('Error:', error);
}``
}
router.get('/', async function(req, res) {
try {
const queryL1 = req.query.queries[0]
// const queryL2 = req.query.queries[1]
// const pexels = await pexelsSearch(queryL1)
const shutterstock = await shutterstockSearch(queryL1)
response = shutterstock;
res.status(200).send(response)
} catch (err) {
console.log(err)
}
});
module.exports = router