define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'appStorage', 'connectionManager', 'loading', 'paper-fab', 'listViewStyle', 'paper-icon-button-light', 'css!./../formdialog'], function (dialogHelper, require, layoutManager, globalize, appStorage, connectionManager, loading) { var currentItem; function showLocalSubtitles(context, index) { loading.show(); var subtitleContent = context.querySelector('.subtitleContent'); subtitleContent.innerHTML = ''; var apiClient = connectionManager.getApiClient(currentItem.ServerId); var url = 'Videos/' + currentItem.Id + '/Subtitles/' + index; apiClient.ajax({ type: 'GET', url: url }).then(function (result) { subtitleContent.innerHTML = result; loading.hide(); }); } function showRemoteSubtitles(context, id) { loading.show(); var url = 'Providers/Subtitles/Subtitles/' + id; ApiClient.get(ApiClient.getUrl(url)).then(function (result) { // show result loading.hide(); }); } function downloadRemoteSubtitles(context, id) { var url = 'Items/' + currentItem.Id + '/RemoteSearch/Subtitles/' + id; var apiClient = connectionManager.getApiClient(currentItem.ServerId); apiClient.ajax({ type: "POST", url: apiClient.getUrl(url) }).then(function () { require(['toast'], function (toast) { toast(globalize.translate('MessageDownloadQueued')); }); }); } function deleteLocalSubtitle(context, index) { var msg = globalize.translate('MessageAreYouSureDeleteSubtitles'); require(['confirm'], function (confirm) { confirm(msg, globalize.translate('HeaderConfirmDeletion')).then(function () { loading.show(); var itemId = currentItem.Id; var url = 'Videos/' + itemId + '/Subtitles/' + index; var apiClient = connectionManager.getApiClient(currentItem.ServerId); apiClient.ajax({ type: "DELETE", url: apiClient.getUrl(url) }).then(function () { reload(context, apiClient, itemId); }); }); }); } function fillSubtitleList(context, item) { var streams = item.MediaStreams || []; var subs = streams.filter(function (s) { return s.Type == 'Subtitle'; }); var html = ''; if (subs.length) { html += '

' + globalize.translate('HeaderCurrentSubtitles') + '

'; if (layoutManager.tv) { html += '
'; } else { html += '
'; } html += subs.map(function (s) { var itemHtml = ''; itemHtml += '
'; itemHtml += ''; var atts = []; atts.push(s.Codec); if (s.IsDefault) { atts.push('Default'); } if (s.IsForced) { atts.push('Forced'); } itemHtml += '
'; itemHtml += '

'; itemHtml += (s.Language || globalize.translate('LabelUnknownLanaguage')); itemHtml += '

'; itemHtml += '
' + atts.join(' - ') + '
'; if (s.Path) { itemHtml += '
' + (s.Path) + '
'; } itemHtml += ''; itemHtml += '
'; if (s.Path) { itemHtml += ''; } itemHtml += '
'; return itemHtml; }).join(''); html += '
'; } var elem = context.querySelector('.subtitleList'); if (subs.length) { elem.classList.remove('hide'); } else { elem.classList.add('hide'); } elem.innerHTML = html; //('.btnViewSubtitles', elem).on('click', function () { // var index = this.getAttribute('data-index'); // showLocalSubtitles(context, index); //}); } function fillLanguages(context, apiClient, languages) { var selectLanguage = context.querySelector('#selectLanguage'); selectLanguage.innerHTML = languages.map(function (l) { return ''; }); var lastLanguage = appStorage.getItem('subtitleeditor-language'); if (lastLanguage) { selectLanguage.value = lastLanguage; } else { apiClient.getCurrentUser().then(function (user) { var lang = user.Configuration.SubtitleLanguagePreference; if (lang) { selectLanguage.value = lang; } }); } } function renderSearchResults(context, results) { var lastProvider = ''; var html = ''; if (!results.length) { context.querySelector('.noSearchResults').classList.remove('hide'); context.querySelector('.subtitleResults').innerHTML = ''; loading.hide(); return; } context.querySelector('.noSearchResults').classList.add('hide'); for (var i = 0, length = results.length; i < length; i++) { var result = results[i]; var provider = result.ProviderName; if (provider != lastProvider) { if (i > 0) { html += '
'; } html += '

' + provider + '

'; if (layoutManager.tv) { html += '
'; } else { html += '
'; } lastProvider = provider; } html += '
'; html += ''; html += ''; html += '
' + /*(result.CommunityRating || 0) + ' / ' +*/ (result.DownloadCount || 0) + '
'; html += ''; html += '
'; } if (results.length) { html += '
'; } var elem = context.querySelector('.subtitleResults'); elem.innerHTML = html; //('.btnViewSubtitle', elem).on('click', function () { // var id = this.getAttribute('data-subid'); // showRemoteSubtitles(context, id); //}); loading.hide(); } function searchForSubtitles(context, language) { appStorage.setItem('subtitleeditor-language', language); loading.show(); var apiClient = connectionManager.getApiClient(currentItem.ServerId); var url = apiClient.getUrl('Items/' + currentItem.Id + '/RemoteSearch/Subtitles/' + language); apiClient.getJSON(url).then(function (results) { renderSearchResults(context, results); }); } function reload(context, apiClient, itemId) { context.querySelector('.noSearchResults').classList.add('hide'); function onGetItem(item) { currentItem = item; fillSubtitleList(context, item); var file = item.Path || ''; var index = Math.max(file.lastIndexOf('/'), file.lastIndexOf('\\')); if (index > -1) { file = file.substring(index + 1); } if (file) { context.querySelector('.pathValue').innerHTML = file; context.querySelector('.originalFile').classList.remove('hide'); } else { context.querySelector('.pathValue').innerHTML = ''; context.querySelector('.originalFile').classList.add('hide'); } loading.hide(); } if (typeof itemId == 'string') { apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(onGetItem); } else { onGetItem(itemId); } } function parentWithClass(elem, className) { while (!elem.classList || !elem.classList.contains(className)) { elem = elem.parentNode; if (!elem) { return null; } } return elem; } function onSearchSubmit(e) { var form = this; var lang = form.querySelector('#selectLanguage', form).value; searchForSubtitles(parentWithClass(form, 'dialogContent'), lang); e.preventDefault(); return false; } function onSubtitleListClick(e) { var btnDelete = parentWithClass(e.target, 'btnDelete'); if (btnDelete) { var index = btnDelete.getAttribute('data-index'); var context = parentWithClass(btnDelete, 'subtitleEditorDialog'); deleteLocalSubtitle(context, index); } } function onSubtitleResultsClick(e) { var btnDownload = parentWithClass(e.target, 'btnDownload'); if (btnDownload) { var id = btnDownload.getAttribute('data-subid'); var context = parentWithClass(btnDownload, 'subtitleEditorDialog'); downloadRemoteSubtitles(context, id); } } function showEditor(itemId, serverId) { loading.show(); require(['text!./subtitleeditor.template.html'], function (template) { var apiClient = connectionManager.getApiClient(serverId); apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) { var dialogOptions = { removeOnClose: true }; if (layoutManager.tv) { dialogOptions.size = 'fullscreen'; } else { dialogOptions.size = 'small'; } var dlg = dialogHelper.createDialog(dialogOptions); dlg.classList.add('formDialog'); dlg.classList.add('subtitleEditorDialog'); dlg.innerHTML = globalize.translateDocument(template); document.body.appendChild(dlg); dlg.querySelector('.pathLabel').innerHTML = globalize.translate('MediaInfoFile'); dlg.querySelector('.subtitleSearchForm').addEventListener('submit', onSearchSubmit); dialogHelper.open(dlg); var editorContent = dlg.querySelector('.dialogContent'); dlg.querySelector('.subtitleList').addEventListener('click', onSubtitleListClick); dlg.querySelector('.subtitleResults').addEventListener('click', onSubtitleResultsClick); reload(editorContent, apiClient, item); apiClient.getCultures().then(function (languages) { fillLanguages(editorContent, apiClient, languages); }); dlg.querySelector('.btnCancel').addEventListener('click', function () { dialogHelper.close(dlg); }); }); }); } return { show: showEditor }; });