stremio-web/src/routes/Settings/useStreamingServerSettingsInputs.js
unclekingpin c49c2c00ff fix lint
2024-06-23 02:52:14 -07:00

226 lines
8.1 KiB
JavaScript

// Copyright (C) 2017-2023 Smart code 203358507
const React = require('react');
const { useTranslation } = require('react-i18next');
const isEqual = require('lodash.isequal');
const { useServices } = require('stremio/services');
const CACHE_SIZES = [0, 2147483648, 5368709120, 10737418240, null];
const cacheSizeToString = (size) => {
return size === null ?
'Infinite'
:
size === 0 ?
'No caching'
:
`${Math.ceil(((size / 1024 / 1024 / 1024) + Number.EPSILON) * 100) / 100}GiB`;
};
const TORRENT_PROFILES = {
default: {
btDownloadSpeedHardLimit: 3670016,
btDownloadSpeedSoftLimit: 2621440,
btHandshakeTimeout: 20000,
btMaxConnections: 55,
btMinPeersForStable: 5,
btRequestTimeout: 4000
},
soft: {
btDownloadSpeedHardLimit: 1677721.6,
btDownloadSpeedSoftLimit: 1677721.6,
btHandshakeTimeout: 20000,
btMaxConnections: 35,
btMinPeersForStable: 5,
btRequestTimeout: 4000
},
fast: {
btDownloadSpeedHardLimit: 39321600,
btDownloadSpeedSoftLimit: 4194304,
btHandshakeTimeout: 20000,
btMaxConnections: 200,
btMinPeersForStable: 10,
btRequestTimeout: 4000
},
'ultra fast': {
btDownloadSpeedHardLimit: 78643200,
btDownloadSpeedSoftLimit: 8388608,
btHandshakeTimeout: 25000,
btMaxConnections: 400,
btMinPeersForStable: 10,
btRequestTimeout: 6000
}
};
const useStreamingServerSettingsInputs = (streamingServer) => {
const { core } = useServices();
const { t } = useTranslation();
// TODO combine those useMemo in one
const streamingServerRemoteUrlInput = React.useMemo(() => ({
value: streamingServer.remoteUrl,
}), [streamingServer.remoteUrl]);
const proxyStreamsCheckbox = React.useMemo(() => {
if (streamingServer.settings?.type !== 'Ready') {
return null;
}
return {
checked: streamingServer.settings.content.proxyStreamsEnabled,
onClick: () => {
core.transport.dispatch({
action: 'StreamingServer',
args: {
action: 'UpdateSettings',
args: {
...streamingServer.settings.content,
proxyStreamsEnabled: !streamingServer.settings.content.proxyStreamsEnabled
}
}
});
}
};
}, [streamingServer.settings]);
const remoteEndpointSelect = React.useMemo(() => {
if (streamingServer.settings?.type !== 'Ready' || streamingServer.networkInfo?.type !== 'Ready') {
return null;
}
return {
options: [
{
label: t('SETTINGS_DISABLED'),
value: null,
},
...streamingServer.networkInfo.content.availableInterfaces.map((address) => ({
label: address,
value: address,
}))
],
selected: [streamingServer.settings.content.remoteHttps],
onSelect: (event) => {
core.transport.dispatch({
action: 'StreamingServer',
args: {
action: 'UpdateSettings',
args: {
...streamingServer.settings.content,
remoteHttps: event.value,
}
}
});
}
};
}, [streamingServer.settings, streamingServer.networkInfo]);
const cacheSizeSelect = React.useMemo(() => {
if (streamingServer.settings === null || streamingServer.settings.type !== 'Ready') {
return null;
}
return {
options: CACHE_SIZES.map((size) => ({
label: cacheSizeToString(size),
value: JSON.stringify(size)
})),
selected: [JSON.stringify(streamingServer.settings.content.cacheSize)],
renderLabelText: () => {
return cacheSizeToString(streamingServer.settings.content.cacheSize);
},
onSelect: (event) => {
core.transport.dispatch({
action: 'StreamingServer',
args: {
action: 'UpdateSettings',
args: {
...streamingServer.settings.content,
cacheSize: JSON.parse(event.value),
}
}
});
}
};
}, [streamingServer.settings]);
const torrentProfileSelect = React.useMemo(() => {
if (streamingServer.settings === null || streamingServer.settings.type !== 'Ready') {
return null;
}
const selectedTorrentProfile = {
btDownloadSpeedHardLimit: streamingServer.settings.content.btDownloadSpeedHardLimit,
btDownloadSpeedSoftLimit: streamingServer.settings.content.btDownloadSpeedSoftLimit,
btHandshakeTimeout: streamingServer.settings.content.btHandshakeTimeout,
btMaxConnections: streamingServer.settings.content.btMaxConnections,
btMinPeersForStable: streamingServer.settings.content.btMinPeersForStable,
btRequestTimeout: streamingServer.settings.content.btRequestTimeout
};
const isCustomTorrentProfileSelected = Object.values(TORRENT_PROFILES).every((torrentProfile) => {
return !isEqual(torrentProfile, selectedTorrentProfile);
});
return {
options: Object.keys(TORRENT_PROFILES)
.map((profileName) => ({
label: profileName,
value: JSON.stringify(TORRENT_PROFILES[profileName])
}))
.concat(
isCustomTorrentProfileSelected ?
[{
label: 'custom',
value: JSON.stringify(selectedTorrentProfile)
}]
:
[]
),
selected: [JSON.stringify(selectedTorrentProfile)],
onSelect: (event) => {
core.transport.dispatch({
action: 'StreamingServer',
args: {
action: 'UpdateSettings',
args: {
...streamingServer.settings.content,
...JSON.parse(event.value),
}
}
});
}
};
}, [streamingServer.settings]);
const transcodingProfileSelect = React.useMemo(() => {
if (streamingServer.settings?.type !== 'Ready' || streamingServer.deviceInfo?.type !== 'Ready') {
return null;
}
return {
options: [
{
label: t('SETTINGS_DISABLED'),
value: null,
},
...streamingServer.deviceInfo.content.availableHardwareAccelerations.map((name) => ({
label: name,
value: name,
}))
],
selected: [streamingServer.settings.content.transcodeProfile],
onSelect: (event) => {
core.transport.dispatch({
action: 'StreamingServer',
args: {
action: 'UpdateSettings',
args: {
...streamingServer.settings.content,
transcodeProfile: event.value,
}
}
});
}
};
}, [streamingServer.settings, streamingServer.deviceInfo]);
return { streamingServerRemoteUrlInput, proxyStreamsCheckbox, remoteEndpointSelect, cacheSizeSelect, torrentProfileSelect, transcodingProfileSelect };
};
module.exports = useStreamingServerSettingsInputs;