92 lines
2.6 KiB
JavaScript
92 lines
2.6 KiB
JavaScript
|
/*
|
||
|
SkeptCOM [RSS-Youtube] | Détecte les nouvelles vidéos YT via RSS
|
||
|
*/
|
||
|
|
||
|
// REQUIRE, CONST, VARIABLES
|
||
|
const jsonfile = require('jsonfile')
|
||
|
const Parser = require('rss-parser')
|
||
|
const path = require('path')
|
||
|
|
||
|
const routage = require('../modules/routage')('rss-youtube')
|
||
|
let parser = new Parser({
|
||
|
customFields: {
|
||
|
item: [ 'author', 'media:group' ]
|
||
|
}
|
||
|
})
|
||
|
const db = require('../db/rss-youtube.json')
|
||
|
|
||
|
|
||
|
// FUNCTIONS
|
||
|
// et on output ! YOLO !
|
||
|
function output(data) {
|
||
|
console.log(` --> [RSS-Youtube | NV] ${data.author} | ${data.title}`)
|
||
|
if (routage && routage.send) routage.send(data)
|
||
|
}
|
||
|
|
||
|
// bon, on a besoin de recup le RSS, normol
|
||
|
async function getFeed(url) {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
parser.parseURL(url, (err, res) => {
|
||
|
if (err) return reject(err)
|
||
|
resolve(res)
|
||
|
})
|
||
|
})
|
||
|
}
|
||
|
|
||
|
// on filtre un peu, puis en fonction on output
|
||
|
async function parseRSS(feed, owner) {
|
||
|
if (!db.timecode[owner]) db.timecode[owner] = db.timecode.lastCheck
|
||
|
let cLastCheck = db.timecode[owner]
|
||
|
for (let i in feed.items) {
|
||
|
if (feed.items[i].isoDate > db.timecode.lastCheck || feed.items[i].isoDate > cLastCheck) {
|
||
|
if (feed.items[i].isoDate > cLastCheck) cLastCheck = feed.items[i].isoDate
|
||
|
let c = feed.items[i]
|
||
|
c.desc = feed.items[i]['media:group']['media:description'][0].slice(0, db.config.sliceDescription) + " [...]"
|
||
|
c.image = "http://i3.ytimg.com/vi/" + c.id.split(':')[2] + "/maxresdefault.jpg"
|
||
|
c.url = c.link
|
||
|
delete c.link
|
||
|
delete c['media:group']
|
||
|
if (c.isoDate > cLastCheck) cLastCheck = feed.items[i].isoDate
|
||
|
output(c)
|
||
|
}
|
||
|
}
|
||
|
db.timecode[owner] = cLastCheck
|
||
|
}
|
||
|
|
||
|
// on check l'ensemble de feeds
|
||
|
async function checkFeeds(feeds) {
|
||
|
console.log(` --- [RSS-Youtube] check @${db.timecode.lastCheck}`)
|
||
|
routage.log(`check @${db.timecode.lastCheck}`)
|
||
|
for (let i in feeds) {
|
||
|
let feed = await getFeed(db.config.urlFeeds + feeds[i])
|
||
|
try {
|
||
|
await parseRSS(feed, i)
|
||
|
} catch (e) {
|
||
|
console.error("error while parsing feed %s", feed, e);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
let dateObj = new Date()
|
||
|
db.timecode.lastCheck = dateObj.toISOString()
|
||
|
|
||
|
// et on externalise la nouvelle date. Youpi !
|
||
|
jsonfile.writeFile(path.resolve('./db/rss-youtube.json'), db, {spaces: 2}, (err) => {
|
||
|
console.log()
|
||
|
if (err) console.error(err)
|
||
|
})
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
function rssLoop(time) {
|
||
|
checkFeeds(db.feeds)
|
||
|
setTimeout(() => {
|
||
|
rssLoop(time)
|
||
|
}, time)
|
||
|
}
|
||
|
|
||
|
// INIT
|
||
|
console.log(` --- [RSS-Youtube] Load`)
|
||
|
routage.log(`Load`)
|
||
|
rssLoop(db.config.timeLoop*60*1000)
|