135 lines
5.1 KiB
JavaScript
135 lines
5.1 KiB
JavaScript
#include utility.js
|
|
#include embed/audio.js
|
|
#include embed/image.js
|
|
#include embed/video.js
|
|
#include ext/uiharu.js
|
|
|
|
const MszEmbed = (function() {
|
|
let uiharu = undefined;
|
|
|
|
return {
|
|
init: function(endPoint) {
|
|
uiharu = new MszUiharu(endPoint);
|
|
},
|
|
handle: function(targets) {
|
|
if(!Array.isArray(targets))
|
|
targets = Array.from(targets);
|
|
|
|
const filtered = new Map;
|
|
for(const target of targets) {
|
|
if(!(target instanceof HTMLElement)
|
|
|| !('dataset' in target)
|
|
|| !('mszEmbedUrl' in target.dataset))
|
|
continue;
|
|
|
|
const cleanUrl = target.dataset.mszEmbedUrl.replace(/ /, '%20');
|
|
if(cleanUrl.indexOf('https://') !== 0
|
|
&& cleanUrl.indexOf('http://') !== 0
|
|
&& cleanUrl.indexOf('//') !== 0) {
|
|
target.textContent = target.dataset.mszEmbedUrl;
|
|
continue;
|
|
}
|
|
|
|
$rc(target);
|
|
target.appendChild($e({
|
|
tag: 'i',
|
|
attrs: {
|
|
className: 'fas fa-2x fa-spinner fa-pulse',
|
|
style: {
|
|
width: '32px',
|
|
height: '32px',
|
|
lineHeight: '32px',
|
|
textAlign: 'center',
|
|
},
|
|
},
|
|
}));
|
|
|
|
if(filtered.has(cleanUrl))
|
|
filtered.get(cleanUrl).push(target);
|
|
else
|
|
filtered.set(cleanUrl, [target]);
|
|
}
|
|
|
|
const replaceWithUrl = function(targets, url) {
|
|
for(const target of targets) {
|
|
let body = $e({
|
|
tag: 'a',
|
|
attrs: {
|
|
className: 'link',
|
|
href: url,
|
|
target: '_blank',
|
|
rel: 'noopener noreferrer',
|
|
},
|
|
child: url
|
|
});
|
|
$ib(target, body);
|
|
$r(target);
|
|
}
|
|
};
|
|
|
|
filtered.forEach(function(targets, url) {
|
|
uiharu.lookupOne(url)
|
|
.catch(ex => {
|
|
replaceWithUrl(targets, url);
|
|
console.error(ex);
|
|
})
|
|
.then(result => {
|
|
const metadata = result.body;
|
|
|
|
if(metadata.error) {
|
|
replaceWithUrl(targets, url);
|
|
console.error(metadata.error);
|
|
return;
|
|
}
|
|
|
|
if(metadata.title === undefined) {
|
|
replaceWithUrl(targets, url);
|
|
console.warn('Media is no longer available.');
|
|
return;
|
|
}
|
|
|
|
let phc = undefined,
|
|
options = {
|
|
onembed: console.log,
|
|
};
|
|
|
|
if(metadata.type === 'youtube:video') {
|
|
phc = MszVideoEmbedPlaceholder;
|
|
options.type = 'youtube';
|
|
options.player = MszVideoEmbedYouTube;
|
|
} else if(metadata.type === 'niconico:video') {
|
|
phc = MszVideoEmbedPlaceholder;
|
|
options.type = 'nicovideo';
|
|
options.player = MszVideoEmbedNicoNico;
|
|
} else if(metadata.is_video) {
|
|
phc = MszVideoEmbedPlaceholder;
|
|
options.type = 'external';
|
|
options.player = MszVideoEmbedPlayer;
|
|
//options.frame = MszVideoEmbedFrame;
|
|
options.nativeControls = true;
|
|
options.autosize = false;
|
|
options.maxWidth = 640;
|
|
options.maxHeight = 360;
|
|
} else if(metadata.is_audio) {
|
|
phc = MszAudioEmbedPlaceholder;
|
|
options.type = 'external';
|
|
options.player = MszAudioEmbedPlayer;
|
|
options.nativeControls = true;
|
|
} else if(metadata.is_image) {
|
|
phc = MszImageEmbed;
|
|
options.type = 'external';
|
|
}
|
|
|
|
if(phc === undefined)
|
|
return;
|
|
|
|
for(const target of targets) {
|
|
const placeholder = new phc(metadata, options, target);
|
|
if(placeholder !== undefined)
|
|
placeholder.replaceElement(target);
|
|
}
|
|
});
|
|
});
|
|
},
|
|
};
|
|
})();
|