diff --git a/src/components/subtitleuploader/subtitleuploader.js b/src/components/subtitleuploader/subtitleuploader.js index 90e04b16dd..6cd3f1ff25 100644 --- a/src/components/subtitleuploader/subtitleuploader.js +++ b/src/components/subtitleuploader/subtitleuploader.js @@ -1,5 +1,7 @@ import escapeHtml from 'escape-html'; +import { getSubtitleApi } from '@jellyfin/sdk/lib/utils/api/subtitle-api'; +import { toApi } from 'utils/jellyfin-apiclient/compat'; import dialogHelper from '../../components/dialogHelper/dialogHelper'; import ServerConnections from '../ServerConnections'; import dom from '../../scripts/dom'; @@ -13,6 +15,7 @@ import '../../elements/emby-button/emby-button'; import '../../elements/emby-select/emby-select'; import '../formdialog.scss'; import './style.scss'; +import { readFileAsBase64 } from 'utils/file'; let currentItemId; let currentServerId; @@ -75,7 +78,7 @@ function setFiles(page, files) { reader.readAsDataURL(file); } -function onSubmit(e) { +async function onSubmit(e) { const file = currentFile; if (!isValidSubtitleFile(file)) { @@ -89,8 +92,17 @@ function onSubmit(e) { const dlg = dom.parentWithClass(this, 'dialog'); const language = dlg.querySelector('#selectLanguage').value; const isForced = dlg.querySelector('#chkIsForced').checked; + const isHearingImpaired = dlg.querySelector('#chkIsHearingImpaired').checked; - ServerConnections.getApiClient(currentServerId).uploadItemSubtitle(currentItemId, language, isForced, file).then(function () { + const subtitleApi = getSubtitleApi(toApi(ServerConnections.getApiClient(currentServerId))); + + const data = await readFileAsBase64(file); + const format = file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase(); + + subtitleApi.uploadSubtitle({ + itemId: currentItemId, + uploadSubtitleDto: { Data: data, Language: language, IsForced: isForced, Format: format, IsHearingImpaired: isHearingImpaired } + }).then(function () { dlg.querySelector('#uploadSubtitle').value = ''; loading.hide(); hasChanges = true; diff --git a/src/components/subtitleuploader/subtitleuploader.template.html b/src/components/subtitleuploader/subtitleuploader.template.html index ba43e00411..7febd1e7ac 100644 --- a/src/components/subtitleuploader/subtitleuploader.template.html +++ b/src/components/subtitleuploader/subtitleuploader.template.html @@ -31,6 +31,10 @@ ${LabelIsForced} +
diff --git a/src/strings/en-us.json b/src/strings/en-us.json index ca5dd5778b..46ac586951 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1727,5 +1727,6 @@ "AiTranslated": "AI Translated", "MachineTranslated": "Machine Translated", "ForeignPartsOnly": "Forced/Foreign parts only", - "HearingImpairedShort": "HI/SDH" + "HearingImpairedShort": "HI/SDH", + "LabelIsHearingImpaired": "For hearing impaired (SDH)" } diff --git a/src/utils/file.ts b/src/utils/file.ts new file mode 100644 index 0000000000..b85178e2f2 --- /dev/null +++ b/src/utils/file.ts @@ -0,0 +1,15 @@ +/** + * Reads and returns the file encoded in base64 + */ +export function readFileAsBase64(file: File): Promise { + return new Promise(function (resolve, reject) { + const reader = new FileReader(); + reader.onload = (e) => { + // Split by a comma to remove the url: prefix + const data = (e.target?.result as string)?.split?.(',')[1]; + resolve(data); + }; + reader.onerror = reject; + reader.readAsDataURL(file); + }); +}