Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.liskovsoft.smartyoutubetv2.common.app.models.playback.controllers;

import com.liskovsoft.smartyoutubetv2.common.app.models.data.Video;
import com.liskovsoft.smartyoutubetv2.common.app.models.playback.BasePlayerController;
import com.liskovsoft.smartyoutubetv2.common.exoplayer.selector.FormatItem;

public class DualSubtitleController extends BasePlayerController {
@Override
public void onVideoLoaded(Video item) {
if (getPlayer() != null) {
getPlayer().refreshDualSubtitles();
}
}

@Override
public void onTrackChanged(FormatItem track) {
if (track != null && track.getType() == FormatItem.TYPE_SUBTITLE && getPlayer() != null) {
getPlayer().refreshDualSubtitles();
}
}

@Override
public void onTrackSelected(FormatItem track) {
if (track != null && track.getType() == FormatItem.TYPE_SUBTITLE && getPlayer() != null) {
getPlayer().refreshDualSubtitles();
}
}
}
30 changes: 30 additions & 0 deletions ...liskovsoft/smartyoutubetv2/common/app/models/playback/controllers/PlayerUIController.java
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,36 @@ private void onSubtitleLongClicked() {
OptionCategory positionCategory = AppDialogUtil.createSubtitlePositionCategory(getContext());
settingsPresenter.appendRadioCategory(positionCategory.title, positionCategory.options);

settingsPresenter.appendSingleButton(UiOptionItem.from(getContext().getString(R.string.subtitle_dual_select_title),
optionItem -> {
if (!getPlayerData().isDualSubtitleEnabled()) {
MessageHelpers.showMessage(getContext(), R.string.subtitle_dual_enable_first);
return;
}
String currentLang = getPlayerData().getDualSubtitleTargetLanguage();
String[][] languages = {
{"en", "English"}, {"es", "Español"}, {"fr", "Français"},
{"de", "Deutsch"}, {"it", "Italiano"}, {"pt", "Português"},
{"ru", "Русский"}, {"ja", "日本語"}, {"ko", "한국어"},
{"zh", "中文"}, {"ar", "العربية"}, {"hi", "हिन्दी"},
{"tr", "Türkçe"}, {"pl", "Polski"}, {"nl", "Nederlands"},
{"uk", "Українська"}, {"vi", "Tiếng Việt"}, {"th", "ไทย"},
{"id", "Bahasa Indonesia"}, {"fa", "فارسی"},
};
List<OptionItem> langOptions = new ArrayList<>();
for (String[] entry : languages) {
String code = entry[0];
String name = entry[1];
langOptions.add(UiOptionItem.from(name, option -> {
getPlayerData().setDualSubtitleTargetLanguage(code);
getPlayer().refreshDualSubtitles();
}, Helpers.equals(code, currentLang)));
}
settingsPresenter.appendRadioCategory(
getContext().getString(R.string.subtitle_dual_select_title), langOptions);
settingsPresenter.showDialog();
}));

settingsPresenter.showDialog(subtitlesOrigCategoryTitle, mSetSubtitleButtonState);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.liskovsoft.smartyoutubetv2.common.app.models.playback.manager;

import androidx.annotation.Nullable;

import com.google.android.exoplayer2.SimpleExoPlayer;
import com.liskovsoft.mediaserviceinterfaces.data.MediaItemFormatInfo;
import com.liskovsoft.smartyoutubetv2.common.exoplayer.selector.FormatItem;

Expand Down Expand Up @@ -42,6 +45,9 @@ public interface PlayerEngine extends PlayerConstants {
float getPitch();
void setVolume(float volume);
float getVolume();
@Nullable
SimpleExoPlayer getExoPlayer();
void refreshDualSubtitles();
void setResizeMode(int mode);
int getResizeMode();
void setZoomPercents(int percents);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.liskovsoft.smartyoutubetv2.common.app.models.playback.BasePlayerController;
import com.liskovsoft.smartyoutubetv2.common.app.models.playback.controllers.AutoFrameRateController;
import com.liskovsoft.smartyoutubetv2.common.app.models.playback.controllers.ChatController;
import com.liskovsoft.smartyoutubetv2.common.app.models.playback.controllers.DualSubtitleController;
import com.liskovsoft.smartyoutubetv2.common.app.models.playback.controllers.CommentsController;
import com.liskovsoft.smartyoutubetv2.common.app.models.playback.controllers.ErrorFixerController;
import com.liskovsoft.smartyoutubetv2.common.app.models.playback.controllers.SponsorBlockController;
Expand Down Expand Up @@ -66,6 +67,7 @@ private PlaybackPresenter(Context context) {
mEventListeners.add(new HQDialogController());
mEventListeners.add(new ChatController());
mEventListeners.add(new CommentsController());
mEventListeners.add(new DualSubtitleController());
}

public static PlaybackPresenter instance(Context context) {
Expand Down
67 changes: 64 additions & 3 deletions .../liskovsoft/smartyoutubetv2/common/app/presenters/settings/SubtitleSettingsPresenter.java
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,18 +1,49 @@
package com.liskovsoft.smartyoutubetv2.common.app.presenters.settings;

import android.content.Context;

import com.liskovsoft.sharedutils.helpers.Helpers;
import com.liskovsoft.smartyoutubetv2.common.R;
import com.liskovsoft.smartyoutubetv2.common.app.models.playback.ui.OptionCategory;
import com.liskovsoft.smartyoutubetv2.common.app.models.playback.ui.OptionItem;
import com.liskovsoft.smartyoutubetv2.common.app.models.playback.ui.UiOptionItem;
import com.liskovsoft.smartyoutubetv2.common.app.presenters.AppDialogPresenter;
import com.liskovsoft.smartyoutubetv2.common.app.presenters.PlaybackPresenter;
import com.liskovsoft.smartyoutubetv2.common.app.presenters.base.BasePresenter;
import com.liskovsoft.smartyoutubetv2.common.app.views.PlaybackView;
import com.liskovsoft.smartyoutubetv2.common.prefs.PlayerData;
import com.liskovsoft.smartyoutubetv2.common.utils.AppDialogUtil;
import com.liskovsoft.youtubeapi.service.internal.MediaServiceData;

import java.util.ArrayList;
import java.util.List;

public class SubtitleSettingsPresenter extends BasePresenter<Void> {
private final PlayerData mPlayerData;

private static final String[][] TRANSLATE_LANGUAGES = {
{"en", "English"},
{"es", "Español"},
{"fr", "Français"},
{"de", "Deutsch"},
{"it", "Italiano"},
{"pt", "Português"},
{"ru", "Русский"},
{"ja", "日本語"},
{"ko", "한국어"},
{"zh", "中文"},
{"ar", "العربية"},
{"hi", "हिन्दी"},
{"tr", "Türkçe"},
{"pl", "Polski"},
{"nl", "Nederlands"},
{"uk", "Українська"},
{"vi", "Tiếng Việt"},
{"th", "ไทย"},
{"id", "Bahasa Indonesia"},
{"fa", "فارسی"},
};

public SubtitleSettingsPresenter(Context context) {
super(context);
mPlayerData = PlayerData.instance(context);
Expand All @@ -26,9 +57,19 @@ public void show() {
AppDialogPresenter settingsPresenter = AppDialogPresenter.instance(getContext());

settingsPresenter.appendSingleSwitch(AppDialogUtil.createSubtitleChannelOption(getContext()));
// Can't work properly. There is no robust language detection.
//appendSubtitleLanguageCategory(settingsPresenter);
//appendMoreSubtitlesSwitch(settingsPresenter);
settingsPresenter.appendSingleSwitch(UiOptionItem.from(getContext().getString(R.string.subtitle_dual_enable),
option -> {
mPlayerData.setDualSubtitleEnabled(option.isSelected());
if (option.isSelected()) {
mPlayerData.setDualSubtitleSecondLineSuppressed(false);
}
PlaybackView v = PlaybackPresenter.instance(getContext()).getView();
if (v != null) {
v.refreshDualSubtitles();
}
},
mPlayerData.isDualSubtitleEnabled()));
appendTranslationLanguageCategory(settingsPresenter);
appendSubtitleStyleCategory(settingsPresenter);
appendSubtitleSizeCategory(settingsPresenter);
appendSubtitlePositionCategory(settingsPresenter);
Expand Down Expand Up @@ -64,6 +105,26 @@ public void show() {
// settingsPresenter.appendRadioCategory(subtitleLanguageTitle, options);
//}

private void appendTranslationLanguageCategory(AppDialogPresenter settingsPresenter) {
String title = getContext().getString(R.string.subtitle_dual_target_language);
String currentLang = mPlayerData.getDualSubtitleTargetLanguage();

List<OptionItem> options = new ArrayList<>();
for (String[] entry : TRANSLATE_LANGUAGES) {
String code = entry[0];
String name = entry[1];
options.add(UiOptionItem.from(name, option -> {
mPlayerData.setDualSubtitleTargetLanguage(code);
PlaybackView v = PlaybackPresenter.instance(getContext()).getView();
if (v != null) {
v.refreshDualSubtitles();
}
}, Helpers.equals(code, currentLang)));
}

settingsPresenter.appendRadioCategory(title, options);
}

private void appendSubtitleStyleCategory(AppDialogPresenter settingsPresenter) {
OptionCategory category = AppDialogUtil.createSubtitleStylesCategory(getContext());
settingsPresenter.appendRadioCategory(category.title, category.options);
Expand Down
22 changes: 22 additions & 0 deletions .../java/com/liskovsoft/smartyoutubetv2/common/exoplayer/controller/ExoPlayerController.java
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@

public class ExoPlayerController implements Player.EventListener {
private static final String TAG = ExoPlayerController.class.getSimpleName();
/**
* Last adaptive format descriptor passed to {@link #openDash}/{@link #openSabr}/{@link #openMerged}.
* Used for dual subtitles to resolve timedtext base URLs for the selected caption track.
*/
private MediaItemFormatInfo mLastFormatInfo;
private final Context mContext;
private final ExoMediaSourceFactory mMediaSourceFactory;
private final TrackSelectorManager mTrackSelectorManager;
Expand Down Expand Up @@ -80,47 +85,63 @@ private void applyShield720pFix() {
}

public void openSabr(MediaItemFormatInfo formatInfo) {
mLastFormatInfo = formatInfo;
MediaSource mediaSource = mMediaSourceFactory.fromSabrFormatInfo(formatInfo);
openMediaSource(mediaSource);
}

public void openDash(MediaItemFormatInfo formatInfo) {
mLastFormatInfo = formatInfo;
MediaSource mediaSource = mMediaSourceFactory.fromDashFormatInfo(formatInfo);
openMediaSource(mediaSource);
}

public void openDash(InputStream dashManifest) {
mLastFormatInfo = null;
MediaSource mediaSource = mMediaSourceFactory.fromDashManifest(dashManifest);
openMediaSource(mediaSource);
}

public void openDashUrl(String dashManifestUrl) {
mLastFormatInfo = null;
MediaSource mediaSource = mMediaSourceFactory.fromDashManifestUrl(dashManifestUrl);
openMediaSource(mediaSource);
}

public void openHlsUrl(String hlsPlaylistUrl) {
mLastFormatInfo = null;
MediaSource mediaSource = mMediaSourceFactory.fromHlsPlaylist(hlsPlaylistUrl);
openMediaSource(mediaSource);
}

public void openUrlList(List<String> urlList) {
mLastFormatInfo = null;
MediaSource mediaSource = mMediaSourceFactory.fromUrlList(urlList);
openMediaSource(mediaSource);
}

public void openMerged(MediaItemFormatInfo formatInfo, String hlsPlaylistUrl) {
mLastFormatInfo = formatInfo;
MediaSource dashMediaSource = mMediaSourceFactory.fromDashFormatInfo(formatInfo);
MediaSource hlsMediaSource = mMediaSourceFactory.fromHlsPlaylist(hlsPlaylistUrl);
openMediaSource(new MergingMediaSource(dashMediaSource, hlsMediaSource));
}

public void openMerged(InputStream dashManifest, String hlsPlaylistUrl) {
mLastFormatInfo = null;
MediaSource dashMediaSource = mMediaSourceFactory.fromDashManifest(dashManifest);
MediaSource hlsMediaSource = mMediaSourceFactory.fromHlsPlaylist(hlsPlaylistUrl);
openMediaSource(new MergingMediaSource(dashMediaSource, hlsMediaSource));
}

/**
* Format info for the current adaptive source, when playback was started from {@link #openDash},
* {@link #openSabr}, or {@link #openMerged} with a {@link MediaItemFormatInfo} instance.
*/
public MediaItemFormatInfo getLastFormatInfo() {
return mLastFormatInfo;
}

private void openMediaSource(MediaSource mediaSource) {
resetPlayerState(); // fixes occasional video artifacts and problems with quality switching
setQualityInfo("");
Expand Down Expand Up @@ -191,6 +212,7 @@ public boolean containsMedia() {
}

public void release() {
mLastFormatInfo = null;
mTrackSelectorManager.release();
mMediaSourceFactory.release();
releasePlayer();
Expand Down
Loading