mirror of
https://github.com/FrankerFaceZ/FrankerFaceZ.git
synced 2025-08-28 17:00:54 +00:00
4.28.4
* Fixed: Current channel detection, both on channel pages and on mod view. (Closes #1099) * Fixed: Clicking the stream latency metadata not toggling the video stats display. * Fixed: Portrait mode not correctly positioning page content, notably breaking portrait mode with chat on top. * Fixed: Whisper messages not rendering correctly and logging error messages. * Fixed: Clip messages not rendering correctly and logging error messages, on the clips subdomain. * Fixed: Use `/3.0` URLs for Twitch's emote CDN rather than `/4.0` to prevent 404 errors. Kappa will look smaller to some users, but it's a price I'm willing to pay and entirely Twitch's fault anyways. * Fixed: Volume control not being hidden when gain control has replaced the default volume control.
This commit is contained in:
parent
c8bb667c53
commit
207fda2b36
10 changed files with 40 additions and 16 deletions
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "frankerfacez",
|
"name": "frankerfacez",
|
||||||
"author": "Dan Salvato LLC",
|
"author": "Dan Salvato LLC",
|
||||||
"version": "4.28.3",
|
"version": "4.28.4",
|
||||||
"description": "FrankerFaceZ is a Twitch enhancement suite.",
|
"description": "FrankerFaceZ is a Twitch enhancement suite.",
|
||||||
"private": true,
|
"private": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
|
|
|
@ -1429,7 +1429,7 @@ export default class Chat extends Module {
|
||||||
offset = is_action ? 4 : 0,
|
offset = is_action ? 4 : 0,
|
||||||
|
|
||||||
out = msg._ffz_message = {
|
out = msg._ffz_message = {
|
||||||
user: msg.from,
|
user: {...msg.from}, // Apollo seals this~
|
||||||
message: msg.content.slice(offset),
|
message: msg.content.slice(offset),
|
||||||
is_action,
|
is_action,
|
||||||
ffz_emotes: emotes,
|
ffz_emotes: emotes,
|
||||||
|
|
|
@ -407,6 +407,20 @@ export default class Metadata extends Module {
|
||||||
},
|
},
|
||||||
|
|
||||||
click() {
|
click() {
|
||||||
|
const Player = this.resolve('site.player'),
|
||||||
|
fine = this.resolve('site.fine'),
|
||||||
|
player = Player.Player?.first,
|
||||||
|
inst = fine && player && fine.searchTree(player, n => n.props?.setStatsOverlay, 200),
|
||||||
|
cont = inst && fine.getChildNode(player),
|
||||||
|
el = cont && cont.querySelector('[data-a-target="player-overlay-video-stats"]');
|
||||||
|
|
||||||
|
if ( ! inst )
|
||||||
|
return;
|
||||||
|
|
||||||
|
inst.props.setStatsOverlay(el ? 0 : 1);
|
||||||
|
},
|
||||||
|
|
||||||
|
/*click() {
|
||||||
const Player = this.resolve('site.player'),
|
const Player = this.resolve('site.player'),
|
||||||
ui = Player.playerUI;
|
ui = Player.playerUI;
|
||||||
|
|
||||||
|
@ -414,7 +428,7 @@ export default class Metadata extends Module {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ui.setStatsOverlay(ui.statsOverlay === 1 ? 0 : 1);
|
ui.setStatsOverlay(ui.statsOverlay === 1 ? 0 : 1);
|
||||||
},
|
},*/
|
||||||
|
|
||||||
color(data) {
|
color(data) {
|
||||||
const setting = this.settings.get('metadata.stream-delay-warning');
|
const setting = this.settings.get('metadata.stream-delay-warning');
|
||||||
|
|
|
@ -26,6 +26,7 @@ export default class Line extends Module {
|
||||||
);
|
);
|
||||||
|
|
||||||
this.render = true;
|
this.render = true;
|
||||||
|
this.messages = new WeakMap();
|
||||||
|
|
||||||
window.toggleLines = () => {
|
window.toggleLines = () => {
|
||||||
this.render = ! this.render;
|
this.render = ! this.render;
|
||||||
|
@ -126,7 +127,7 @@ export default class Line extends Module {
|
||||||
const msg = inst.props.node,
|
const msg = inst.props.node,
|
||||||
user = msg?.commentor;
|
user = msg?.commentor;
|
||||||
if ( user && ((id && id == user.id) || (login && login == user.login)) ) {
|
if ( user && ((id && id == user.id) || (login && login == user.login)) ) {
|
||||||
msg._ffz_message = null;
|
this.messages.delete(msg);
|
||||||
inst.forceUpdate();
|
inst.forceUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -157,9 +158,7 @@ export default class Line extends Module {
|
||||||
_updateLines(clear_tokens = true, clear_badges = true) { // eslint-disable-line no-unused-vars
|
_updateLines(clear_tokens = true, clear_badges = true) { // eslint-disable-line no-unused-vars
|
||||||
for(const inst of this.ChatLine.instances) {
|
for(const inst of this.ChatLine.instances) {
|
||||||
const msg = inst.props.node;
|
const msg = inst.props.node;
|
||||||
// TODO: Selective state clear.
|
this.messages.delete(msg);
|
||||||
if ( msg?._ffz_message )
|
|
||||||
msg._ffz_message = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.ChatLine.forceUpdate();
|
this.ChatLine.forceUpdate();
|
||||||
|
@ -170,8 +169,8 @@ export default class Line extends Module {
|
||||||
if ( ! msg || ! msg.message )
|
if ( ! msg || ! msg.message )
|
||||||
return msg;
|
return msg;
|
||||||
|
|
||||||
if ( msg._ffz_message )
|
if ( this.messages.has(msg) )
|
||||||
return msg._ffz_message;
|
return this.messages.get(msg);
|
||||||
|
|
||||||
const room = this.chat.getRoom(video.owner.id, null, true, true),
|
const room = this.chat.getRoom(video.owner.id, null, true, true),
|
||||||
author = msg.commenter || {},
|
author = msg.commenter || {},
|
||||||
|
@ -182,7 +181,7 @@ export default class Line extends Module {
|
||||||
if ( badge )
|
if ( badge )
|
||||||
badges[badge.setID] = badge.version;
|
badges[badge.setID] = badge.version;
|
||||||
|
|
||||||
const out = msg._ffz_message = {
|
const out = {
|
||||||
user: {
|
user: {
|
||||||
color: author.chatColor,
|
color: author.chatColor,
|
||||||
id: author.id,
|
id: author.id,
|
||||||
|
@ -200,6 +199,8 @@ export default class Line extends Module {
|
||||||
|
|
||||||
this.detokenizeMessage(out, msg);
|
this.detokenizeMessage(out, msg);
|
||||||
|
|
||||||
|
this.messages.set(msg, out);
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -995,9 +995,13 @@ export default class PlayerBase extends Module {
|
||||||
if ( document.pictureInPictureElement != null )
|
if ( document.pictureInPictureElement != null )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if ( this.settings.get('player.force-visible') )
|
||||||
|
return false;
|
||||||
|
|
||||||
return document.visibilityState === 'hidden';
|
return document.visibilityState === 'hidden';
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
} catch(err) {
|
} catch(err) {
|
||||||
this.log.warn('Unable to install document visibility hook.', err);
|
this.log.warn('Unable to install document visibility hook.', err);
|
||||||
}
|
}
|
||||||
|
|
|
@ -521,7 +521,9 @@ export default class Channel extends Module {
|
||||||
i=0;
|
i=0;
|
||||||
while(state != null && channel == null && i < 50) {
|
while(state != null && channel == null && i < 50) {
|
||||||
state = state?.next;
|
state = state?.next;
|
||||||
channel = state?.memoizedState?.current?.previousData?.result?.data?.userOrError;
|
channel = state?.memoizedState?.current?.currentObservable?.lastResult?.data?.userOrError;
|
||||||
|
if ( ! channel )
|
||||||
|
channel = state?.memoizedState?.current?.previous?.result?.previousData?.userOrError;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
node = node?.return;
|
node = node?.return;
|
||||||
|
|
|
@ -28,10 +28,10 @@ const CLASSES = {
|
||||||
|
|
||||||
'prime-offers': '.top-nav__prime',
|
'prime-offers': '.top-nav__prime',
|
||||||
|
|
||||||
'player-gain-volume': '.video-player__overlay[data-compressed="true"] .volume-slider__slider-container:not(.ffz--player-gain)',
|
'player-gain-volume': '.video-player__container[data-compressed="true"] .volume-slider__slider-container:not(.ffz--player-gain)',
|
||||||
|
|
||||||
'player-ext': '.video-player .extension-taskbar,.video-player .extension-container,.video-player .extensions-dock__layout,.video-player .extensions-notifications,.video-player .extensions-video-overlay-size-container,.video-player .extensions-dock__layout',
|
'player-ext': '.video-player .extension-taskbar,.video-player .extension-container,.video-player .extensions-dock__layout,.video-player .extensions-notifications,.video-player .extensions-video-overlay-size-container,.video-player .extensions-dock__layout',
|
||||||
'player-ext-hover': '.video-player__overlay[data-controls="false"] .extension-taskbar,.video-player__overlay[data-controls="false"] .extension-container,.video-player__overlay[data-controls="false"] .extensions-dock__layout,.video-player__overlay[data-controls="false"] .extensions-notifications,.video-player__overlay[data-controls="false"] .extensions-video-overlay-size-container',
|
'player-ext-hover': '.video-player__container[data-controls="false"] .extension-taskbar,.video-player__container[data-controls="false"] .extension-container,.video-player__container[data-controls="false"] .extensions-dock__layout,.video-player__container[data-controls="false"] .extensions-notifications,.video-player__container[data-controls="false"] .extensions-video-overlay-size-container',
|
||||||
|
|
||||||
'player-event-bar': '.channel-root .live-event-banner-ui__header',
|
'player-event-bar': '.channel-root .live-event-banner-ui__header',
|
||||||
'player-rerun-bar': '.channel-root__player-container div.tw-c-text-overlay:not([data-a-target="hosting-ui-header"])',
|
'player-rerun-bar': '.channel-root__player-container div.tw-c-text-overlay:not([data-a-target="hosting-ui-header"])',
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
--ffz-theater-height: calc(calc(100vw * 0.5625) + var(--ffz-portrait-extra-height));
|
--ffz-theater-height: calc(calc(100vw * 0.5625) + var(--ffz-portrait-extra-height));
|
||||||
--ffz-chat-height: calc(100vh - var(--ffz-player-height));
|
--ffz-chat-height: calc(100vh - var(--ffz-player-height));
|
||||||
|
|
||||||
& > div:first-child > div[class^="sc"] {
|
& > div:first-child > div[class^="Layout-sc"] {
|
||||||
.ffz--portrait-invert & {
|
.ffz--portrait-invert & {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 0;
|
left: 0;
|
||||||
|
|
|
@ -99,7 +99,10 @@ export default class ModView extends Module {
|
||||||
i = 0;
|
i = 0;
|
||||||
while(state != null && channel == null && i < 50) {
|
while(state != null && channel == null && i < 50) {
|
||||||
state = state?.next;
|
state = state?.next;
|
||||||
channel = state?.memoizedState?.current?.previousData?.result?.data?.user;
|
//channel = state?.memoizedState?.current?.previousData?.result?.data?.user;
|
||||||
|
channel = state?.memoizedState?.current?.currentObservable?.lastResult?.data?.user;
|
||||||
|
if ( ! channel )
|
||||||
|
channel = state?.memoizedState?.current?.previous?.result?.previousData?.user;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
node = node?.child;
|
node = node?.child;
|
||||||
|
|
|
@ -5,7 +5,7 @@ import {BAD_HOTKEYS, TWITCH_EMOTE_V2} from 'utilities/constants';
|
||||||
const HOP = Object.prototype.hasOwnProperty;
|
const HOP = Object.prototype.hasOwnProperty;
|
||||||
|
|
||||||
export function getTwitchEmoteURL(id, scale, animated = false, dark = true) {
|
export function getTwitchEmoteURL(id, scale, animated = false, dark = true) {
|
||||||
return `${TWITCH_EMOTE_V2}/${id}/${animated ? 'default' : 'static'}/${dark ? 'dark' : 'light'}/${scale}.0`
|
return `${TWITCH_EMOTE_V2}/${id}/${animated ? 'default' : 'static'}/${dark ? 'dark' : 'light'}/${scale == 4 ? 3 : scale}.0`
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getTwitchEmoteSrcSet(id, animated = false, dark = true, big = false) {
|
export function getTwitchEmoteSrcSet(id, animated = false, dark = true, big = false) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue