Skip to content

🔍 Get a summary of any web page

License

Notifications You must be signed in to change notification settings

MisskeyIO/summaly

 
 

Repository files navigation

summaly

Installation

npm install @misskey-dev/summaly

Usage

As a function:

import { summaly } from 'summaly';

summaly(url[, opts])

As Fastify plugin: (will listen GET of /)

import Summaly from 'summaly';

fastify.register(Summaly[, opts])

Run the server:

git clone https://github.com/misskey-dev/summaly.git
cd summaly
NODE_ENV=development npm install
npm run build
npm run serve

opts (SummalyOptions)

Property Type Description Default
lang string Accept-Language for the request null
followRedirects boolean Whether follow redirects true
plugins plugin[] (see below) Custom plugins null
agent Got.Agents Custom HTTP agent (see below) null
userAgent string User-Agent for the request SummalyBot/[version]
responseTimeout number Set timeouts for each phase, such as host name resolution and socket communication. 20000
operationTimeout number Set the timeout from the start to the end of the request. 60000
contentLengthLimit number If set to true, an error will occur if the content-length value returned from the other server is larger than this parameter (or if the received body size exceeds this parameter). 10485760
contentLengthRequired boolean If set to true, it will be an error if the other server does not return content-length. false

Plugin

interface SummalyPlugin {
	test: (url: URL) => boolean;
	summarize: (url: URL) => Promise<Summary>;
}

urls are WHATWG URL since v4.

Custom HTTP agent for proxy

You can specify agents to be passed to Got for proxy use, etc.
https://github.com/sindresorhus/got/blob/v12.6.0/documentation/tips.md#proxying

⚠️If you set some agent, local IP rejecting will not work.⚠️
(Summaly usually rejects local IPs.)

(Summaly currently does not support http2.)

Returns

A Promise of an Object that contains properties below:

※ Almost all values are nullable. player should not be null.

SummalyResult

Property Type Description
title string | null The title of the web page
icon string | null The url of the icon of the web page
description string | null The description of the web page
thumbnail string | null The url of the thumbnail of the web page
sitename string | null The name of the web site
player Player The player of the web page
sensitive boolean Whether the url is sensitive
activityPub string | null The url of the ActivityPub representation of that web page
url string The url of the web page

Summary

Omit<SummalyResult, "url">

Player

Property Type Description
url string | null The url of the player
width number | null The width of the player
height number | null The height of the player
allow string[] The names of the allowed permissions for iframe

Currently the possible items in allow are:

  • autoplay
  • clipboard-write
  • fullscreen
  • encrypted-media
  • picture-in-picture
  • web-share

See Permissions Policy in MDN for details of them.

Example

import { summaly } from 'summaly';

const summary = await summaly('https://www.youtube.com/watch?v=NMIEAhH_fTU');

console.log(summary);

will be ... ↓

{
	"title": "【アイドルマスター】「Stage Bye Stage」(歌:島村卯月、渋谷凛、本田未央)",
	"icon": "https://www.youtube.com/s/desktop/711fd789/img/logos/favicon.ico",
	"description": "Website▶https://columbia.jp/idolmaster/Playlist▶https://www.youtube.com/playlist?list=PL83A2998CF3BBC86D2018年7月18日発売予定THE IDOLM@STER CINDERELLA GIRLS CG STAR...",
	"thumbnail": "https://i.ytimg.com/vi/NMIEAhH_fTU/maxresdefault.jpg",
	"player": {
		"url": "https://www.youtube.com/embed/NMIEAhH_fTU?feature=oembed",
		"width": 200,
		"height": 113,
		"allow": [
			"autoplay",
			"clipboard-write",
			"encrypted-media",
			"picture-in-picture",
			"web-share",
			"fullscreen",
		]
	},
	"sitename": "YouTube",
	"sensitive": false,
	"activityPub": null,
	"url": "https://www.youtube.com/watch?v=NMIEAhH_fTU"
}

Testing

npm run test

License

MIT

About

🔍 Get a summary of any web page

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Languages

  • TypeScript 83.2%
  • HTML 12.7%
  • JavaScript 2.1%
  • Dockerfile 2.0%