init
This commit is contained in:
123
backend/routes/photosearch.js
Normal file
123
backend/routes/photosearch.js
Normal file
@@ -0,0 +1,123 @@
|
||||
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
|
||||
Reference in New Issue
Block a user