Compare commits
10 Commits
Author | SHA1 | Date |
---|---|---|
|
e5ffec7a55 | |
|
a67a5ee34b | |
|
14dafa4abe | |
|
213bb2f882 | |
|
77aec74483 | |
|
6852d06e04 | |
|
52d6d989f8 | |
|
df93674bf7 | |
|
026585e50b | |
|
9d5f0f9146 |
1282
cinera/cinera.c
1282
cinera/cinera.c
File diff suppressed because it is too large
Load Diff
|
@ -42,7 +42,7 @@ window.addEventListener("resize", function() {
|
|||
}
|
||||
});
|
||||
|
||||
window.onorientationchange = function() {
|
||||
screen.orientation.onchange = function() {
|
||||
if(CineraProps.IsMobile)
|
||||
{
|
||||
setTimeout(DelayedUpdateSize, 512, player);
|
||||
|
@ -65,3 +65,12 @@ document.addEventListener("keydown", function(ev) {
|
|||
ev.preventDefault();
|
||||
}
|
||||
});
|
||||
|
||||
document.addEventListener("fullscreenchange", function() {
|
||||
if(!document.fullscreenElement && CineraProps.V == views.SUPERTHEATRE)
|
||||
{
|
||||
CineraProps.V = views.THEATRE;
|
||||
localStorage.setItem(player.cineraViewStorageItem, views.THEATRE);
|
||||
player.updateSize();
|
||||
}
|
||||
});
|
||||
|
|
|
@ -163,9 +163,9 @@ function Player(cineraElement, refsCallback) {
|
|||
for (var i = 0; i < markerEls.length; ++i) {
|
||||
var markerEl = markerEls[i];
|
||||
var marker = {
|
||||
timestamp: parseInt(markerEl.getAttribute("data-timestamp"), 10),
|
||||
timestamp: parseFloat(markerEl.getAttribute("data-timestamp")),
|
||||
ref: markerEl.getAttribute("data-ref"),
|
||||
endTime: (i < markerEls.length - 1 ? parseInt(markerEls[i+1].getAttribute("data-timestamp"), 10) : null),
|
||||
endTime: (i < markerEls.length - 1 ? parseFloat(markerEls[i+1].getAttribute("data-timestamp")) : null),
|
||||
el: markerEl,
|
||||
fadedProgress: markerEl.querySelector(".progress.faded"),
|
||||
progress: markerEl.querySelector(".progress.main"),
|
||||
|
@ -955,8 +955,7 @@ Player.prototype.InitMobileStyle = function()
|
|||
this.IconifyMenuTogglers();
|
||||
this.InitMobileControls();
|
||||
this.ConnectMobileControls();
|
||||
var VideoContainer = this.root.querySelector(".video_container");
|
||||
this.ApplyMobileStyle(VideoContainer);
|
||||
this.ApplyMobileStyle(this.videoContainer);
|
||||
}
|
||||
|
||||
// Call this after changing the size of the video container in order to update the platform player.
|
||||
|
@ -1238,7 +1237,7 @@ Player.prototype.doFrame = function() {
|
|||
this.platformPlayer.getCurrentTime()
|
||||
.then(function(Result) {
|
||||
Parent.currentTime = Result;
|
||||
if(this.desiredTime == -1) { this.desiredTime = this.currentTime; }
|
||||
if(Parent.desiredTime == -1) { Parent.desiredTime = Parent.currentTime; }
|
||||
Parent.updateProgress();
|
||||
});
|
||||
} break;
|
||||
|
@ -1461,7 +1460,10 @@ Player.prototype.onPlatformReady = function() {
|
|||
case vod_platform.VIMEO:
|
||||
{
|
||||
this.videoContainer.style.position = "relative";
|
||||
this.videoContainer.style.alignSelf = "unset";
|
||||
if(!CineraProps.IsMobile)
|
||||
{
|
||||
this.videoContainer.style.alignSelf = "unset";
|
||||
}
|
||||
|
||||
var CallData = {
|
||||
id: this.videoContainer.getAttribute("data-videoId"),
|
||||
|
@ -1552,10 +1554,11 @@ Player.prototype.updateLink = function()
|
|||
} break;
|
||||
case vod_platform.VIMEO:
|
||||
{
|
||||
var Parent = this;
|
||||
this.platformPlayer.getCurrentTime()
|
||||
.then(function(Response)
|
||||
{
|
||||
this.link.value = baseURL + "#" + Math.round(Response);
|
||||
Parent.link.value = baseURL + "#" + Math.round(Response);
|
||||
});
|
||||
} break;
|
||||
case vod_platform.YOUTUBE:
|
||||
|
@ -1628,6 +1631,7 @@ Player.prototype.toggleMenuVisibility = function(MenuID, Trigger) {
|
|||
if(element.classList.contains("visible"))
|
||||
{
|
||||
HideMenu(element);
|
||||
this.MenusFocused.MenuID = menu_id.UNSET;
|
||||
|
||||
if(Trigger == trigger_id.KEYBOARD && this.Menus[menu_id.MARKERS].Item.LastFocused)
|
||||
{
|
||||
|
@ -2013,12 +2017,12 @@ Player.prototype.handleKey = function(key) {
|
|||
case menu_id.MARKERS:
|
||||
{
|
||||
var time = this.MenusFocused.Item.getAttribute("data-timestamp");
|
||||
this.setTimeThenPlay(parseInt(time));
|
||||
this.setTimeThenPlay(parseFloat(time));
|
||||
} break;
|
||||
case menu_id.QUOTES:
|
||||
{
|
||||
var time = this.MenusFocused.Item.querySelector(".timecode").getAttribute("data-timestamp");
|
||||
this.setTimeThenPlay(parseInt(time));
|
||||
this.setTimeThenPlay(parseFloat(time));
|
||||
if(this.currentMarker)
|
||||
{
|
||||
this.setScroller(this.Menus[menu_id.MARKERS], this.currentMarker.el, true, false);
|
||||
|
@ -2028,7 +2032,7 @@ Player.prototype.handleKey = function(key) {
|
|||
case menu_id.REFERENCES:
|
||||
{
|
||||
var time = this.MenusFocused.Identifier.getAttribute("data-timestamp");
|
||||
this.setTimeThenPlay(parseInt(time));
|
||||
this.setTimeThenPlay(parseFloat(time));
|
||||
if(this.currentMarker)
|
||||
{
|
||||
this.setScroller(this.Menus[menu_id.MARKERS], this.currentMarker.el, true, false);
|
||||
|
@ -2050,7 +2054,7 @@ Player.prototype.handleKey = function(key) {
|
|||
if(this.currentMarker && this.currentMarker.el)
|
||||
{
|
||||
var time = this.currentMarker.el.getAttribute("data-timestamp");
|
||||
this.setTimeThenPlay(parseInt(time));
|
||||
this.setTimeThenPlay(parseFloat(time));
|
||||
this.setScroller(this.Menus[menu_id.MARKERS], this.currentMarker.el, true, false);
|
||||
}
|
||||
}
|
||||
|
@ -2910,7 +2914,7 @@ Player.prototype.mouseOverCredits = function(item) {
|
|||
|
||||
function mouseSkipToTimecode(player, time, ev)
|
||||
{
|
||||
player.setTimeThenPlay(parseInt(time, 10));
|
||||
player.setTimeThenPlay(parseFloat(time));
|
||||
ev.preventDefault();
|
||||
ev.stopPropagation();
|
||||
return false;
|
||||
|
|
|
@ -13,6 +13,9 @@ DeriveReliableWindowDimensions()
|
|||
Y: null,
|
||||
};
|
||||
|
||||
var ScrollPosX = window.scrollX;
|
||||
var ScrollPosY = window.scrollY;
|
||||
|
||||
var DisplaySettings = [];
|
||||
for(var i = 0; i < document.body.children.length; ++i)
|
||||
{
|
||||
|
@ -40,6 +43,9 @@ DeriveReliableWindowDimensions()
|
|||
Child.style.display = DisplaySettings.shift();
|
||||
}
|
||||
|
||||
ScrollTriggeredInternally = true;
|
||||
window.scroll(ScrollPosX, ScrollPosY);
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
|
@ -76,7 +82,7 @@ function IsVisible(Element, WindowDim) {
|
|||
function
|
||||
GetRealOrientation(PreferredLandscape, IsMobile)
|
||||
{
|
||||
var Result = window.orientation;
|
||||
var Result = screen.orientation.angle;
|
||||
var WindowDim = GetWindowDim(IsMobile);
|
||||
if(WindowDim.Y > WindowDim.X)
|
||||
{
|
||||
|
@ -317,6 +323,7 @@ function IsInRangeEx(Min, N, Max)
|
|||
}
|
||||
|
||||
/* Auto-scrolling */
|
||||
var ScrollTriggeredInternally = false;
|
||||
var LastScrollYPos = 0;
|
||||
var ScrollTicking = false;
|
||||
var ScrollerFunction;
|
||||
|
@ -383,7 +390,11 @@ function
|
|||
InitScrollEventListener(Element, IsMobile, StickyObscuringElement)
|
||||
{
|
||||
window.addEventListener('scroll', function() {
|
||||
if(ScrollCondition == undefined || ScrollCondition == true)
|
||||
if(ScrollTriggeredInternally)
|
||||
{
|
||||
ScrollTriggeredInternally = false;
|
||||
}
|
||||
else if(ScrollCondition == undefined || ScrollCondition == true)
|
||||
{
|
||||
LastScrollYPos = window.scrollY;
|
||||
|
||||
|
@ -540,35 +551,6 @@ BindHelp(Button, DocumentationContainer)
|
|||
})
|
||||
}
|
||||
|
||||
function RGBtoHSL(colour)
|
||||
{
|
||||
var rgb = colour.slice(4, -1).split(", ");
|
||||
var red = rgb[0];
|
||||
var green = rgb[1];
|
||||
var blue = rgb[2];
|
||||
var min = Math.min(red, green, blue);
|
||||
var max = Math.max(red, green, blue);
|
||||
var chroma = max - min;
|
||||
var hue = 0;
|
||||
if(max == red)
|
||||
{
|
||||
hue = ((green - blue) / chroma) % 6;
|
||||
}
|
||||
else if(max == green)
|
||||
{
|
||||
hue = ((blue - red) / chroma) + 2;
|
||||
}
|
||||
else if(max == blue)
|
||||
{
|
||||
hue = ((red - green) / chroma) + 4;
|
||||
}
|
||||
|
||||
var saturation = chroma / 255 * 100;
|
||||
hue = (hue * 60) < 0 ? 360 + (hue * 60) : (hue * 60);
|
||||
|
||||
return [hue, saturation]
|
||||
}
|
||||
|
||||
function getBackgroundColourRGB(element) {
|
||||
var Colour = getComputedStyle(element).getPropertyValue("background-color");
|
||||
var depth = 0;
|
||||
|
@ -599,28 +581,34 @@ function setTextLightness(textElement)
|
|||
{
|
||||
var textHue = textElement.getAttribute("data-hue");
|
||||
var textSaturation = textElement.getAttribute("data-saturation");
|
||||
if(getBackgroundBrightness(textElement.parentNode) < 127)
|
||||
if(textHue && textSaturation)
|
||||
{
|
||||
textElement.style.color = ("hsl(" + textHue + ", " + textSaturation + ", 76%)");
|
||||
}
|
||||
else
|
||||
{
|
||||
textElement.style.color = ("hsl(" + textHue + ", " + textSaturation + ", 24%)");
|
||||
if(getBackgroundBrightness(textElement.parentNode) < 127)
|
||||
{
|
||||
textElement.style.color = ("hsl(" + textHue + ", " + textSaturation + ", 76%)");
|
||||
}
|
||||
else
|
||||
{
|
||||
textElement.style.color = ("hsl(" + textHue + ", " + textSaturation + ", 24%)");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function setDotLightness(topicDot)
|
||||
{
|
||||
var Hue = RGBtoHSL(getComputedStyle(topicDot).getPropertyValue("background-color"))[0];
|
||||
var Saturation = RGBtoHSL(getComputedStyle(topicDot).getPropertyValue("background-color"))[1];
|
||||
if(getBackgroundBrightness(topicDot.parentNode) < 127)
|
||||
var dotHue = topicDot.getAttribute("data-hue");
|
||||
var dotSaturation = topicDot.getAttribute("data-saturation");
|
||||
if(dotHue && dotSaturation)
|
||||
{
|
||||
topicDot.style.backgroundColor = ("hsl(" + Hue + ", " + Saturation + "%, 76%)");
|
||||
topicDot.style.borderColor = ("hsl(" + Hue + ", " + Saturation + "%, 76%)");
|
||||
}
|
||||
else
|
||||
{
|
||||
topicDot.style.backgroundColor = ("hsl(" + Hue + ", " + Saturation + "%, 47%)");
|
||||
topicDot.style.borderColor = ("hsl(" + Hue + ", " + Saturation + "%, 47%)");
|
||||
if(getBackgroundBrightness(topicDot.parentNode) < 127)
|
||||
{
|
||||
topicDot.style.backgroundColor = ("hsl(" + dotHue + ", " + dotSaturation + ", 76%)");
|
||||
topicDot.style.borderColor = ("hsl(" + dotHue + ", " + dotSaturation + ", 76%)");
|
||||
}
|
||||
else
|
||||
{
|
||||
topicDot.style.backgroundColor = ("hsl(" + dotHue + ", " + dotSaturation + ", 47%)");
|
||||
topicDot.style.borderColor = ("hsl(" + dotHue + ", " + dotSaturation + ", 47%)");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -213,11 +213,11 @@ function prepareToParseIndexFile(project)
|
|||
mode = "markers";
|
||||
episode.markers = [];
|
||||
} else if (mode == "markers") {
|
||||
var match = line.match(/"(\d+)": "(.+)"/);
|
||||
var match = line.match(/"(\d+.\d+)": "(.+)"/);
|
||||
if (match == null) {
|
||||
console.log(name, line);
|
||||
} else {
|
||||
var totalTime = parseInt(line.slice(1));
|
||||
var totalTime = parseFloat(line.slice(1));
|
||||
var marker = {
|
||||
totalTime: totalTime,
|
||||
prettyTime: markerTime(totalTime),
|
||||
|
@ -292,7 +292,7 @@ function markerTime(totalTime) {
|
|||
var markTime = "(";
|
||||
var hours = Math.floor(totalTime / 60 / 60);
|
||||
var minutes = Math.floor(totalTime / 60) % 60;
|
||||
var seconds = totalTime % 60;
|
||||
var seconds = Math.floor(totalTime) % 60;
|
||||
if (hours > 0) {
|
||||
markTime += padTimeComponent(hours) + ":";
|
||||
}
|
||||
|
@ -460,7 +460,7 @@ function runSearch(refresh) {
|
|||
Search.ResultsSummary.style.display = "none";
|
||||
}
|
||||
|
||||
var totalTime = Math.floor(totalSeconds/60/60) + "h " + Math.floor(totalSeconds/60)%60 + "m " + totalSeconds%60 + "s ";
|
||||
var totalTime = Math.floor(totalSeconds/60/60) + "h " + Math.floor(totalSeconds/60)%60 + "m " + Math.floor(totalSeconds)%60 + "s ";
|
||||
|
||||
Search.ResultsSummary.textContent = "Found: " + numEpisodes + " episodes, " + numMarkers + " markers, " + totalTime + "total.";
|
||||
}
|
||||
|
@ -3866,7 +3866,7 @@ InitResizeEventListener()
|
|||
function
|
||||
InitOrientationChangeListener()
|
||||
{
|
||||
window.onorientationchange = function()
|
||||
screen.orientation.onchange = function()
|
||||
{
|
||||
if(CineraProps.IsMobile)
|
||||
{
|
||||
|
|
|
@ -76,7 +76,7 @@ typedef struct {
|
|||
typedef struct {
|
||||
int line;
|
||||
|
||||
int h, m, s;
|
||||
int h, m, s, ms;
|
||||
|
||||
char* text;
|
||||
char* author;
|
||||
|
@ -471,7 +471,7 @@ next_attr:
|
|||
|
||||
static void _hmml_parse_timecode(struct _hmml_parser* p, HMML_Timestamp* ts)
|
||||
{
|
||||
unsigned int h = 0, m = 0, s = 0;
|
||||
unsigned int h = 0, m = 0, s = 0, ms = 0;
|
||||
int offset = 0;
|
||||
int count = sscanf(p->cursor, "[%u:%u%n", &m, &s, &offset);
|
||||
|
||||
|
@ -485,7 +485,7 @@ static void _hmml_parse_timecode(struct _hmml_parser* p, HMML_Timestamp* ts)
|
|||
if(c == ':') {
|
||||
unsigned int tmp;
|
||||
offset = 0;
|
||||
if(sscanf(p->cursor, ":%u]%n", &tmp, &offset) != 1 || offset == 0) {
|
||||
if(sscanf(p->cursor, ":%u%n", &tmp, &offset) != 1 || offset == 0) {
|
||||
_hmml_err(p, "Unable to parse 3-part timecode");
|
||||
}
|
||||
|
||||
|
@ -494,6 +494,27 @@ static void _hmml_parse_timecode(struct _hmml_parser* p, HMML_Timestamp* ts)
|
|||
s = tmp;
|
||||
|
||||
p->cursor += offset;
|
||||
c = *p->cursor;
|
||||
}
|
||||
|
||||
if(c == '.') {
|
||||
unsigned int tmp;
|
||||
offset = 0;
|
||||
|
||||
int non_number_chars = 2;
|
||||
int digits_in_100 = 3;
|
||||
int max_chars_to_parse = non_number_chars + digits_in_100;
|
||||
|
||||
if(sscanf(p->cursor, ".%u]%n", &tmp, &offset) != 1 || offset == 0 || offset > max_chars_to_parse) {
|
||||
_hmml_err(p, "Unable to parse %u.5-part timecode", h ? 3 : 2);
|
||||
}
|
||||
|
||||
for(int i = offset - non_number_chars; i < digits_in_100; ++i) {
|
||||
tmp *= 10;
|
||||
}
|
||||
ms = tmp;
|
||||
|
||||
p->cursor += offset;
|
||||
|
||||
} else if(c != ']') {
|
||||
_hmml_err(p, "Unable to parse timecode");
|
||||
|
@ -501,6 +522,10 @@ static void _hmml_parse_timecode(struct _hmml_parser* p, HMML_Timestamp* ts)
|
|||
++p->cursor;
|
||||
}
|
||||
|
||||
if(ms >= 1000) {
|
||||
_hmml_err(p, "Milliseconds cannot exceed 999");
|
||||
}
|
||||
|
||||
if(s >= 60) {
|
||||
_hmml_err(p, "Seconds cannot exceed 59");
|
||||
}
|
||||
|
@ -512,6 +537,7 @@ static void _hmml_parse_timecode(struct _hmml_parser* p, HMML_Timestamp* ts)
|
|||
ts->h = h;
|
||||
ts->m = m;
|
||||
ts->s = s;
|
||||
ts->ms = ms;
|
||||
}
|
||||
|
||||
static void _hmml_store_marker(struct _hmml_parser* p, HMML_Timestamp* ts, char** out, char* text_mem, size_t text_mem_size)
|
||||
|
@ -824,7 +850,7 @@ void hmml_free(HMML_Output* out)
|
|||
}
|
||||
|
||||
const struct HMML_Version hmml_version = {
|
||||
2, 0, 14
|
||||
2, 0, 15
|
||||
};
|
||||
|
||||
#undef HSTX
|
||||
|
|
Loading…
Reference in New Issue