mirror of
https://github.com/TeamNewPipe/NewPipe
synced 2025-01-11 01:40:59 +00:00
made the ui more accommodating for not available audio streams
This commit is contained in:
parent
b15a0b92f9
commit
648b9b5d02
@ -51,13 +51,16 @@ class ActionBarHandler {
|
|||||||
|
|
||||||
private SharedPreferences defaultPreferences = null;
|
private SharedPreferences defaultPreferences = null;
|
||||||
|
|
||||||
|
private Menu menu;
|
||||||
|
|
||||||
// Only callbacks are listed here, there are more actions which don't need a callback.
|
// Only callbacks are listed here, there are more actions which don't need a callback.
|
||||||
// those are edited directly. Typically VideoItemDetailFragment will implement those callbacks.
|
// those are edited directly. Typically VideoItemDetailFragment will implement those callbacks.
|
||||||
private OnActionListener onShareListener;
|
private OnActionListener onShareListener = null;
|
||||||
private OnActionListener onOpenInBrowserListener;
|
private OnActionListener onOpenInBrowserListener = null;
|
||||||
private OnActionListener onDownloadListener;
|
private OnActionListener onDownloadListener = null;
|
||||||
private OnActionListener onPlayWithKodiListener;
|
private OnActionListener onPlayWithKodiListener = null;
|
||||||
private OnActionListener onPlayAudioListener;
|
private OnActionListener onPlayAudioListener = null;
|
||||||
|
|
||||||
|
|
||||||
// Triggered when a stream related action is triggered.
|
// Triggered when a stream related action is triggered.
|
||||||
public interface OnActionListener {
|
public interface OnActionListener {
|
||||||
@ -128,15 +131,15 @@ class ActionBarHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setupMenu(Menu menu, MenuInflater inflater) {
|
public void setupMenu(Menu menu, MenuInflater inflater) {
|
||||||
|
this.menu = menu;
|
||||||
|
|
||||||
// CAUTION set item properties programmatically otherwise it would not be accepted by
|
// CAUTION set item properties programmatically otherwise it would not be accepted by
|
||||||
// appcompat itemsinflater.inflate(R.menu.videoitem_detail, menu);
|
// appcompat itemsinflater.inflate(R.menu.videoitem_detail, menu);
|
||||||
|
|
||||||
defaultPreferences = PreferenceManager.getDefaultSharedPreferences(activity);
|
defaultPreferences = PreferenceManager.getDefaultSharedPreferences(activity);
|
||||||
|
|
||||||
inflater.inflate(R.menu.videoitem_detail, menu);
|
inflater.inflate(R.menu.videoitem_detail, menu);
|
||||||
MenuItem castItem = menu.findItem(R.id.action_play_with_kodi);
|
|
||||||
|
|
||||||
castItem.setVisible(defaultPreferences
|
showPlayWithKodiAction(defaultPreferences
|
||||||
.getBoolean(activity.getString(R.string.show_play_with_kodi_key), false));
|
.getBoolean(activity.getString(R.string.show_play_with_kodi_key), false));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,15 +154,21 @@ class ActionBarHandler {
|
|||||||
intent.setType("text/plain");
|
intent.setType("text/plain");
|
||||||
activity.startActivity(Intent.createChooser(intent, activity.getString(R.string.share_dialog_title)));
|
activity.startActivity(Intent.createChooser(intent, activity.getString(R.string.share_dialog_title)));
|
||||||
*/
|
*/
|
||||||
|
if(onShareListener != null) {
|
||||||
onShareListener.onActionSelected(selectedVideoStream);
|
onShareListener.onActionSelected(selectedVideoStream);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case R.id.menu_item_openInBrowser: {
|
case R.id.menu_item_openInBrowser: {
|
||||||
|
if(onOpenInBrowserListener != null) {
|
||||||
onOpenInBrowserListener.onActionSelected(selectedVideoStream);
|
onOpenInBrowserListener.onActionSelected(selectedVideoStream);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
case R.id.menu_item_download:
|
case R.id.menu_item_download:
|
||||||
|
if(onDownloadListener != null) {
|
||||||
onDownloadListener.onActionSelected(selectedVideoStream);
|
onDownloadListener.onActionSelected(selectedVideoStream);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
case R.id.action_settings: {
|
case R.id.action_settings: {
|
||||||
Intent intent = new Intent(activity, SettingsActivity.class);
|
Intent intent = new Intent(activity, SettingsActivity.class);
|
||||||
@ -167,10 +176,14 @@ class ActionBarHandler {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case R.id.action_play_with_kodi:
|
case R.id.action_play_with_kodi:
|
||||||
|
if(onPlayWithKodiListener != null) {
|
||||||
onPlayWithKodiListener.onActionSelected(selectedVideoStream);
|
onPlayWithKodiListener.onActionSelected(selectedVideoStream);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
case R.id.menu_item_play_audio:
|
case R.id.menu_item_play_audio:
|
||||||
|
if(onPlayAudioListener != null) {
|
||||||
onPlayAudioListener.onActionSelected(selectedVideoStream);
|
onPlayAudioListener.onActionSelected(selectedVideoStream);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
Log.e(TAG, "Menu Item not known");
|
Log.e(TAG, "Menu Item not known");
|
||||||
@ -201,4 +214,16 @@ class ActionBarHandler {
|
|||||||
public void setOnPlayAudioListener(OnActionListener listener) {
|
public void setOnPlayAudioListener(OnActionListener listener) {
|
||||||
onPlayAudioListener = listener;
|
onPlayAudioListener = listener;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void showAudioAction(boolean visible) {
|
||||||
|
menu.findItem(R.id.menu_item_play_audio).setVisible(visible);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showDownloadAction(boolean visible) {
|
||||||
|
menu.findItem(R.id.menu_item_download).setVisible(visible);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showPlayWithKodiAction(boolean visible) {
|
||||||
|
menu.findItem(R.id.action_play_with_kodi).setVisible(visible);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,18 +1,13 @@
|
|||||||
package org.schabi.newpipe;
|
package org.schabi.newpipe;
|
||||||
|
|
||||||
import android.Manifest;
|
import android.Manifest;
|
||||||
import android.app.Activity;
|
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.app.DownloadManager;
|
import android.app.DownloadManager;
|
||||||
import android.app.Notification;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Environment;
|
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.v4.app.ActivityCompat;
|
import android.support.v4.app.ActivityCompat;
|
||||||
import android.support.v4.app.DialogFragment;
|
import android.support.v4.app.DialogFragment;
|
||||||
@ -63,30 +58,92 @@ public class DownloadDialog extends DialogFragment {
|
|||||||
if(ContextCompat.checkSelfPermission(this.getContext(),Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED)
|
if(ContextCompat.checkSelfPermission(this.getContext(),Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED)
|
||||||
ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},0);
|
ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},0);
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||||
builder.setTitle(R.string.download_dialog_title)
|
builder.setTitle(R.string.download_dialog_title);
|
||||||
.setItems(R.array.download_options, new DialogInterface.OnClickListener() {
|
|
||||||
|
// If no audio stream available
|
||||||
|
if(arguments.getString(AUDIO_URL) == null) {
|
||||||
|
builder.setItems(R.array.download_options_no_audio, new DialogInterface.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
Context context = getActivity();
|
Context context = getActivity();
|
||||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
|
||||||
String suffix = "";
|
|
||||||
String title = arguments.getString(TITLE);
|
String title = arguments.getString(TITLE);
|
||||||
String url = "";
|
|
||||||
File downloadDir = NewPipeSettings.getDownloadFolder();
|
|
||||||
switch (which) {
|
switch (which) {
|
||||||
case 0: // Video
|
case 0: // Video
|
||||||
suffix = arguments.getString(FILE_SUFFIX_VIDEO);
|
download(arguments.getString(VIDEO_URL),
|
||||||
url = arguments.getString(VIDEO_URL);
|
title,
|
||||||
downloadDir = NewPipeSettings.getVideoDownloadFolder(context);
|
arguments.getString(FILE_SUFFIX_VIDEO), context);
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
suffix = arguments.getString(FILE_SUFFIX_AUDIO);
|
|
||||||
url = arguments.getString(AUDIO_URL);
|
|
||||||
downloadDir = NewPipeSettings.getAudioDownloadFolder(context);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Log.d(TAG, "lolz");
|
Log.d(TAG, "lolz");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// If no video stream available
|
||||||
|
} else if(arguments.getString(VIDEO_URL) == null) {
|
||||||
|
builder.setItems(R.array.download_options_no_video, new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
Context context = getActivity();
|
||||||
|
String title = arguments.getString(TITLE);
|
||||||
|
switch (which) {
|
||||||
|
case 0: // Audio
|
||||||
|
download(arguments.getString(AUDIO_URL),
|
||||||
|
title,
|
||||||
|
arguments.getString(FILE_SUFFIX_AUDIO), context);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Log.d(TAG, "lolz");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//if both streams ar available
|
||||||
|
} else {
|
||||||
|
builder.setItems(R.array.download_options, new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
Context context = getActivity();
|
||||||
|
String title = arguments.getString(TITLE);
|
||||||
|
switch (which) {
|
||||||
|
case 0: // Video
|
||||||
|
download(arguments.getString(VIDEO_URL),
|
||||||
|
title,
|
||||||
|
arguments.getString(FILE_SUFFIX_VIDEO), context);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
download(arguments.getString(AUDIO_URL),
|
||||||
|
title,
|
||||||
|
arguments.getString(FILE_SUFFIX_AUDIO), context);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Log.d(TAG, "lolz");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return builder.create();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* #143 #44 #42 #22: make shure that the filename does not contain illegal chars.
|
||||||
|
* This should fix some of the "cannot download" problems.
|
||||||
|
* */
|
||||||
|
private String createFileName(String fName) {
|
||||||
|
// from http://eng-przemelek.blogspot.de/2009/07/how-to-create-valid-file-name.html
|
||||||
|
|
||||||
|
List<String> forbiddenCharsPatterns = new ArrayList<String> ();
|
||||||
|
forbiddenCharsPatterns.add("[:]+"); // Mac OS, but it looks that also Windows XP
|
||||||
|
forbiddenCharsPatterns.add("[\\*\"/\\\\\\[\\]\\:\\;\\|\\=\\,]+"); // Windows
|
||||||
|
forbiddenCharsPatterns.add("[^\\w\\d\\.]+"); // last chance... only latin letters and digits
|
||||||
|
String nameToTest = fName;
|
||||||
|
for (String pattern : forbiddenCharsPatterns) {
|
||||||
|
nameToTest = nameToTest.replaceAll(pattern, "_");
|
||||||
|
}
|
||||||
|
return nameToTest;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void download(String url, String title, String fileSuffix, Context context) {
|
||||||
|
File downloadDir = NewPipeSettings.getDownloadFolder();
|
||||||
|
|
||||||
if(!downloadDir.exists()) {
|
if(!downloadDir.exists()) {
|
||||||
//attempt to create directory
|
//attempt to create directory
|
||||||
boolean mkdir = downloadDir.mkdirs();
|
boolean mkdir = downloadDir.mkdirs();
|
||||||
@ -102,7 +159,7 @@ public class DownloadDialog extends DialogFragment {
|
|||||||
Toast.makeText(context,message , Toast.LENGTH_LONG).show();
|
Toast.makeText(context,message , Toast.LENGTH_LONG).show();
|
||||||
}
|
}
|
||||||
|
|
||||||
File saveFilePath = new File(downloadDir,createFileName(title) + suffix);
|
File saveFilePath = new File(downloadDir,createFileName(title) + fileSuffix);
|
||||||
|
|
||||||
long id = 0;
|
long id = 0;
|
||||||
if (App.isUsingTor()) {
|
if (App.isUsingTor()) {
|
||||||
@ -130,25 +187,4 @@ public class DownloadDialog extends DialogFragment {
|
|||||||
Log.i(TAG,"Started downloading '" + url +
|
Log.i(TAG,"Started downloading '" + url +
|
||||||
"' => '" + saveFilePath + "' #" + id);
|
"' => '" + saveFilePath + "' #" + id);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
return builder.create();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* #143 #44 #42 #22: make shure that the filename does not contain illegal chars.
|
|
||||||
* This should fix some of the "cannot download" problems.
|
|
||||||
* */
|
|
||||||
private String createFileName(String fName) {
|
|
||||||
// from http://eng-przemelek.blogspot.de/2009/07/how-to-create-valid-file-name.html
|
|
||||||
|
|
||||||
List<String> forbiddenCharsPatterns = new ArrayList<String> ();
|
|
||||||
forbiddenCharsPatterns.add("[:]+"); // Mac OS, but it looks that also Windows XP
|
|
||||||
forbiddenCharsPatterns.add("[\\*\"/\\\\\\[\\]\\:\\;\\|\\=\\,]+"); // Windows
|
|
||||||
forbiddenCharsPatterns.add("[^\\w\\d\\.]+"); // last chance... only latin letters and digits
|
|
||||||
String nameToTest = fName;
|
|
||||||
for (String pattern : forbiddenCharsPatterns) {
|
|
||||||
nameToTest = nameToTest.replaceAll(pattern, "_");
|
|
||||||
}
|
|
||||||
return nameToTest;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -414,24 +414,43 @@ public class VideoItemDetailFragment extends Fragment {
|
|||||||
actionBarHandler.setOnDownloadListener(new ActionBarHandler.OnActionListener() {
|
actionBarHandler.setOnDownloadListener(new ActionBarHandler.OnActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onActionSelected(int selectedStreamId) {
|
public void onActionSelected(int selectedStreamId) {
|
||||||
//VideoInfo.VideoStream selectedStreamItem = videoStreams.get(selectedStream);
|
try {
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
|
||||||
|
// Sometimes it may be that some information is not available due to changes fo the
|
||||||
|
// website which was crawled. Then the ui has to understand this and act right.
|
||||||
|
|
||||||
|
if (info.audio_streams != null) {
|
||||||
VideoInfo.AudioStream audioStream =
|
VideoInfo.AudioStream audioStream =
|
||||||
info.audio_streams.get(getPreferredAudioStreamId(info));
|
info.audio_streams.get(getPreferredAudioStreamId(info));
|
||||||
|
|
||||||
|
String audioSuffix = "." + MediaFormat.getSuffixById(audioStream.format);
|
||||||
|
args.putString(DownloadDialog.AUDIO_URL, audioStream.url);
|
||||||
|
args.putString(DownloadDialog.FILE_SUFFIX_AUDIO, audioSuffix);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info.video_streams != null) {
|
||||||
VideoInfo.VideoStream selectedStreamItem = info.video_streams.get(selectedStreamId);
|
VideoInfo.VideoStream selectedStreamItem = info.video_streams.get(selectedStreamId);
|
||||||
String videoSuffix = "." + MediaFormat.getSuffixById(selectedStreamItem.format);
|
String videoSuffix = "." + MediaFormat.getSuffixById(selectedStreamItem.format);
|
||||||
String audioSuffix = "." + MediaFormat.getSuffixById(audioStream.format);
|
|
||||||
Bundle args = new Bundle();
|
|
||||||
args.putString(DownloadDialog.FILE_SUFFIX_VIDEO, videoSuffix);
|
args.putString(DownloadDialog.FILE_SUFFIX_VIDEO, videoSuffix);
|
||||||
args.putString(DownloadDialog.FILE_SUFFIX_AUDIO, audioSuffix);
|
|
||||||
args.putString(DownloadDialog.TITLE, info.title);
|
|
||||||
args.putString(DownloadDialog.VIDEO_URL, selectedStreamItem.url);
|
args.putString(DownloadDialog.VIDEO_URL, selectedStreamItem.url);
|
||||||
args.putString(DownloadDialog.AUDIO_URL, audioStream.url);
|
}
|
||||||
|
|
||||||
|
args.putString(DownloadDialog.TITLE, info.title);
|
||||||
DownloadDialog downloadDialog = new DownloadDialog();
|
DownloadDialog downloadDialog = new DownloadDialog();
|
||||||
downloadDialog.setArguments(args);
|
downloadDialog.setArguments(args);
|
||||||
downloadDialog.show(activity.getSupportFragmentManager(), "downloadDialog");
|
downloadDialog.show(activity.getSupportFragmentManager(), "downloadDialog");
|
||||||
|
} catch(Exception e) {
|
||||||
|
Toast.makeText(VideoItemDetailFragment.this.getActivity(),
|
||||||
|
R.string.could_not_setup_download_menu, Toast.LENGTH_LONG).show();
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if(info.audio_streams == null) {
|
||||||
|
actionBarHandler.showAudioAction(false);
|
||||||
|
} else {
|
||||||
actionBarHandler.setOnPlayAudioListener(new ActionBarHandler.OnActionListener() {
|
actionBarHandler.setOnPlayAudioListener(new ActionBarHandler.OnActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onActionSelected(int selectedStreamId) {
|
public void onActionSelected(int selectedStreamId) {
|
||||||
@ -495,6 +514,7 @@ public class VideoItemDetailFragment extends Fragment {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private int getPreferredAudioStreamId(final VideoInfo info) {
|
private int getPreferredAudioStreamId(final VideoInfo info) {
|
||||||
String preferredFormatString = PreferenceManager.getDefaultSharedPreferences(getActivity())
|
String preferredFormatString = PreferenceManager.getDefaultSharedPreferences(getActivity())
|
||||||
|
@ -55,8 +55,10 @@ public class VideoInfo extends AbstractVideoInfo {
|
|||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Load and extract audio*/
|
/** Load and extract audio*/
|
||||||
videoInfo.audio_streams = extractor.getAudioStreams();
|
videoInfo.audio_streams = extractor.getAudioStreams();
|
||||||
|
// also try to get streams from the dashMpd
|
||||||
if(videoInfo.dashMpdUrl != null && !videoInfo.dashMpdUrl.isEmpty()) {
|
if(videoInfo.dashMpdUrl != null && !videoInfo.dashMpdUrl.isEmpty()) {
|
||||||
if(videoInfo.audio_streams == null) {
|
if(videoInfo.audio_streams == null) {
|
||||||
videoInfo.audio_streams = new Vector<AudioStream>();
|
videoInfo.audio_streams = new Vector<AudioStream>();
|
||||||
@ -82,9 +84,6 @@ public class VideoInfo extends AbstractVideoInfo {
|
|||||||
videoInfo.next_video = extractor.getNextVideo();
|
videoInfo.next_video = extractor.getNextVideo();
|
||||||
videoInfo.related_videos = extractor.getRelatedVideos();
|
videoInfo.related_videos = extractor.getRelatedVideos();
|
||||||
|
|
||||||
//Bitmap thumbnail = null;
|
|
||||||
//Bitmap uploader_thumbnail = null;
|
|
||||||
//int videoAvailableStatus = VIDEO_AVAILABLE;
|
|
||||||
return videoInfo;
|
return videoInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,6 +53,15 @@
|
|||||||
<item>Video</item>
|
<item>Video</item>
|
||||||
<item>Audio</item>
|
<item>Audio</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="download_options_no_audio">
|
||||||
|
<item>Video</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="download_options_no_video">
|
||||||
|
<item>Audio</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
<string name="next_video_title">Next video</string>
|
<string name="next_video_title">Next video</string>
|
||||||
<string name="show_next_and_similar_title">Show next and similar videos</string>
|
<string name="show_next_and_similar_title">Show next and similar videos</string>
|
||||||
<string name="url_not_supported_toast">URL not supported</string>
|
<string name="url_not_supported_toast">URL not supported</string>
|
||||||
@ -65,6 +74,8 @@
|
|||||||
<string name="background_player_playing_toast">Playing in background</string>
|
<string name="background_player_playing_toast">Playing in background</string>
|
||||||
<string name="c3s_url" translatable="false">https://www.c3s.cc/</string>
|
<string name="c3s_url" translatable="false">https://www.c3s.cc/</string>
|
||||||
<string name="play_btn_text">Play</string>
|
<string name="play_btn_text">Play</string>
|
||||||
|
|
||||||
|
<!-- error strings -->
|
||||||
<string name="general_error">Error</string>
|
<string name="general_error">Error</string>
|
||||||
<string name="network_error">Network error</string>
|
<string name="network_error">Network error</string>
|
||||||
<string name="could_not_load_thumbnails">Could not load all Thumbnails</string>
|
<string name="could_not_load_thumbnails">Could not load all Thumbnails</string>
|
||||||
@ -72,6 +83,8 @@
|
|||||||
<string name="parsing_error">Could not parse website.</string>
|
<string name="parsing_error">Could not parse website.</string>
|
||||||
<string name="content_not_available">Content not available.</string>
|
<string name="content_not_available">Content not available.</string>
|
||||||
<string name="blocked_by_gema">Blocked by GEMA.</string>
|
<string name="blocked_by_gema">Blocked by GEMA.</string>
|
||||||
|
<string name="could_not_setup_download_menu">Could not setup download menu.</string>
|
||||||
|
|
||||||
|
|
||||||
<!-- Content descriptions (for better accessibility) -->
|
<!-- Content descriptions (for better accessibility) -->
|
||||||
<string name="list_thumbnail_view_description">Video preview thumbnail</string>
|
<string name="list_thumbnail_view_description">Video preview thumbnail</string>
|
||||||
|
Loading…
Reference in New Issue
Block a user