Merge pull request #125 from acid-chicken/patch-1

Playerをオブジェクト化する
This commit is contained in:
syuilo 2018-08-17 23:01:52 +09:00 committed by GitHub
commit 3abc2b9191
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 87 additions and 8 deletions

View File

@ -24,12 +24,14 @@ summaly(url[, opts])
``` ```
### Options ### Options
| Property | Type | Description | Default | | Property | Type | Description | Default |
| :------------------ | :--------------------- | :----------------------- | :------ | | :------------------ | :--------------------- | :----------------------- | :------ |
| **followRedirects** | *boolean* | Whether follow redirects | `true` | | **followRedirects** | *boolean* | Whether follow redirects | `true` |
| **plugins** | *plugin[]* (see below) | Custom plugins | `null` | | **plugins** | *plugin[]* (see below) | Custom plugins | `null` |
#### Plugin #### Plugin
``` typescript ``` typescript
interface IPlugin { interface IPlugin {
test: (url: URL.Url) => boolean; test: (url: URL.Url) => boolean;
@ -38,19 +40,31 @@ interface IPlugin {
``` ```
### Returns ### Returns
A Promise of an Object that contains properties below: A Promise of an Object that contains properties below:
#### Root
| Property | Type | Description | | Property | Type | Description |
| :-------------- | :------- | :--------------------------------------- | | :-------------- | :------- | :--------------------------------------- |
| **description** | *string* | The description of the web page | | **description** | *string* | The description of the web page |
| **icon** | *string* | The url of the icon of the web page | | **icon** | *string* | The url of the icon of the web page |
| **sitename** | *string* | The name of the web site | | **sitename** | *string* | The name of the web site |
| **thumbnail** | *string* | The url of the thumbnail of the web page | | **thumbnail** | *string* | The url of the thumbnail of the web page |
| **player** | *string* | The url of the player of the web page | | **player** | *Player* | The player of the web page |
| **title** | *string* | The title of the web page | | **title** | *string* | The title of the web page |
| **url** | *string* | The url of the web page | | **url** | *string* | The url of the web page |
#### Player
| Property | Type | Description |
| :-------------- | :------- | :--------------------------------------- |
| **url** | *string* | The url of the player |
| **width** | *number* | The width of the player |
| **height** | *number* | The height of the player |
### Example ### Example
``` javascript ``` javascript
import summaly from 'summaly'; import summaly from 'summaly';
@ -63,7 +77,11 @@ console.log(summary); // will be ... ↓
icon: 'http://livedoor.blogimg.jp/tmg24news/imgs/9/5/favicon.ico', icon: 'http://livedoor.blogimg.jp/tmg24news/imgs/9/5/favicon.ico',
description: '1以下、名無しにかわりましてVIPがお送りします2013/03/30(土) 14:57:29.09 ID:An34eOmY0モバ「反論が あるやつもいるかもしれない」 モバP「だが俺の主張も聞いてほしい! お漏らしさせるならありすが一番だ!」 日菜子「むふふ……いきなりそんなことを大声で', description: '1以下、名無しにかわりましてVIPがお送りします2013/03/30(土) 14:57:29.09 ID:An34eOmY0モバ「反論が あるやつもいるかもしれない」 モバP「だが俺の主張も聞いてほしい! お漏らしさせるならありすが一番だ!」 日菜子「むふふ……いきなりそんなことを大声で',
thumbnail: 'http://livedoor.blogimg.jp/tmg24news/imgs/8/d/8df6e1a0-s.jpg', thumbnail: 'http://livedoor.blogimg.jp/tmg24news/imgs/8/d/8df6e1a0-s.jpg',
player: null player: {
url: null,
width: null,
height: null
}
sitename: 'エレファント速報SSまとめブログ', sitename: 'エレファント速報SSまとめブログ',
url: 'http://elephant.2chblog.jp/archives/52025138.html' url: 'http://elephant.2chblog.jp/archives/52025138.html'
} }

View File

@ -1,3 +1,4 @@
import { name, version } from '../package.json';
import * as URL from 'url'; import * as URL from 'url';
import * as request from 'request'; import * as request from 'request';
import nullOrEmpty from './utils/null-or-empty'; import nullOrEmpty from './utils/null-or-empty';
@ -8,6 +9,9 @@ import { AllHtmlEntities } from 'html-entities';
const entities = new AllHtmlEntities(); const entities = new AllHtmlEntities();
import * as client from 'cheerio-httpcli'; import * as client from 'cheerio-httpcli';
client.set('headers', {
'User-Agent': `${name}/${version}`
});
client.set('referer', false); client.set('referer', false);
client.set('timeout', 10000); client.set('timeout', 10000);
client.set('maxDataSize', 1024 * 1024); client.set('maxDataSize', 1024 * 1024);
@ -50,10 +54,18 @@ export default async (url: URL.Url): Promise<Summary> => {
image = image ? URL.resolve(url.href, image) : null; image = image ? URL.resolve(url.href, image) : null;
const player = const playerUrl =
$('meta[property="twitter:player"]').attr('content') || $('meta[property="twitter:player"]').attr('content') ||
$('meta[name="twitter:player"]').attr('content'); $('meta[name="twitter:player"]').attr('content');
const playerWidth = parseInt(
$('meta[property="twitter:player:width"]').attr('content') ||
$('meta[name="twitter:player:width"]').attr('content'));
const playerHeight = parseInt(
$('meta[property="twitter:player:height"]').attr('content') ||
$('meta[name="twitter:player:height"]').attr('content'));
let description = let description =
$('meta[property="og:description"]').attr('content') || $('meta[property="og:description"]').attr('content') ||
$('meta[property="twitter:description"]').attr('content') || $('meta[property="twitter:description"]').attr('content') ||
@ -123,7 +135,11 @@ export default async (url: URL.Url): Promise<Summary> => {
icon: icon || null, icon: icon || null,
description: description || null, description: description || null,
thumbnail: image || null, thumbnail: image || null,
player: player || null, player: {
url: playerUrl || null,
width: playerWidth || null,
height: playerHeight || null
},
sitename: siteName || null sitename: siteName || null
}; };
}; };

4
src/package.json.d.ts vendored Normal file
View File

@ -0,0 +1,4 @@
declare module '*/package.json' {
export const name: string;
export const version: string;
}

View File

@ -1,7 +1,11 @@
import { name, version } from '../../package.json';
import * as URL from 'url'; import * as URL from 'url';
import * as client from 'cheerio-httpcli'; import * as client from 'cheerio-httpcli';
import summary from '../summary'; import summary from '../summary';
client.set('headers', {
'User-Agent': `${name}/${version}`
});
client.set('referer', false); client.set('referer', false);
client.set('timeout', 10000); client.set('timeout', 10000);
@ -34,12 +38,28 @@ export async function summarize(url: URL.Url): Promise<summary> {
const thumbnail: string = $('#landingImage').attr('src'); const thumbnail: string = $('#landingImage').attr('src');
const playerUrl =
$('meta[property="twitter:player"]').attr('content') ||
$('meta[name="twitter:player"]').attr('content');
const playerWidth = parseInt(
$('meta[property="twitter:player:width"]').attr('content') ||
$('meta[name="twitter:player:width"]').attr('content'));
const playerHeight = parseInt(
$('meta[property="twitter:player:height"]').attr('content') ||
$('meta[name="twitter:player:height"]').attr('content'));
return { return {
title: title || null, title: title || null,
icon: 'https://www.amazon.com/favicon.ico', icon: 'https://www.amazon.com/favicon.ico',
description: description || null, description: description || null,
thumbnail: thumbnail || null, thumbnail: thumbnail || null,
player: null, player: {
url: playerUrl || null,
width: playerWidth || null,
height: playerHeight || null
},
sitename: 'Amazon' sitename: 'Amazon'
}; };
} }

View File

@ -34,7 +34,11 @@ export async function summarize(url: URL.Url): Promise<summary> {
icon: 'https://wikipedia.org/static/favicon/wikipedia.ico', icon: 'https://wikipedia.org/static/favicon/wikipedia.ico',
description: clip(info.extract, 300), description: clip(info.extract, 300),
thumbnail: `https://wikipedia.org/static/images/project-logos/${lang}wiki.png`, thumbnail: `https://wikipedia.org/static/images/project-logos/${lang}wiki.png`,
player: null, player: {
url: null,
width: null,
height: null
},
sitename: 'Wikipedia' sitename: 'Wikipedia'
}; };
} }

View File

@ -20,9 +20,9 @@ type Summary = {
thumbnail: string; thumbnail: string;
/** /**
* The url of the player of that web page * The player of that web page
*/ */
player: string; player: Player;
/** /**
* The title of that web page * The title of that web page
@ -31,3 +31,20 @@ type Summary = {
}; };
export default Summary; export default Summary;
export type Player = {
/**
* The url of the player
*/
url: string;
/**
* The width of the player
*/
width: number;
/**
* The height of the player
*/
height: number;
};