diff --git a/src/general.ts b/src/general.ts index 44d6027..ad84bbe 100644 --- a/src/general.ts +++ b/src/general.ts @@ -12,6 +12,7 @@ export default async (url: URL.Url, lang: string = null): Promise => { const res = await scpaping(url.href, { lang: lang || undefined }); const $ = res.$; + const twitterCard = $('meta[property="twitter:card"]').attr('content'); let title = $('meta[property="og:title"]').attr('content') || @@ -34,16 +35,23 @@ export default async (url: URL.Url, lang: string = null): Promise => { image = image ? URL.resolve(url.href, image) : null; const playerUrl = - $('meta[property="twitter:player"]').attr('content') || - $('meta[name="twitter:player"]').attr('content'); + (twitterCard !== 'summary_large_image' && $('meta[property="twitter:player"]').attr('content')) || + (twitterCard !== 'summary_large_image' && $('meta[name="twitter:player"]').attr('content')) || + $('meta[property="og:video"]').attr('content') || + $('meta[property="og:video:secure_url"]').attr('content') || + $('meta[property="og:video:url"]').attr('content'); const playerWidth = parseInt( $('meta[property="twitter:player:width"]').attr('content') || - $('meta[name="twitter:player:width"]').attr('content')); + $('meta[name="twitter:player:width"]').attr('content') || + $('meta[property="og:video:width"]').attr('content') || + ''); const playerHeight = parseInt( $('meta[property="twitter:player:height"]').attr('content') || - $('meta[name="twitter:player:height"]').attr('content')); + $('meta[name="twitter:player:height"]').attr('content') || + $('meta[property="og:video:height"]').attr('content') || + ''); let description = $('meta[property="og:description"]').attr('content') || @@ -115,8 +123,8 @@ export default async (url: URL.Url, lang: string = null): Promise => { thumbnail: image || null, player: { url: playerUrl || null, - width: playerWidth || null, - height: playerHeight || null + width: Number.isNaN(playerWidth) ? null : playerWidth, + height: Number.isNaN(playerHeight) ? null : playerHeight }, sitename: siteName || null, sensitive, diff --git a/test/htmls/player-peertube-video.html b/test/htmls/player-peertube-video.html new file mode 100644 index 0000000..60f2538 --- /dev/null +++ b/test/htmls/player-peertube-video.html @@ -0,0 +1,37 @@ + + + + + + PeerTube:video + + + + + + + + + + + + + + + + + + + + + + + +

Yo

+

Hey hey hey syuilo.

+ + diff --git a/test/htmls/player-pleroma-image.html b/test/htmls/player-pleroma-image.html new file mode 100644 index 0000000..8eaae3f --- /dev/null +++ b/test/htmls/player-pleroma-image.html @@ -0,0 +1,30 @@ + + + + + + Pleroma:image + + + + + + + + + + + + + + + + +

Yo

+

Hey hey hey syuilo.

+ + diff --git a/test/htmls/player-pleroma-video.html b/test/htmls/player-pleroma-video.html new file mode 100644 index 0000000..9c68f18 --- /dev/null +++ b/test/htmls/player-pleroma-video.html @@ -0,0 +1,35 @@ + + + + + + Pleroma:video + + + + + + + + + + + + + + + + + + + + + +

Yo

+

Hey hey hey syuilo.

+ + diff --git a/test/index.js b/test/index.js index 7d35c8c..9db9bd8 100644 --- a/test/index.js +++ b/test/index.js @@ -176,4 +176,41 @@ describe('TwitterCard', () => { done(); }); }); + + it('Player detection - PeerTube:video => video', done => { + const app = express(); + app.get('/', (req, res) => { + res.sendFile(__dirname + '/htmls/player-peertube-video.html'); + }); + server = app.listen(port, async () => { + const summary = await summaly(host); + assert.equal(summary.player.url, 'https://example.com/embedurl'); + done(); + }); + }); + + it('Player detection - Pleroma:video => video', done => { + const app = express(); + app.get('/', (req, res) => { + res.sendFile(__dirname + '/htmls/player-pleroma-video.html'); + }); + server = app.listen(port, async () => { + const summary = await summaly(host); + assert.equal(summary.player.url, 'https://example.com/embedurl'); + done(); + }); + }); + + it('Player detection - Pleroma:image => image', done => { + const app = express(); + app.get('/', (req, res) => { + res.sendFile(__dirname + '/htmls/player-pleroma-image.html'); + }); + server = app.listen(port, async () => { + const summary = await summaly(host); + assert.equal(summary.player.url, null); + done(); + }); + }); + });