123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- /* eslint-disable no-console */
- import express from 'express'
- import { OrionClient } from './api'
- import { APP_URL, PORT } from './config'
- import {
- generateChannelMetaTags,
- generateChannelSchemaTagsHtml,
- generateCommonMetaTags,
- generateVideoMetaTags,
- generateVideoSchemaTagsHtml,
- } from './tags'
- import { applyMetaTagsToHtml, applySchemaTagsToHtml, fetchHtmlAndAppData, generateAssetUrl } from './utils'
- const app = express()
- let orionClient: OrionClient
- app.get('/video/:id', async (req, res) => {
- try {
- const id = req.params['id']
- const [[html, appData], video] = await Promise.all([fetchHtmlAndAppData(APP_URL), orionClient.getVideo(id)])
- if (!video) {
- return res.status(404).send('Video not found')
- }
- const title = html.querySelector('title')
- if (title) {
- title.innerHTML = video.title || appData.name
- }
- const thumbnailUrl = video.thumbnailPhoto ? generateAssetUrl(video.thumbnailPhoto) : ''
- const videoMetaTags = generateVideoMetaTags(video, thumbnailUrl, appData.name, APP_URL, appData.twitterId)
- const videoSchemaTagsHtml = generateVideoSchemaTagsHtml(video, thumbnailUrl, appData.name, APP_URL)
- applyMetaTagsToHtml(html, videoMetaTags)
- applySchemaTagsToHtml(html, videoSchemaTagsHtml)
- return res.send(html.toString())
- } catch (err) {
- console.error(err)
- return res.status(500).send()
- }
- })
- app.get('/channel/:id', async (req, res) => {
- try {
- const id = req.params['id']
- const [[html, appData], channel] = await Promise.all([fetchHtmlAndAppData(APP_URL), orionClient.getChannel(id)])
- if (!channel) {
- return res.status(404).send('Channel not found')
- }
- const title = html.querySelector('title')
- if (title) {
- title.innerHTML = channel.title || appData.name
- }
- const avatarUrl = channel.avatarPhoto ? generateAssetUrl(channel.avatarPhoto) : ''
- const channelMetaTags = generateChannelMetaTags(channel, avatarUrl, appData.name, APP_URL, appData.twitterId)
- const channelSchemaTagsHtml = generateChannelSchemaTagsHtml(channel, avatarUrl, APP_URL)
- applyMetaTagsToHtml(html, channelMetaTags)
- applySchemaTagsToHtml(html, channelSchemaTagsHtml)
- return res.send(html.toString())
- } catch (err) {
- console.error(err)
- return res.status(500).send()
- }
- })
- app.get('/ypp', async (req, res) => {
- try {
- const [html, appData] = await fetchHtmlAndAppData(APP_URL)
- const titleNode = html.querySelector('title')
- if (titleNode && appData.yppOgTitle) {
- titleNode.innerHTML = appData.yppOgTitle
- }
- const metaTags = generateCommonMetaTags(
- appData.name,
- APP_URL,
- appData.yppOgTitle || appData.name,
- appData.yppOgDescription,
- appData.yppOgImage,
- appData.twitterId
- )
- applyMetaTagsToHtml(html, metaTags)
- return res.send(html.toString())
- } catch (err) {
- console.error(err)
- return res.status(500).send()
- }
- })
- const init = async () => {
- console.log('Initializing...')
- console.log(`Fetching app data from ${APP_URL}...`)
- const [html, appData] = await fetchHtmlAndAppData(APP_URL)
- console.log('App data fetched')
- console.log(JSON.stringify(appData, null, 2))
- console.log('Initializing Orion client...')
- orionClient = new OrionClient(appData.orionUrl)
- await orionClient.testConnection()
- console.log('Orion client initialized')
- app.get('/*', (req, res) => {
- res.send(html.toString())
- })
- app
- .listen(PORT, () => console.log('Listening on ' + PORT + '...'))
- .on('error', (error) => console.log('Error during app startup', error))
- }
- init()
|