2019-10-01 21:34:02 +02:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Configuration dependencies.
|
|
|
|
*/
|
|
|
|
|
|
|
|
var config = require('../config/production/config');
|
|
|
|
var modules = require('../config/production/modules');
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Node dependencies.
|
|
|
|
*/
|
|
|
|
|
|
|
|
var moment = require('moment');
|
|
|
|
moment.locale(config.language);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create full schema data for movie.
|
|
|
|
*
|
|
|
|
* @param {Object} page
|
|
|
|
* @param {Object} movie
|
|
|
|
* @param {Object} movies - The related movies.
|
2020-01-06 23:57:25 +01:00
|
|
|
* @param {Object} comments
|
2019-10-01 21:34:02 +02:00
|
|
|
* @param {Object} [options]
|
|
|
|
* @return {String}
|
|
|
|
*/
|
|
|
|
|
2020-01-06 23:57:25 +01:00
|
|
|
function fullMovieSchema(page, movie, movies, comments, options) {
|
2020-01-16 03:36:20 +01:00
|
|
|
if (arguments.length === 4) {
|
2019-10-01 21:34:02 +02:00
|
|
|
options = {};
|
2020-03-16 21:00:37 +01:00
|
|
|
options.domain =
|
|
|
|
(config.botdomain || config.subdomain) + '' + config.domain;
|
2019-10-09 03:51:57 +02:00
|
|
|
options.origin =
|
2020-03-16 21:00:37 +01:00
|
|
|
config.protocol +
|
|
|
|
'' +
|
|
|
|
(config.botdomain || config.subdomain) +
|
|
|
|
'' +
|
|
|
|
config.domain;
|
2019-10-01 21:34:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!movie) return '';
|
|
|
|
|
|
|
|
var result = [];
|
|
|
|
|
|
|
|
if (movies) {
|
|
|
|
for (var category in movies) {
|
|
|
|
if (movies.hasOwnProperty(category)) {
|
|
|
|
movies[category].forEach(function(data) {
|
|
|
|
var schemaItemList = {};
|
|
|
|
schemaItemList['@context'] = 'http://schema.org';
|
|
|
|
schemaItemList['@type'] = 'ItemList';
|
|
|
|
schemaItemList['name'] = data.name.replace(/<\/?[^>]+(>|$)/g, '');
|
|
|
|
schemaItemList['numberOfItems'] = data.movies.length;
|
|
|
|
schemaItemList['itemListOrder'] = 'Descending';
|
|
|
|
schemaItemList['itemListElement'] = [];
|
|
|
|
|
|
|
|
data.movies.forEach(function(movie, key) {
|
|
|
|
schemaItemList['itemListElement'].push({
|
|
|
|
'@type': 'ListItem',
|
|
|
|
position: key + 1,
|
2020-01-06 23:57:25 +01:00
|
|
|
item: onlyMovieSchema(movie, {}, options)
|
2019-10-01 21:34:02 +02:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
result.push(schemaItemList);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var schemaBreadcrumbList = {};
|
|
|
|
|
|
|
|
schemaBreadcrumbList['@context'] = 'http://schema.org';
|
|
|
|
schemaBreadcrumbList['@type'] = 'BreadcrumbList';
|
|
|
|
schemaBreadcrumbList['itemListElement'] = [];
|
|
|
|
|
|
|
|
schemaBreadcrumbList['itemListElement'].push({
|
|
|
|
'@type': 'ListItem',
|
|
|
|
position: 1,
|
|
|
|
item: {
|
|
|
|
'@id': '/',
|
|
|
|
name: config.l.home,
|
|
|
|
url: config.protocol + options.domain
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
schemaBreadcrumbList['itemListElement'].push({
|
|
|
|
'@type': 'ListItem',
|
|
|
|
position: 2,
|
|
|
|
item: {
|
|
|
|
'@id':
|
|
|
|
'/' +
|
|
|
|
encodeURIComponent(config.urls.genre) +
|
2019-11-04 21:03:32 +01:00
|
|
|
config.urls.slash +
|
2019-10-01 21:34:02 +02:00
|
|
|
encodeURIComponent(movie.genre),
|
|
|
|
name: movie.genre,
|
|
|
|
url:
|
|
|
|
config.protocol +
|
|
|
|
options.domain +
|
|
|
|
'/' +
|
|
|
|
encodeURIComponent(config.urls.genre) +
|
2019-11-04 21:03:32 +01:00
|
|
|
config.urls.slash +
|
2019-10-01 21:34:02 +02:00
|
|
|
encodeURIComponent(movie.genre)
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
schemaBreadcrumbList['itemListElement'].push({
|
|
|
|
'@type': 'ListItem',
|
|
|
|
position: 3,
|
|
|
|
item: {
|
2020-02-19 03:29:10 +01:00
|
|
|
'@id': movie.pathname,
|
2019-10-01 21:34:02 +02:00
|
|
|
name: movie.title,
|
|
|
|
url: movie.url
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
if (page.url && page.url !== movie.url) {
|
|
|
|
schemaBreadcrumbList['itemListElement'].push({
|
|
|
|
'@type': 'ListItem',
|
|
|
|
position: 4,
|
|
|
|
item: {
|
2020-02-19 03:29:10 +01:00
|
|
|
'@id': page.pathname || page.url,
|
2019-10-01 21:34:02 +02:00
|
|
|
name: page.title,
|
|
|
|
url: page.url
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
var ya_date =
|
|
|
|
movie.custom && movie.custom.lastmod
|
|
|
|
? moment(movie.custom.lastmod).format('YYYY-MM-DDTHH:mm:ss')
|
|
|
|
: moment(movie.premiere, config.default.moment).format(
|
|
|
|
'YYYY-MM-DDTHH:mm:ss'
|
|
|
|
);
|
|
|
|
|
2020-01-06 23:57:25 +01:00
|
|
|
result.push(onlyMovieSchema(movie, comments, options));
|
2019-10-01 21:34:02 +02:00
|
|
|
result.push(schemaBreadcrumbList);
|
|
|
|
|
|
|
|
var schema =
|
|
|
|
'<script type="application/ld+json">' +
|
|
|
|
JSON.stringify(result) +
|
|
|
|
'</script>';
|
|
|
|
|
|
|
|
var opengraph = '';
|
|
|
|
opengraph += '<meta name="twitter:card" content="summary_large_image" />';
|
|
|
|
opengraph +=
|
2020-04-30 03:18:35 +02:00
|
|
|
'<meta property="og:site_name" content="' + options.domain + '" />';
|
2019-10-01 21:34:02 +02:00
|
|
|
opengraph += '<meta property="og:title" content="' + page.title + '" />';
|
|
|
|
opengraph +=
|
|
|
|
'<meta property="og:description" content="' + page.description + '" />';
|
|
|
|
opengraph +=
|
|
|
|
movie.episode && movie.season
|
|
|
|
? '<meta property="og:type" content="video.episode" />' +
|
|
|
|
'<meta property="ya:ovs:episode" content="' +
|
|
|
|
movie.episode +
|
|
|
|
'" />' +
|
|
|
|
'<meta property="ya:ovs:season " content="' +
|
|
|
|
movie.season +
|
|
|
|
'" />'
|
|
|
|
: '<meta property="og:type" content="video.movie" />' +
|
|
|
|
'<meta property="ya:ovs:original_name" content="' +
|
|
|
|
movie.title_en +
|
|
|
|
'" />' +
|
|
|
|
'<meta property="ya:ovs:release_date" content="' +
|
|
|
|
ya_date +
|
|
|
|
'" />';
|
|
|
|
opengraph += '<meta property="og:url" content="' + page.url + '" />';
|
|
|
|
opengraph +=
|
|
|
|
'<meta property="og:video" content="//' +
|
2020-04-30 03:18:35 +02:00
|
|
|
options.domain +
|
2019-10-01 21:34:02 +02:00
|
|
|
'/iframe/' +
|
|
|
|
movie.kp_id +
|
|
|
|
'" />';
|
|
|
|
opengraph +=
|
|
|
|
'<meta property="og:video:url" content="//' +
|
2020-04-30 03:18:35 +02:00
|
|
|
options.domain +
|
2019-10-01 21:34:02 +02:00
|
|
|
'/iframe/' +
|
|
|
|
movie.kp_id +
|
|
|
|
'" />';
|
|
|
|
opengraph += '<meta property="og:video:type" content="video/mp4" />';
|
|
|
|
opengraph +=
|
|
|
|
'<meta property="video:duration" content="' +
|
|
|
|
(7777 + movie.title.length * 30) +
|
|
|
|
'" />';
|
|
|
|
opengraph += '<meta property="og:image" content="' + movie.picture + '" />';
|
|
|
|
opengraph += '<meta property="og:image:width" content="600" />';
|
|
|
|
opengraph += '<meta property="og:image:height" content="400" />';
|
|
|
|
opengraph +=
|
|
|
|
movie.poster.indexOf('http') + 1
|
|
|
|
? '<meta property="og:image" content="' + movie.poster + '" />'
|
|
|
|
: '<meta property="og:image" content="//' +
|
2020-04-30 03:18:35 +02:00
|
|
|
options.domain +
|
2019-10-01 21:34:02 +02:00
|
|
|
movie.poster +
|
|
|
|
'" />';
|
|
|
|
|
|
|
|
opengraph += '<meta property="ya:ovs:allow_embed" content="true" />';
|
|
|
|
opengraph += '<meta property="ya:ovs:quality" content="HD" />';
|
|
|
|
opengraph +=
|
|
|
|
'<meta property="ya:ovs:available_platform" content="Desktop,Mobile" />';
|
|
|
|
opengraph +=
|
|
|
|
'<meta property="ya:ovs:rating" content="' + movie.rating / 10 + '" />';
|
|
|
|
opengraph += '<meta property="ya:ovs:adult" content="false" />';
|
|
|
|
opengraph +=
|
|
|
|
'<meta property="ya:ovs:upload_date" content="' + ya_date + '" />';
|
|
|
|
|
2020-01-06 23:57:25 +01:00
|
|
|
var canonical = '<link rel="canonical" href="' + page.url + '"/>';
|
2019-12-08 22:26:32 +01:00
|
|
|
|
2020-04-28 22:51:54 +02:00
|
|
|
if (/:\/\/m\.|\/mobile-version/i.test(page.url)) {
|
|
|
|
canonical +=
|
|
|
|
'<link rel="canonical" href="' +
|
|
|
|
page.url
|
|
|
|
.replace('://m.', '://' + (config.botdomain || config.subdomain))
|
|
|
|
.replace('/mobile-version', '') +
|
|
|
|
'">';
|
|
|
|
}
|
|
|
|
|
2019-12-13 23:19:45 +01:00
|
|
|
var opensearch =
|
|
|
|
'<link rel="search" type="application/opensearchdescription+xml" title="' +
|
2020-04-30 03:18:35 +02:00
|
|
|
options.domain +
|
2019-12-13 23:19:45 +01:00
|
|
|
'" href="//' +
|
2020-04-30 03:18:35 +02:00
|
|
|
options.domain +
|
2019-12-13 23:19:45 +01:00
|
|
|
'/opensearch.xml"/>';
|
|
|
|
|
|
|
|
return schema + opengraph + canonical + opensearch;
|
2019-10-01 21:34:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create schema data for one movie.
|
|
|
|
*
|
|
|
|
* @param {Object} movie
|
2020-01-06 23:57:25 +01:00
|
|
|
* @param {Object} comments
|
2019-10-01 21:34:02 +02:00
|
|
|
* @param {Object} [options]
|
|
|
|
* @return {Object}
|
|
|
|
*/
|
|
|
|
|
2020-01-06 23:57:25 +01:00
|
|
|
function onlyMovieSchema(movie, comments, options) {
|
2019-10-01 21:34:02 +02:00
|
|
|
if (arguments.length === 2) {
|
|
|
|
options = {};
|
2020-03-16 21:00:37 +01:00
|
|
|
options.domain =
|
|
|
|
(config.botdomain || config.subdomain) + '' + config.domain;
|
2019-10-09 03:51:57 +02:00
|
|
|
options.origin =
|
2020-03-16 21:00:37 +01:00
|
|
|
config.protocol +
|
|
|
|
'' +
|
|
|
|
(config.botdomain || config.subdomain) +
|
|
|
|
'' +
|
|
|
|
config.domain;
|
2019-10-01 21:34:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
var result = {};
|
|
|
|
|
|
|
|
result['@context'] = 'http://schema.org';
|
|
|
|
result['@type'] = 'Movie';
|
|
|
|
result['name'] = movie.title;
|
|
|
|
result['alternativeHeadline'] = movie.title_en;
|
|
|
|
result['description'] = movie.description;
|
|
|
|
result['dateCreated'] = moment(movie.premiere, config.default.moment).format(
|
|
|
|
'YYYY-MM-DD'
|
|
|
|
);
|
|
|
|
result['image'] =
|
|
|
|
movie.poster.indexOf('http') + 1
|
|
|
|
? movie.poster
|
2020-03-16 21:00:37 +01:00
|
|
|
: config.protocol +
|
|
|
|
(config.botdomain || config.subdomain) +
|
|
|
|
config.domain +
|
|
|
|
movie.poster;
|
2019-10-01 21:34:02 +02:00
|
|
|
result['sameAs'] = movie.url;
|
|
|
|
result['url'] = options.url || movie.url;
|
|
|
|
result['actor'] = [];
|
|
|
|
result['director'] = [];
|
|
|
|
result['genre'] = [];
|
2020-01-06 23:57:25 +01:00
|
|
|
result['review'] = [];
|
2020-03-30 02:08:40 +02:00
|
|
|
if (movie.rating) {
|
|
|
|
result['aggregateRating'] = {
|
|
|
|
'@type': 'AggregateRating',
|
|
|
|
bestRating: 10,
|
|
|
|
ratingCount: movie.vote,
|
|
|
|
ratingValue: movie.rating / 10,
|
|
|
|
worstRating: 0
|
|
|
|
};
|
|
|
|
}
|
2019-10-01 21:34:02 +02:00
|
|
|
|
|
|
|
if (movie.actors_arr) {
|
|
|
|
movie.actors_arr.forEach(function(actor) {
|
|
|
|
result['actor'].push({
|
|
|
|
'@type': 'Person',
|
|
|
|
name: actor,
|
|
|
|
sameAs:
|
|
|
|
config.protocol +
|
|
|
|
options.domain +
|
|
|
|
'/' +
|
|
|
|
encodeURIComponent(config.urls.actor) +
|
2019-11-04 21:03:32 +01:00
|
|
|
config.urls.slash +
|
2019-10-01 21:34:02 +02:00
|
|
|
encodeURIComponent(actor)
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
if (movie.directors_arr) {
|
|
|
|
movie.directors_arr.forEach(function(director) {
|
|
|
|
result['director'].push({
|
|
|
|
'@type': 'Person',
|
|
|
|
name: director,
|
|
|
|
sameAs:
|
|
|
|
config.protocol +
|
|
|
|
options.domain +
|
|
|
|
'/' +
|
|
|
|
encodeURIComponent(config.urls.director) +
|
2019-11-04 21:03:32 +01:00
|
|
|
config.urls.slash +
|
2019-10-01 21:34:02 +02:00
|
|
|
encodeURIComponent(director)
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
if (movie.genres_arr) {
|
|
|
|
movie.genres_arr.forEach(function(genre) {
|
|
|
|
result['genre'].push(genre);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2020-01-06 23:57:25 +01:00
|
|
|
if (comments && comments.list && comments.list.length) {
|
|
|
|
comments.list.forEach(function(comment) {
|
|
|
|
result['review'].push({
|
|
|
|
'@type': 'Review',
|
|
|
|
author: {
|
|
|
|
'@type': 'Person',
|
|
|
|
name: comment.user
|
|
|
|
},
|
|
|
|
datePublished: moment(comment.time).format('YYYY-MM-DDTHH:mm:ss'),
|
|
|
|
reviewBody: comment.plain,
|
|
|
|
reviewRating: comment.star
|
|
|
|
? {
|
|
|
|
'@type': 'Rating',
|
|
|
|
bestRating: '3',
|
|
|
|
ratingValue: '' + comment.star,
|
|
|
|
worstRating: '0'
|
|
|
|
}
|
|
|
|
: null
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2019-10-01 21:34:02 +02:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create schema data for category.
|
|
|
|
*
|
|
|
|
* @param {Object} page
|
|
|
|
* @param {Object} movies
|
|
|
|
* @param {Object} [options]
|
|
|
|
* @return {String}
|
|
|
|
*/
|
|
|
|
|
|
|
|
function categorySchema(page, movies, options) {
|
|
|
|
if (arguments.length === 2) {
|
|
|
|
options = {};
|
2020-03-16 21:00:37 +01:00
|
|
|
options.domain =
|
|
|
|
(config.botdomain || config.subdomain) + '' + config.domain;
|
2019-10-09 03:51:57 +02:00
|
|
|
options.origin =
|
2020-03-16 21:00:37 +01:00
|
|
|
config.protocol +
|
|
|
|
'' +
|
|
|
|
(config.botdomain || config.subdomain) +
|
|
|
|
'' +
|
|
|
|
config.domain;
|
2019-10-01 21:34:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
var result = [];
|
|
|
|
|
|
|
|
var schemaItemList = {};
|
|
|
|
var schemaBreadcrumbList = {};
|
|
|
|
|
|
|
|
schemaItemList['@context'] = 'http://schema.org';
|
|
|
|
schemaItemList['@type'] = 'ItemList';
|
|
|
|
schemaItemList['name'] = page.title;
|
|
|
|
schemaItemList['numberOfItems'] = movies.length;
|
|
|
|
schemaItemList['itemListOrder'] = 'Descending';
|
|
|
|
schemaItemList['itemListElement'] = [];
|
|
|
|
|
|
|
|
movies.forEach(function(movie, key) {
|
2020-01-06 23:57:25 +01:00
|
|
|
var item = onlyMovieSchema(movie, {}, options);
|
2019-10-01 21:34:02 +02:00
|
|
|
item['description'] = '';
|
|
|
|
item['actor'] = [];
|
|
|
|
item['url'] = page.url + '#' + (key + 1);
|
|
|
|
schemaItemList['itemListElement'].push({
|
|
|
|
'@type': 'ListItem',
|
|
|
|
position: key + 1,
|
|
|
|
item: item
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
schemaBreadcrumbList['@context'] = 'http://schema.org';
|
|
|
|
schemaBreadcrumbList['@type'] = 'BreadcrumbList';
|
|
|
|
schemaBreadcrumbList['itemListElement'] = [];
|
|
|
|
|
|
|
|
schemaBreadcrumbList['itemListElement'].push({
|
|
|
|
'@type': 'ListItem',
|
|
|
|
position: 1,
|
|
|
|
item: {
|
|
|
|
'@id': '/',
|
|
|
|
name: config.l.home,
|
|
|
|
url: config.protocol + options.domain
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
schemaBreadcrumbList['itemListElement'].push({
|
|
|
|
'@type': 'ListItem',
|
|
|
|
position: 2,
|
|
|
|
item: {
|
|
|
|
'@id': page.url,
|
|
|
|
name: page.title,
|
|
|
|
url: page.url
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
result.push(schemaItemList);
|
|
|
|
result.push(schemaBreadcrumbList);
|
|
|
|
|
|
|
|
var schema =
|
|
|
|
'<script type="application/ld+json">' +
|
|
|
|
JSON.stringify(result) +
|
|
|
|
'</script>';
|
|
|
|
|
|
|
|
var opengraph = '';
|
|
|
|
opengraph += '<meta name="twitter:card" content="summary_large_image" />';
|
|
|
|
opengraph +=
|
2020-04-30 03:18:35 +02:00
|
|
|
'<meta property="og:site_name" content="' + options.domain + '" />';
|
2019-10-01 21:34:02 +02:00
|
|
|
opengraph += '<meta property="og:title" content="' + page.title + '" />';
|
|
|
|
opengraph +=
|
|
|
|
'<meta property="og:description" content="' + page.description + '" />';
|
|
|
|
opengraph += '<meta property="og:type" content="website" />';
|
|
|
|
opengraph += '<meta property="og:url" content="' + page.url + '" />';
|
|
|
|
opengraph +=
|
|
|
|
'<meta property="og:image" content="//' +
|
2020-04-30 03:18:35 +02:00
|
|
|
options.domain +
|
2019-10-01 21:34:02 +02:00
|
|
|
config.default.image +
|
|
|
|
'" />';
|
|
|
|
opengraph += '<meta property="og:image:width" content="600" />';
|
|
|
|
opengraph += '<meta property="og:image:height" content="400" />';
|
|
|
|
|
2019-12-08 22:26:32 +01:00
|
|
|
var canonical =
|
2020-04-28 22:51:54 +02:00
|
|
|
'<link rel="canonical" href="' + page.url.replace(/&/gi, '&') + '" />';
|
|
|
|
|
|
|
|
if (/:\/\/m\.|\/mobile-version/i.test(page.url)) {
|
|
|
|
canonical +=
|
|
|
|
'<link rel="canonical" href="' +
|
|
|
|
page.url
|
|
|
|
.replace(/&/gi, '&')
|
|
|
|
.replace('://m.', '://' + (config.botdomain || config.subdomain))
|
|
|
|
.replace('/mobile-version', '') +
|
|
|
|
'" />';
|
|
|
|
}
|
2019-10-01 21:34:02 +02:00
|
|
|
|
2019-12-13 23:19:45 +01:00
|
|
|
var opensearch =
|
|
|
|
'<link rel="search" type="application/opensearchdescription+xml" title="' +
|
2020-04-30 03:18:35 +02:00
|
|
|
options.domain +
|
2019-12-13 23:19:45 +01:00
|
|
|
'" href="//' +
|
2020-04-30 03:18:35 +02:00
|
|
|
options.domain +
|
2019-12-13 23:19:45 +01:00
|
|
|
'/opensearch.xml"/>';
|
|
|
|
|
|
|
|
return schema + opengraph + canonical + opensearch;
|
2019-10-01 21:34:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create schema data for index/categories/collections page.
|
|
|
|
*
|
|
|
|
* @param {Object} page
|
|
|
|
* @param {Object} [options]
|
|
|
|
* @return {String}
|
|
|
|
*/
|
|
|
|
|
|
|
|
function generalSchema(page, options) {
|
|
|
|
if (arguments.length === 1) {
|
|
|
|
options = {};
|
2020-03-16 21:00:37 +01:00
|
|
|
options.domain =
|
|
|
|
(config.botdomain || config.subdomain) + '' + config.domain;
|
2019-10-09 03:51:57 +02:00
|
|
|
options.origin =
|
2020-03-16 21:00:37 +01:00
|
|
|
config.protocol +
|
|
|
|
'' +
|
|
|
|
(config.botdomain || config.subdomain) +
|
|
|
|
'' +
|
|
|
|
config.domain;
|
2019-10-01 21:34:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
var result = {};
|
|
|
|
|
|
|
|
result['@context'] = 'http://schema.org';
|
|
|
|
result['@type'] = 'WebSite';
|
|
|
|
result['name'] = page.title;
|
|
|
|
result['url'] = config.protocol + options.domain;
|
|
|
|
result['potentialAction'] = {
|
|
|
|
'@type': 'SearchAction',
|
|
|
|
target:
|
|
|
|
config.protocol +
|
|
|
|
options.domain +
|
|
|
|
'/' +
|
|
|
|
config.urls.search +
|
2019-11-04 21:03:32 +01:00
|
|
|
'?q={query}',
|
2019-10-01 21:34:02 +02:00
|
|
|
'query-input': 'required name=query'
|
|
|
|
};
|
|
|
|
if (modules.social.status) {
|
|
|
|
result['sameAs'] = [];
|
|
|
|
if (modules.social.data.vk) {
|
|
|
|
result['sameAs'].push(modules.social.data.vk);
|
|
|
|
}
|
|
|
|
if (modules.social.data.facebook) {
|
|
|
|
result['sameAs'].push(modules.social.data.facebook);
|
|
|
|
}
|
|
|
|
if (modules.social.data.twitter) {
|
|
|
|
result['sameAs'].push(modules.social.data.twitter);
|
|
|
|
}
|
|
|
|
if (modules.social.data.telegram) {
|
|
|
|
result['sameAs'].push(modules.social.data.telegram);
|
|
|
|
}
|
|
|
|
if (modules.social.data.instagram) {
|
|
|
|
result['sameAs'].push(modules.social.data.instagram);
|
|
|
|
}
|
|
|
|
if (modules.social.data.youtube) {
|
|
|
|
result['sameAs'].push(modules.social.data.youtube);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var schema =
|
|
|
|
'<script type="application/ld+json">' +
|
|
|
|
JSON.stringify(result) +
|
|
|
|
'</script>';
|
|
|
|
|
|
|
|
var opengraph = '';
|
|
|
|
opengraph += '<meta name="twitter:card" content="summary_large_image" />';
|
|
|
|
opengraph +=
|
2020-04-30 03:18:35 +02:00
|
|
|
'<meta property="og:site_name" content="' + options.domain + '" />';
|
2019-10-01 21:34:02 +02:00
|
|
|
opengraph += '<meta property="og:title" content="' + page.title + '" />';
|
|
|
|
opengraph +=
|
|
|
|
'<meta property="og:description" content="' + page.description + '" />';
|
|
|
|
opengraph += '<meta property="og:type" content="website" />';
|
|
|
|
opengraph +=
|
|
|
|
'<meta property="og:url" content="' +
|
|
|
|
config.protocol +
|
|
|
|
options.domain +
|
|
|
|
'" />';
|
|
|
|
opengraph +=
|
|
|
|
'<meta property="og:image" content="//' +
|
2020-04-30 23:37:44 +02:00
|
|
|
options.domain +
|
2019-10-01 21:34:02 +02:00
|
|
|
config.default.image +
|
|
|
|
'" />';
|
|
|
|
opengraph += '<meta property="og:image:width" content="600" />';
|
|
|
|
opengraph += '<meta property="og:image:height" content="400" />';
|
|
|
|
|
2019-12-08 22:26:32 +01:00
|
|
|
var canonical =
|
2020-04-28 22:51:54 +02:00
|
|
|
'<link rel="canonical" href="' + config.protocol + options.domain + '" />';
|
2019-12-08 22:26:32 +01:00
|
|
|
|
2019-12-13 23:19:45 +01:00
|
|
|
var opensearch =
|
|
|
|
'<link rel="search" type="application/opensearchdescription+xml" title="' +
|
2020-04-30 03:18:35 +02:00
|
|
|
options.domain +
|
2019-12-13 23:19:45 +01:00
|
|
|
'" href="//' +
|
2020-04-30 03:18:35 +02:00
|
|
|
options.domain +
|
2019-12-13 23:19:45 +01:00
|
|
|
'/opensearch.xml"/>';
|
|
|
|
|
|
|
|
return schema + opengraph + canonical + opensearch;
|
2019-10-01 21:34:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create schema data for one content.
|
|
|
|
*
|
|
|
|
* @param {Object} content
|
|
|
|
* @param {Object} [options]
|
|
|
|
* @return {Object}
|
|
|
|
*/
|
|
|
|
|
|
|
|
function contentSchema(content, options) {
|
|
|
|
if (arguments.length === 1) {
|
|
|
|
options = {};
|
2020-03-16 21:00:37 +01:00
|
|
|
options.domain =
|
|
|
|
(config.botdomain || config.subdomain) + '' + config.domain;
|
2019-10-09 03:51:57 +02:00
|
|
|
options.origin =
|
2020-03-16 21:00:37 +01:00
|
|
|
config.protocol +
|
|
|
|
'' +
|
|
|
|
(config.botdomain || config.subdomain) +
|
|
|
|
'' +
|
|
|
|
config.domain;
|
2019-10-01 21:34:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
var result = {};
|
|
|
|
|
|
|
|
result['@context'] = 'http://schema.org';
|
|
|
|
result['@type'] = 'NewsArticle';
|
|
|
|
result['headline'] = content.title;
|
|
|
|
result['name'] = content.title;
|
2020-03-16 21:00:37 +01:00
|
|
|
result['author'] =
|
|
|
|
config.protocol + (config.botdomain || config.subdomain) + config.domain;
|
2019-10-01 21:34:02 +02:00
|
|
|
result['publisher'] = {
|
|
|
|
'@type': 'Organization',
|
2020-03-16 21:00:37 +01:00
|
|
|
name: (config.botdomain || config.subdomain) + config.domain,
|
2019-10-01 21:34:02 +02:00
|
|
|
logo: {
|
|
|
|
'@type': 'ImageObject',
|
2019-10-09 03:51:57 +02:00
|
|
|
url:
|
|
|
|
config.protocol +
|
2020-03-16 21:00:37 +01:00
|
|
|
(config.botdomain || config.subdomain) +
|
2019-10-09 03:51:57 +02:00
|
|
|
config.domain +
|
|
|
|
config.default.image
|
2019-10-01 21:34:02 +02:00
|
|
|
}
|
|
|
|
};
|
|
|
|
result['description'] = content.description_short;
|
|
|
|
result['datePublished'] = moment(
|
|
|
|
content.publish,
|
|
|
|
config.default.moment
|
|
|
|
).format('YYYY-MM-DD');
|
|
|
|
result['dateModified'] = moment(
|
|
|
|
content.publish,
|
|
|
|
config.default.moment
|
|
|
|
).format('YYYY-MM-DD');
|
|
|
|
result['image'] =
|
|
|
|
content.image.indexOf('http') + 1
|
|
|
|
? content.image
|
2020-03-16 21:00:37 +01:00
|
|
|
: config.protocol +
|
|
|
|
(config.botdomain || config.subdomain) +
|
|
|
|
config.domain +
|
|
|
|
content.image;
|
2019-10-01 21:34:02 +02:00
|
|
|
result['sameAs'] = content.url;
|
|
|
|
result['url'] = options.url || content.url;
|
|
|
|
result['mainEntityOfPage'] = {
|
|
|
|
'@type': 'WebPage',
|
|
|
|
'@id': options.url || content.url
|
|
|
|
};
|
|
|
|
|
|
|
|
var schema =
|
|
|
|
'<script type="application/ld+json">' +
|
|
|
|
JSON.stringify(result) +
|
|
|
|
'</script>';
|
|
|
|
|
|
|
|
var opengraph = '';
|
|
|
|
opengraph += '<meta name="twitter:card" content="summary_large_image" />';
|
|
|
|
opengraph +=
|
2020-04-30 03:18:35 +02:00
|
|
|
'<meta property="og:site_name" content="' + options.domain + '" />';
|
2019-10-01 21:34:02 +02:00
|
|
|
opengraph += '<meta property="og:title" content="' + content.title + '" />';
|
|
|
|
opengraph +=
|
|
|
|
'<meta property="og:description" content="' +
|
|
|
|
content.description_short +
|
|
|
|
'" />';
|
|
|
|
opengraph += '<meta property="og:type" content="website" />';
|
|
|
|
opengraph += '<meta property="og:url" content="' + result['url'] + '" />';
|
|
|
|
opengraph += '<meta property="og:image" content="' + result['image'] + '" />';
|
|
|
|
opengraph += '<meta property="og:image:width" content="600" />';
|
|
|
|
opengraph += '<meta property="og:image:height" content="400" />';
|
|
|
|
|
|
|
|
return schema + opengraph;
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
fullMovie: fullMovieSchema,
|
|
|
|
category: categorySchema,
|
|
|
|
general: generalSchema,
|
|
|
|
content: contentSchema
|
|
|
|
};
|