From 13e5775c342c6b0ab6cb5fb733beac6cad7e7f00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Delattre?= Date: Fri, 20 Aug 2021 15:45:36 -1000 Subject: [PATCH] Handle embedded subtitles --- backend/movies/movies.go | 14 +++--- backend/shows/episodes.go | 18 +++---- frontend/js/components/buttons/subtitles.js | 29 +++++------ frontend/js/reducers/movies.js | 38 +++++++-------- frontend/js/reducers/show.js | 53 ++++++++++++--------- 5 files changed, 78 insertions(+), 74 deletions(-) diff --git a/backend/movies/movies.go b/backend/movies/movies.go index 8d57759..b414b0d 100644 --- a/backend/movies/movies.go +++ b/backend/movies/movies.go @@ -59,13 +59,13 @@ func (m *Movie) MarshalJSON() ([]byte, error) { // Append the Subtitles for _, s := range m.pMovie.Subtitles { - subtitleURL, _ := m.client.DownloadURLWithToken(s) - movieToMarshal.Subtitles = append(movieToMarshal.Subtitles, - subtitles.Subtitle{ - Subtitle: s.Subtitle, - URL: subtitleURL, - VVTFile: fmt.Sprintf("/movies/%s/subtitles/%s", m.ImdbID, s.Lang), - }) + sub := subtitles.Subtitle{Subtitle: s.Subtitle} + if !sub.Embedded { + subtitleURL, _ := m.client.DownloadURLWithToken(s) + sub.URL = subtitleURL + sub.VVTFile = fmt.Sprintf("/movies/%s/subtitles/%s", m.ImdbID, s.Lang) + } + movieToMarshal.Subtitles = append(movieToMarshal.Subtitles, sub) } } diff --git a/backend/shows/episodes.go b/backend/shows/episodes.go index 43b2ca6..a5185ee 100644 --- a/backend/shows/episodes.go +++ b/backend/shows/episodes.go @@ -46,15 +46,15 @@ func (e *Episode) MarshalJSON() ([]byte, error) { // Append the Subtitles for _, s := range pEpisode.Subtitles { - subtitleURL, _ := e.show.client.DownloadURLWithToken(s) - subs = append(subs, subtitles.Subtitle{ - Subtitle: &polochon.Subtitle{ - File: polochon.File{Size: s.Size}, - Lang: s.Lang, - }, - URL: subtitleURL, - VVTFile: fmt.Sprintf("/shows/%s/seasons/%d/episodes/%d/subtitles/%s", e.ShowImdbID, e.Season, e.Episode, s.Lang), - }) + sub := subtitles.Subtitle{Subtitle: s.Subtitle} + if !sub.Embedded { + subtitleURL, _ := e.show.client.DownloadURLWithToken(s) + sub.URL = subtitleURL + sub.VVTFile = fmt.Sprintf( + "/shows/%s/seasons/%d/episodes/%d/subtitles/%s", + e.ShowImdbID, e.Season, e.Episode, s.Lang) + } + subs = append(subs, sub) } } } diff --git a/frontend/js/components/buttons/subtitles.js b/frontend/js/components/buttons/subtitles.js index 35df142..af865fa 100644 --- a/frontend/js/components/buttons/subtitles.js +++ b/frontend/js/components/buttons/subtitles.js @@ -35,14 +35,7 @@ export const SubtitlesButton = ({ const count = subtitles && subtitles.size !== 0 ? subtitles.size : 0; - let searching = fetchingSubtitles; - if (count > 0) { - subtitles.forEach((subtitle) => { - if (subtitle.searching === true) { - searching = true; - } - }); - } + const searching = fetchingSubtitles.length > 0; return ( @@ -87,31 +80,35 @@ export const SubtitlesButton = ({ SubtitlesButton.propTypes = { subtitles: PropTypes.object, inLibrary: PropTypes.bool.isRequired, - fetchingSubtitles: PropTypes.bool.isRequired, + fetchingSubtitles: PropTypes.array.isRequired, search: PropTypes.func.isRequired, }; export const SubtitleEntry = ({ subtitle, search }) => { const lang = upperCaseFirst(subtitle.lang.split("_")[0]); const size = subtitle.size ? subtitle.size : 0; + const embedded = subtitle.embedded ? subtitle.embedded : false; const handleRefresh = () => { search(subtitle.lang); }; return ( - +
{lang} + {embedded && (Inside the video)} {size !== 0 && ({prettySize(size)})} -
+ {!embedded && ( +
+ )}
); diff --git a/frontend/js/reducers/movies.js b/frontend/js/reducers/movies.js index e7f3c34..ca0d811 100644 --- a/frontend/js/reducers/movies.js +++ b/frontend/js/reducers/movies.js @@ -13,7 +13,7 @@ const defaultState = { const formatMovie = (movie) => { movie.fetchingDetails = false; - movie.fetchingSubtitles = false; + movie.fetchingSubtitles = []; movie.torrents = formatTorrents(movie); movie.subtitles = formatSubtitles(movie.subtitles); return movie; @@ -89,28 +89,28 @@ export default (state = defaultState, action) => draft.lastFetchUrl = action.payload.url; break; - case "MOVIE_SUBTITLES_UPDATE_PENDING": - draft.movies.get(action.payload.main.imdbId).fetchingSubtitles = true; - if ( - draft.movies - .get(action.payload.main.imdbId) - .subtitles.get(action.payload.main.lang) - ) { - draft.movies - .get(action.payload.main.imdbId) - .subtitles.get(action.payload.main.lang).searching = true; + case "MOVIE_SUBTITLES_UPDATE_PENDING": { + let imdbId = action.payload.main.imdbId; + let lang = action.payload.main.lang; + draft.movies.get(imdbId).fetchingSubtitles.push(lang); + if (draft.movies.get(imdbId).subtitles.get(lang)) { + draft.movies.get(imdbId).subtitles.get(lang).searching = true; } break; + } - case "MOVIE_SUBTITLES_UPDATE_FULFILLED": - draft.movies.get(action.payload.main.imdbId).fetchingSubtitles = false; - draft.movies - .get(action.payload.main.imdbId) - .subtitles.set( - action.payload.response.data.lang, - formatSubtitle(action.payload.response.data) - ); + case "MOVIE_SUBTITLES_UPDATE_FULFILLED": { + let imdbId = action.payload.main.imdbId; + let lang = action.payload.main.lang; + let data = action.payload.response.data; + draft.movies.get(imdbId).fetchingSubtitles = draft.movies + .get(imdbId) + .fetchingSubtitles.filter((l) => l != lang); + if (data) { + draft.movies.get(imdbId).subtitles.set(lang, formatSubtitle(data)); + } break; + } case "SELECT_MOVIE": draft.selectedImdbId = action.payload.imdbId; diff --git a/frontend/js/reducers/show.js b/frontend/js/reducers/show.js index 7afe96a..80b2e95 100644 --- a/frontend/js/reducers/show.js +++ b/frontend/js/reducers/show.js @@ -15,7 +15,8 @@ const formatEpisode = (episode) => { // Set the default fetching data episode.fetching = false; - episode.fetchingSubtitles = false; + // Holds the languages of the subtitles currently fetching + episode.fetchingSubtitles = []; }; export default (state = defaultState, action) => @@ -100,36 +101,42 @@ export default (state = defaultState, action) => break; } - case "EPISODE_SUBTITLES_UPDATE_PENDING": + case "EPISODE_SUBTITLES_UPDATE_PENDING": { + let season = action.payload.main.season; + let episode = action.payload.main.episode; + let lang = action.payload.main.lang; draft.show.seasons - .get(action.payload.main.season) - .get(action.payload.main.episode).fetchingSubtitles = true; - if ( + .get(season) + .get(episode) + .fetchingSubtitles.push(lang); + if (draft.show.seasons.get(season).get(episode).subtitles.get(lang)) { draft.show.seasons - .get(action.payload.main.season) - .get(action.payload.main.episode) - .subtitles.get(action.payload.main.lang) - ) { - draft.show.seasons - .get(action.payload.main.season) - .get(action.payload.main.episode) - .subtitles.get(action.payload.main.lang).searching = true; + .get(season) + .get(episode) + .subtitles.get(lang).searching = true; } break; + } case "EPISODE_SUBTITLES_UPDATE_FULFILLED": { - draft.show.seasons - .get(action.payload.main.season) - .get(action.payload.main.episode).fetchingSubtitles = false; - draft.show.seasons - .get(action.payload.main.season) - .get(action.payload.main.episode) - .subtitles.set( - action.payload.main.lang, - formatSubtitle(action.payload.response.data) - ); + let season = action.payload.main.season; + let episode = action.payload.main.episode; + let lang = action.payload.main.lang; + let data = action.payload.response.data; + draft.show.seasons.get(season).get(episode).fetchingSubtitles = + draft.show.seasons + .get(season) + .get(episode) + .fetchingSubtitles.filter((l) => l != lang); + if (data) { + draft.show.seasons + .get(season) + .get(episode) + .subtitles.set(lang, formatSubtitle(data)); + } break; } + default: return draft; }