forked from gdcc/dataverse-previewers
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathvideo.js
126 lines (113 loc) · 4.57 KB
/
video.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
$(document).ready(function() {
startPreview(false);
});
function translateBaseHtmlPage() {
var videoPreviewText = $.i18n( "videoPreviewText" );
$( '.videoPreviewText' ).text( videoPreviewText );
}
function writeContent(fileUrl, file, title, authors) {
addStandardPreviewHeader(file, title, authors);
const queryParams = new URLSearchParams(window.location.search.substring(1));
const id = queryParams.get("datasetid");
const siteUrl = queryParams.get("siteUrl");
const apiKey = queryParams.get("key");
if (!siteUrl || !id) {
// fallback to simple video element in case of signed URLs
$(".preview").append($("<video/>") .prop("controls", true) .append($('<source/>').attr("src", fileUrl)))
return;
}
const versionUrl = `${siteUrl}/api/datasets/${id}/versions/`
+ queryParams.get("datasetversion")
+ (apiKey?`?key=${apiKey}`:'');
const videoId =queryParams.get("fileid") * 1; // converted to number
const userLanguages = [...navigator.languages];
const locale = queryParams.get("locale");
if (locale && !userLanguages.includes(locale)) {
userLanguages.unshift(locale); // add query argument as first element
}
$.ajax({
type: 'GET',
dataType: 'json',
crosssite: true,
url: versionUrl,
success: function(data, status) {
appendVideoElements(fileUrl, videoId, data.data.files, siteUrl, userLanguages, apiKey);
},
error: function(response, status, error) {
// fallback to simple video element
$(".preview").append($("<video/>") .prop("controls", true) .append($('<source/>').attr("src", fileUrl)))
}
});
}
function appendVideoElements(fileUrl, videoId, files, siteUrl, userLanguages, apiKey) {
const baseName = files // the video file name without extension
.find(item => item.dataFile.id === videoId)
.label.replace(/\.[a-z0-9]+$/i,'');
// find labels like "baseName.en.vtt", "baseName.de-CH.vtt" or "baseName.vtt"
const regex = new RegExp(`${baseName}(\\.([-a-z]+))?\\.vtt$`, 'i')
// create a map of URLs with their (optional) language
let trackUrlWithoutLang = null;
const subtitles = files
.filter(item => regex.test(item.label))
.reduce((map, item) => {
const lang = item.label.match(regex)[2];
const url = apiKey
?`${siteUrl}/api/access/datafile/${item.dataFile.id}?gbrecs=true&key=${apiKey}`
:`${siteUrl}/api/access/datafile/${item.dataFile.id}?gbrecs=true`
map.set(url, lang);
if (!lang) {
trackUrlWithoutLang = url;
}
return map;
}, new Map());
// sort subtitles by language value, 'de-CH' before 'de'
const sortedSubtitles = new Map([...subtitles.entries()].sort((a, b) => {
if (!a[1]) return 1;
if (!b[1]) return -1;
if (a[1].startsWith(b[1])) return -1;
if (b[1].startsWith(a[1])) return 1;
return a[1].localeCompare(b[1]);
}));
// determine default track
let defaultTrackUrl = null;
loop: for (const lang of userLanguages) {
// match user preferences with available subtitles
for (const [url, trackLang] of sortedSubtitles) {
if (trackLang) {
if (trackLang === lang || trackLang.startsWith(lang.replace(/-.*/, ''))) {
defaultTrackUrl = url;
break loop;
}
}
}
}
if (!defaultTrackUrl && subtitles) {
// no match found, use track without language
defaultTrackUrl = trackUrlWithoutLang;
}
if (!defaultTrackUrl && subtitles.size === 1) {
// no match found, and only one track available, use that one
defaultTrackUrl = subtitles.keys().next().value;
}
const videoElement = $("<video/>")
.prop("controls", true)
.append($('<source/>').attr("src", fileUrl));
sortedSubtitles.forEach((trackLang, url) => {
const trackElement = $('<track/>')
.attr("kind", "subtitles")
.attr("src", url);
if (trackLang) {
trackElement
.attr("label", trackLang)
.attr("srclang", trackLang);
} else {
trackElement.attr("label", "default");
}
console.log("url: ", url, "defaultTrackUrl: ", defaultTrackUrl);
if (url === defaultTrackUrl) {
trackElement.attr("default", true);
}
videoElement.append(trackElement);
});
$(".preview").append(videoElement);
}