diff --git a/CHANGELOG.md b/CHANGELOG.md index e5f034d..f054d1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +### Version 1.0.24 Tag: v1.0.24 (2019-01-09) + * Set video quality (@digiwizkid) + * BN Strings update (@digiwizkid) + * RU Strings update (@ferhadnecef) + * Added another level in video options menu + * Moved torrent progressbas into video + * Better NSFW Filter labeling + ### Version 1.0.23 Tag: v1.0.23 (2019-01-06) * Moved video playback into fragment * Added duration to video list diff --git a/README.md b/README.md index 43d4b61..32f53df 100644 --- a/README.md +++ b/README.md @@ -22,12 +22,13 @@ Beta Test on Google Play: https://play.google.com/store/apps/details?id=net.schu - [X] Very Basic Torrent playback - [X] Change Server - [X] Search -- [X] App Icon and assets - [X] Themes / Dark mode - [X] Background playback - [X] NSFW Filter option - [X] Authentication / Login - [X] Like/dislike video +- [X] Video speed selection +- [X] Video quality selection ## TODO diff --git a/app/build.gradle b/app/build.gradle index 59a2099..6ef20cd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,8 +6,8 @@ android { applicationId "net.schueller.peertube" minSdkVersion 21 targetSdkVersion 28 - versionCode 1023 - versionName "1.0.23" + versionCode 1024 + versionName "1.0.24" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ext { libVersions = [ diff --git a/app/src/main/java/net/schueller/peertube/fragment/VideoMenuQualityFragment.java b/app/src/main/java/net/schueller/peertube/fragment/VideoMenuQualityFragment.java new file mode 100644 index 0000000..45420d9 --- /dev/null +++ b/app/src/main/java/net/schueller/peertube/fragment/VideoMenuQualityFragment.java @@ -0,0 +1,125 @@ +/* + * Copyright 2018 Stefan Schüller + * + * License: GPL-3.0+ + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package net.schueller.peertube.fragment; + +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; +import com.mikepenz.iconics.Iconics; + +import net.schueller.peertube.R; +import net.schueller.peertube.model.File; +import net.schueller.peertube.model.Resolution; + +import java.util.ArrayList; + +import androidx.annotation.Nullable; + +public class VideoMenuQualityFragment extends BottomSheetDialogFragment { + + private static ArrayList mFiles; + public static final String TAG = "VideoMenuQuality"; + private static File autoQualityFile; + + public static VideoMenuQualityFragment newInstance(ArrayList files) { + + mFiles = files; + + // Auto quality + if (autoQualityFile == null) { + autoQualityFile = new File(); + Resolution autoQualityResolution = new Resolution(); + autoQualityResolution.setId(0); + autoQualityResolution.setLabel("Auto"); + autoQualityFile.setId(0); + autoQualityFile.setResolution(autoQualityResolution); + } + if (!mFiles.contains(autoQualityFile)) { + mFiles.add(0, autoQualityFile); + } + + return new VideoMenuQualityFragment(); + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + + View view = inflater.inflate(R.layout.fragment_video_options_quality_popup_menu, container, + false); + + SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getContext()); + Integer videoQuality = sharedPref.getInt("pref_quality", 0); + + for (File file : mFiles) { + + LinearLayout menuRow = (LinearLayout) inflater.inflate(R.layout.row_popup_menu, null); + + TextView iconView = menuRow.findViewById(R.id.video_quality_icon); + iconView.setId(file.getResolution().getId()); + TextView textView = menuRow.findViewById(R.id.video_quality_text); + + Log.v(TAG, file.getResolution().getLabel()); + textView.setText(file.getResolution().getLabel()); + + textView.setOnClickListener(view1 -> { +// Log.v(TAG, file.getResolution().getLabel()); + SharedPreferences.Editor editor = sharedPref.edit(); + editor.putInt("pref_quality", file.getResolution().getId()); + editor.apply(); + + for (File fileV : mFiles) { + TextView iconViewV = view.findViewById(fileV.getResolution().getId()); + iconViewV.setText(""); + } + + iconView.setText(R.string.video_quality_active_icon); + new Iconics.IconicsBuilder().ctx(getContext()).on(iconView).build(); + + //TODO: set new video quality on running video + + }); + + // Add to menu + LinearLayout menuHolder = view.findViewById(R.id.video_quality_menu); + menuHolder.addView(menuRow); + + // Set current + if (videoQuality.equals(file.getResolution().getId())) { + iconView.setText(R.string.video_quality_active_icon); + new Iconics.IconicsBuilder().ctx(getContext()).on(iconView).build(); + } + + } + + return view; + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/net/schueller/peertube/fragment/VideoMenuSpeedFragment.java b/app/src/main/java/net/schueller/peertube/fragment/VideoMenuSpeedFragment.java new file mode 100644 index 0000000..52e9378 --- /dev/null +++ b/app/src/main/java/net/schueller/peertube/fragment/VideoMenuSpeedFragment.java @@ -0,0 +1,97 @@ +/* + * Copyright 2018 Stefan Schüller + * + * License: GPL-3.0+ + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package net.schueller.peertube.fragment; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; +import com.mikepenz.iconics.Iconics; + +import net.schueller.peertube.R; +import net.schueller.peertube.service.VideoPlayerService; + +import androidx.annotation.Nullable; + +public class VideoMenuSpeedFragment extends BottomSheetDialogFragment { + + private static VideoPlayerService videoPlayerService; + public static final String TAG = "VideoMenuSpeed"; + + private TextView speed05Icon; + private TextView speed10Icon; + private TextView speed15Icon; + private TextView speed20Icon; + + public static VideoMenuSpeedFragment newInstance(VideoPlayerService mService) { + videoPlayerService = mService; + return new VideoMenuSpeedFragment(); + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + + View view = inflater.inflate(R.layout.fragment_video_options_speed_popup_menu, container, + false); + + // Icons + speed05Icon = view.findViewById(R.id.video_speed05_icon); + speed10Icon = view.findViewById(R.id.video_speed10_icon); + speed15Icon = view.findViewById(R.id.video_speed15_icon); + speed20Icon = view.findViewById(R.id.video_speed20_icon); + + // Buttons + TextView speed05 = view.findViewById(R.id.video_speed05); + TextView speed10 = view.findViewById(R.id.video_speed10); + TextView speed15 = view.findViewById(R.id.video_speed15); + TextView speed20 = view.findViewById(R.id.video_speed20); + + // Default + setVideoSpeed(1.0f, speed10Icon); + + // Attach the listener + speed05.setOnClickListener(v -> setVideoSpeed(0.5f, speed05Icon)); + speed10.setOnClickListener(v -> setVideoSpeed(1.0f, speed10Icon)); + speed15.setOnClickListener(v -> setVideoSpeed(1.5f, speed15Icon)); + speed20.setOnClickListener(v -> setVideoSpeed(2.0f, speed20Icon)); + + return view; + + } + + + private void setVideoSpeed(Float speed, TextView icon) { + + speed05Icon.setText(""); + speed10Icon.setText(""); + speed15Icon.setText(""); + speed20Icon.setText(""); + + videoPlayerService.setPlayBackSpeed(speed); + + icon.setText(R.string.video_speed_active_icon); + new Iconics.IconicsBuilder().ctx(getContext()).on(icon).build(); + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/schueller/peertube/fragment/VideoMetaDataFragment.java b/app/src/main/java/net/schueller/peertube/fragment/VideoMetaDataFragment.java index f97ebf7..d58eab7 100644 --- a/app/src/main/java/net/schueller/peertube/fragment/VideoMetaDataFragment.java +++ b/app/src/main/java/net/schueller/peertube/fragment/VideoMetaDataFragment.java @@ -251,11 +251,10 @@ public class VideoMetaDataFragment extends Fragment { new Iconics.IconicsBuilder().ctx(context).on(videoOptions).build(); videoOptions.setOnClickListener(v -> { - VideoOptionsFragment videoOptionsFragment = - VideoOptionsFragment.newInstance(mService); + VideoOptionsFragment.newInstance(mService, video.getFiles()); videoOptionsFragment.show(getActivity().getSupportFragmentManager(), - "video_options_fragment"); + VideoOptionsFragment.TAG); }); } diff --git a/app/src/main/java/net/schueller/peertube/fragment/VideoOptionsFragment.java b/app/src/main/java/net/schueller/peertube/fragment/VideoOptionsFragment.java index 7c5758e..212c2d2 100644 --- a/app/src/main/java/net/schueller/peertube/fragment/VideoOptionsFragment.java +++ b/app/src/main/java/net/schueller/peertube/fragment/VideoOptionsFragment.java @@ -17,30 +17,36 @@ */ package net.schueller.peertube.fragment; +import android.annotation.SuppressLint; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.LinearLayout; import android.widget.TextView; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import com.mikepenz.iconics.Iconics; import net.schueller.peertube.R; +import net.schueller.peertube.model.File; import net.schueller.peertube.service.VideoPlayerService; +import java.util.ArrayList; + import androidx.annotation.Nullable; public class VideoOptionsFragment extends BottomSheetDialogFragment { private static VideoPlayerService videoPlayerService; + private static ArrayList files; - private TextView speed05Icon; - private TextView speed10Icon; - private TextView speed15Icon; - private TextView speed20Icon; + public static final String TAG = "VideoOptions"; - public static VideoOptionsFragment newInstance(VideoPlayerService mService) { + + public static VideoOptionsFragment newInstance(VideoPlayerService mService, ArrayList mFiles) { videoPlayerService = mService; + files = mFiles; return new VideoOptionsFragment(); } @@ -53,43 +59,40 @@ public class VideoOptionsFragment extends BottomSheetDialogFragment { View view = inflater.inflate(R.layout.fragment_video_options_popup_menu, container, false); - // Icons - speed05Icon = view.findViewById(R.id.video_speed05_icon); - speed10Icon = view.findViewById(R.id.video_speed10_icon); - speed15Icon = view.findViewById(R.id.video_speed15_icon); - speed20Icon = view.findViewById(R.id.video_speed20_icon); + LinearLayout menuHolder = view.findViewById(R.id.video_options_popup); - // Buttons - TextView speed05 = view.findViewById(R.id.video_speed05); - TextView speed10 = view.findViewById(R.id.video_speed10); - TextView speed15 = view.findViewById(R.id.video_speed15); - TextView speed20 = view.findViewById(R.id.video_speed20); + // Video Speed + LinearLayout menuRow = (LinearLayout) inflater.inflate(R.layout.row_popup_menu, null); + TextView iconView = menuRow.findViewById(R.id.video_quality_icon); + TextView textView = menuRow.findViewById(R.id.video_quality_text); + textView.setText(getString(R.string.menu_video_options_playback_speed)); + iconView.setText(R.string.video_option_speed_icon); + new Iconics.IconicsBuilder().ctx(getContext()).on(iconView).build(); + textView.setOnClickListener(view1 -> { + VideoMenuSpeedFragment videoMenuSpeedFragment = + VideoMenuSpeedFragment.newInstance(videoPlayerService); + videoMenuSpeedFragment.show(getActivity().getSupportFragmentManager(), + VideoMenuSpeedFragment.TAG); + }); + menuHolder.addView(menuRow); - // Default - setVideoSpeed(1.0f, speed10Icon); - - // Attach the listener - speed05.setOnClickListener(v -> setVideoSpeed(0.5f, speed05Icon)); - speed10.setOnClickListener(v -> setVideoSpeed(1.0f, speed10Icon)); - speed15.setOnClickListener(v -> setVideoSpeed(1.5f, speed15Icon)); - speed20.setOnClickListener(v -> setVideoSpeed(2.0f, speed20Icon)); + // Video Quality + LinearLayout menuRow2 = (LinearLayout) inflater.inflate(R.layout.row_popup_menu, null); + TextView iconView2 = menuRow2.findViewById(R.id.video_quality_icon); + TextView textView2 = menuRow2.findViewById(R.id.video_quality_text); + textView2.setText(getString(R.string.menu_video_options_quality)); + iconView2.setText(R.string.video_option_quality_icon); + new Iconics.IconicsBuilder().ctx(getContext()).on(iconView2).build(); + textView2.setOnClickListener(view1 -> { + VideoMenuQualityFragment videoMenuQualityFragment = + VideoMenuQualityFragment.newInstance(files); + videoMenuQualityFragment.show(getActivity().getSupportFragmentManager(), + videoMenuQualityFragment.TAG); + }); + menuHolder.addView(menuRow2); return view; } - - private void setVideoSpeed(Float speed, TextView icon) { - - speed05Icon.setText(""); - speed10Icon.setText(""); - speed15Icon.setText(""); - speed20Icon.setText(""); - - videoPlayerService.setPlayBackSpeed(speed); - - icon.setText(R.string.video_speed_active_icon); - new Iconics.IconicsBuilder().ctx(getContext()).on(icon).build(); - } - } \ No newline at end of file diff --git a/app/src/main/java/net/schueller/peertube/fragment/VideoPlayerFragment.java b/app/src/main/java/net/schueller/peertube/fragment/VideoPlayerFragment.java index 2680e25..b92023d 100644 --- a/app/src/main/java/net/schueller/peertube/fragment/VideoPlayerFragment.java +++ b/app/src/main/java/net/schueller/peertube/fragment/VideoPlayerFragment.java @@ -34,6 +34,8 @@ import android.view.LayoutInflater; import android.view.Surface; import android.view.View; import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; @@ -54,6 +56,7 @@ import com.mikepenz.iconics.Iconics; import net.schueller.peertube.R; import net.schueller.peertube.helper.APIUrlHelper; +import net.schueller.peertube.model.File; import net.schueller.peertube.model.Video; import net.schueller.peertube.network.GetVideoDataService; import net.schueller.peertube.network.RetrofitInstance; @@ -77,6 +80,7 @@ public class VideoPlayerFragment extends Fragment implements VideoRendererEventL private Boolean isFullscreen = false; private VideoPlayerService mService; private TorrentStream torrentStream; + private LinearLayout torrentStatus; private static final String TAG = "VideoPlayerFragment"; @@ -122,7 +126,7 @@ public class VideoPlayerFragment extends Fragment implements VideoRendererEventL mVideoUuid = videoUuid; assert activity != null; - progressBar = activity.findViewById(R.id.progress); + progressBar = activity.findViewById(R.id.torrent_progress); progressBar.setMax(100); simpleExoPlayerView = new PlayerView(context); @@ -131,6 +135,8 @@ public class VideoPlayerFragment extends Fragment implements VideoRendererEventL simpleExoPlayerView.setControllerShowTimeoutMs(1000); simpleExoPlayerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIT); + torrentStatus = activity.findViewById(R.id.exo_torrent_status); + // Full screen Icon TextView fullscreenButton = activity.findViewById(R.id.exo_fullscreen); fullscreenButton.setText(R.string.video_expand_icon); @@ -202,18 +208,29 @@ public class VideoPlayerFragment extends Fragment implements VideoRendererEventL assert videoMetaDataFragment != null; videoMetaDataFragment.updateVideoMeta(video, mService); - Log.v(TAG, "url : " + video.getFiles().get(0).getFileUrl()); - - mService.setCurrentStreamUrl(video.getFiles().get(0).getFileUrl()); - SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context); - if (sharedPref.getBoolean("pref_torrent_player", false)) { + if (sharedPref.getBoolean("pref_torrent_player", false)) { + torrentStatus.setVisibility(View.VISIBLE); String stream = video.getFiles().get(0).getTorrentUrl(); Log.v(TAG, "getTorrentUrl : " + video.getFiles().get(0).getTorrentUrl()); torrentStream = setupTorrentStream(); torrentStream.startStream(stream); } else { + + Integer videoQuality = sharedPref.getInt("pref_quality", 0); + + //get video qualities + String urlToPlay = video.getFiles().get(0).getFileUrl(); + for (File file :video.getFiles()) { + // Set quality if it matches + if (file.getResolution().getId().equals(videoQuality)) { + urlToPlay = file.getFileUrl(); + } + } + mService.setCurrentStreamUrl(urlToPlay); + + torrentStatus.setVisibility(View.GONE); startPlayer(); } Log.v(TAG, "end of load Video"); diff --git a/app/src/main/java/net/schueller/peertube/model/File.java b/app/src/main/java/net/schueller/peertube/model/File.java index fe993da..4cf30c9 100644 --- a/app/src/main/java/net/schueller/peertube/model/File.java +++ b/app/src/main/java/net/schueller/peertube/model/File.java @@ -21,7 +21,6 @@ public class File { private Integer id; private String fileDownloadUrl; private Integer fps; - private String label; private Resolution resolution; private String resolutionLabel; private String magnetUri; @@ -54,14 +53,6 @@ public class File { this.fps = fps; } - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - public Resolution getResolution() { return resolution; } diff --git a/app/src/main/res/layout/fragment_video_options_popup_menu.xml b/app/src/main/res/layout/fragment_video_options_popup_menu.xml index ca15827..b6dd933 100644 --- a/app/src/main/res/layout/fragment_video_options_popup_menu.xml +++ b/app/src/main/res/layout/fragment_video_options_popup_menu.xml @@ -4,124 +4,7 @@ android:layout_marginTop="8dp" android:layout_marginBottom="8dp" android:background="@color/videoBackgroundColor" + android:id="@+id/video_options_popup" android:orientation="vertical"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_video_options_quality_popup_menu.xml b/app/src/main/res/layout/fragment_video_options_quality_popup_menu.xml new file mode 100644 index 0000000..a9fa70c --- /dev/null +++ b/app/src/main/res/layout/fragment_video_options_quality_popup_menu.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_video_options_speed_popup_menu.xml b/app/src/main/res/layout/fragment_video_options_speed_popup_menu.xml new file mode 100644 index 0000000..ca15827 --- /dev/null +++ b/app/src/main/res/layout/fragment_video_options_speed_popup_menu.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_video_player.xml b/app/src/main/res/layout/fragment_video_player.xml index 14a5876..f05d160 100644 --- a/app/src/main/res/layout/fragment_video_player.xml +++ b/app/src/main/res/layout/fragment_video_player.xml @@ -15,12 +15,5 @@ /> - \ No newline at end of file diff --git a/app/src/main/res/layout/row_popup_menu.xml b/app/src/main/res/layout/row_popup_menu.xml new file mode 100644 index 0000000..8906d5b --- /dev/null +++ b/app/src/main/res/layout/row_popup_menu.xml @@ -0,0 +1,31 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/video_playback_controls.xml b/app/src/main/res/layout/video_playback_controls.xml index 7dd5b36..f15235b 100644 --- a/app/src/main/res/layout/video_playback_controls.xml +++ b/app/src/main/res/layout/video_playback_controls.xml @@ -10,8 +10,6 @@ android:orientation="vertical" tools:targetApi="28"> - - + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml new file mode 100644 index 0000000..97bc39a --- /dev/null +++ b/app/src/main/res/values-bn/strings.xml @@ -0,0 +1,331 @@ + + PeerTube + + VideoPlayActivity + সেটিং + সাইন ইন + + + সার্ভার + ইমেল / ইয়ুজারনেম + পাসওয়ার্ড + সাইন ইন + সাইন ইন + ভুল ইমেল আইডি + পাসওয়ার্ড খুব ছোট + ভুল পাসওয়ার্ড + এটি জরুরি ফিল্ড + "Contacts permissions are needed for providing email + completions." + + + + সার্চ + সেটিং + " লগআউট" + + + হোম + "Trending" + Subscriptions + একাউন্ট + + + 1.0.0-alpha.7 + + https://troll.tv + PeerTube Server + + + + \u0020-\u0020 + \u0020Views + \@ + + + Video Thumbnail + Account Avatar + + NSFW দেখাও + NSFW content will be shown if enabled. + ভাষা ফিলটার + " ভিডিওর ভাষা পছন্দ করুন, কিছু পছন্দ না করলে সব ভাষার ভিডিও দেখা যাবে" + UrlVideoPlayActivity + Torrent Video Player + Video playback via a torrent stream. This requires Storage Permissions. (Alpha, not stable!) + লাইসেন্স + \nGNU Affero General Public License v3.0\n\nPermissions of this strongest copyleft license are conditioned on making available complete source code of licensed works and modifications, which include larger works using a licensed work, under the same license. Copyright and license notices must be preserved. Contributors provide an express grant of patent rights. When a modified version is used to provide a service over a network, the complete source code of the modified version must be made available. + ভার্সন + সার্চ PeerTube + সার্চ + " কোন উত্তর নেই" + আরও + শেয়ার + PeerTube + Invalid Url! + ডার্ক মোড + Restart App for Dark Mode to take effect. + App Theme + Restart App for theme to take effect. + + Abkhazian + Afar + Afrikaans + Akan + Albanian + American Sign Language + Amharic + Arabic + Aragonese + Armenian + Assamese + Avaric + Aymara + Azerbaijani + Bambara + Bashkir + Basque + Belarusian + বাংলা + Bislama + Bosnian + Brazilian Sign Language + Breton + British Sign Language + Bulgarian + Burmese + Catalan + Chamorro + Chechen + Chinese + Chinese Sign Language + Chuvash + Cornish + Corsican + Cree + Croatian + Czech + Czech Sign Language + Danish + Danish Sign Language + Dhivehi + Dutch + Dzongkha + ইংলিশ + Esperanto + Estonian + Ewe + Faroese + Fijian + Finnish + French + French Sign Language + Fulah + Galician + Ganda + Georgian + German + German Sign Language + Guarani + Gujarati + Haitian + Hausa + Hebrew + Herero + Hindi + Hiri Motu + Hungarian + Icelandic + Igbo + Indonesian + Inuktitut + Inupiaq + Irish + Italian + Japanese + Japanese Sign Language + Javanese + Kalaallisut + Kannada + Kanuri + Kashmiri + Kazakh + Khmer + Kikuyu + Kinyarwanda + Kirghiz + Klingon + Komi + Kongo + Korean + Kotava + Kuanyama + Kurdish + Lao + Latvian + Limburgan + Lingala + Lithuanian + Lojban + Luba-Katanga + Luxembourgish + Macedonian + Malagasy + Malay (macrolanguage) + Malayalam + Maltese + Manx + Maori + Marathi + Marshallese + Modern Greek (1453-) + Mongolian + Nauru + Navajo + Ndonga + Nepali (macrolanguage) + North Ndebele + Northern Sami + Norwegian + Norwegian Bokmål + Norwegian Nynorsk + Nyanja + Occitan + Ojibwa + Oriya (macrolanguage) + Oromo + Ossetian + Pakistan Sign Language + Panjabi + Persian + Polish + Portuguese + Pushto + Quechua + Romanian + Romansh + Rundi + Russian + Russian Sign Language + Samoan + Sango + Sardinian + Saudi Arabian Sign Language + Scottish Gaelic + Serbian + Serbo-Croatian + Shona + Sichuan Yi + Sindhi + Sinhala + Slovak + Slovenian + Somali + South African Sign Language + South Ndebele + Southern Sotho + Spanish + Sundanese + Swahili (macrolanguage) + Swati + Swedish + Swedish Sign Language + Tagalog + Tahitian + Tajik + Tamil + Tatar + Telugu + Thai + Tibetan + Tigrinya + Tonga (Tonga Islands) + Tsonga + Tswana + Turkish + Turkmen + Twi + Uighur + Ukrainian + Urdu + Uzbek + Venda + Vietnamese + Walloon + Welsh + Western Frisian + Wolof + Xhosa + Yiddish + Yoruba + Zhuang + Zulu + + লাল + গোলাপি + বেগুনি + Indigo + নীল + হালকা নীল + Cyan + Teal + সবুজ + হালকা সবুজ + Lime + হলুদ + Amber + কমলা + Deep Orange + বাদামী + ধুসর + Bluegray + 0.5x + Normal + 1.5x + 2x + + + {faw-check} + {faw-expand} + {faw-compress} + {faw-ellipsis-v} + {faw-thumbs-up} + {faw-thumbs-down} + {faw-share} + {faw-download} + {faw-save} + + Background Playback + If enabled, continues to play video in background. + Local + + একাউন্ট + রিপোর্ট + Blacklist + Can not download video without write permission + Rating Failed + You must login to use this service + + শেয়ার + ডাউনলোড + Privacy + Category + License + ভাষা + Tags + + + + pref_token_access + pref_token_refresh + pref_token_expiration + pref_token_type + pref_auth_username + pref_auth_password + none + like + dislike + গাঢ় বেগুনি + + + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index eae63df..c15328e 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -252,7 +252,7 @@ Серый Серо-голубой 0.5x - Нормальный + Нормальная 1.5x 2x diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml index e842230..5936a02 100644 --- a/app/src/main/res/values/array.xml +++ b/app/src/main/res/values/array.xml @@ -435,4 +435,16 @@ + + Low + Medium + High + + + + Low + Medium + High + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a16b601..7bda034 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -46,8 +46,8 @@ Video Thumbnail Account Avatar - Show NSFW - NSFW content will be shown if enabled. + NSFW Content + Show NSFW content Languages filter Select video languages that should be shown. None selected will show all videos in all languages. UrlVideoPlayActivity @@ -285,8 +285,10 @@ 1.5x 2x - + {faw-play-circle} + {faw-cog} {faw-check} + {faw-check} {faw-expand} {faw-compress} {faw-ellipsis-v} @@ -315,6 +317,8 @@ Language Tags + Playback speed + Quality pref_token_access @@ -328,4 +332,5 @@ dislike +