diff --git a/.github/downloads.jpg b/.github/downloads.jpg index af6da6b2..a064c98c 100644 Binary files a/.github/downloads.jpg and b/.github/downloads.jpg differ diff --git a/.github/home.jpg b/.github/home.jpg index 07b1a54c..16a5a66a 100644 Binary files a/.github/home.jpg and b/.github/home.jpg differ diff --git a/.github/player.jpg b/.github/player.jpg index 55fb6804..61d205e0 100644 Binary files a/.github/player.jpg and b/.github/player.jpg differ diff --git a/.github/results.jpg b/.github/results.jpg index 4d715be4..7d675ea6 100644 Binary files a/.github/results.jpg and b/.github/results.jpg differ diff --git a/.github/search.jpg b/.github/search.jpg index 025f4216..4ef747ed 100644 Binary files a/.github/search.jpg and b/.github/search.jpg differ diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt index 39b2c9c7..a4687103 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt @@ -13,7 +13,7 @@ import android.widget.FrameLayout import android.widget.TextView import androidx.core.view.isVisible import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProvider +import androidx.fragment.app.activityViewModels import androidx.preference.PreferenceManager import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager @@ -34,6 +34,7 @@ import com.lagradost.cloudstream3.ui.result.START_ACTION_RESUME_LATEST import com.lagradost.cloudstream3.ui.search.* import com.lagradost.cloudstream3.ui.search.SearchFragment.Companion.filterSearchResponse import com.lagradost.cloudstream3.ui.search.SearchHelper.handleSearchClickCallback +import com.lagradost.cloudstream3.utils.AppUtils import com.lagradost.cloudstream3.utils.AppUtils.loadSearchResult import com.lagradost.cloudstream3.utils.DataStore.getKey import com.lagradost.cloudstream3.utils.DataStore.setKey @@ -97,15 +98,15 @@ class HomeFragment : Fragment() { } } - private lateinit var homeViewModel: HomeViewModel + private val homeViewModel: HomeViewModel by activityViewModels() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - homeViewModel = - ViewModelProvider(this).get(HomeViewModel::class.java) + //homeViewModel = + // ViewModelProvider(this).get(HomeViewModel::class.java) return inflater.inflate(R.layout.fragment_home, container, false) } @@ -167,19 +168,9 @@ class HomeFragment : Fragment() { } private val apiChangeClickListener = View.OnClickListener { view -> - val allApis = apis.filter { api -> api.hasMainPage }.toMutableList() - var validAPIs = allApis val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) val currentPrefMedia = settingsManager.getInt(getString(R.string.preferred_media_settings), 0) - - // Filter API depending on preferred media type - if (currentPrefMedia > 0) { - val listEnumAnime = listOf(TvType.Anime, TvType.AnimeMovie, TvType.ONA) - val listEnumMovieTv = listOf(TvType.Movie, TvType.TvSeries, TvType.Cartoon) - val mediaTypeList = if (currentPrefMedia==1) listEnumMovieTv else listEnumAnime - - validAPIs = allApis.filter { api -> api.supportedTypes.any { it in mediaTypeList } }.toMutableList() - } + val validAPIs = AppUtils.filterProviderByPreferredMedia(apis, currentPrefMedia).toMutableList() validAPIs.add(0, randomApi) validAPIs.add(0, noneApi) @@ -423,9 +414,11 @@ class HomeFragment : Fragment() { reloadStored() val apiName = context?.getKey(HOMEPAGE_API) + val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) + val currentPrefMedia = settingsManager.getInt(getString(R.string.preferred_media_settings), 0) if (homeViewModel.apiName.value != apiName || apiName == null) { //println("Caught home: " + homeViewModel.apiName.value + " at " + apiName) - homeViewModel.loadAndCancel(apiName, 0) + homeViewModel.loadAndCancel(apiName, currentPrefMedia) } } } \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeViewModel.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeViewModel.kt index 5d573c41..e51cb088 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeViewModel.kt @@ -7,25 +7,24 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.lagradost.cloudstream3.APIHolder.apis import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull +import com.lagradost.cloudstream3.AcraApplication.Companion.context import com.lagradost.cloudstream3.HomePageResponse import com.lagradost.cloudstream3.MainAPI import com.lagradost.cloudstream3.SearchResponse -import com.lagradost.cloudstream3.TvType import com.lagradost.cloudstream3.mvvm.Resource import com.lagradost.cloudstream3.ui.APIRepository import com.lagradost.cloudstream3.ui.APIRepository.Companion.noneApi import com.lagradost.cloudstream3.ui.APIRepository.Companion.randomApi import com.lagradost.cloudstream3.ui.WatchType -import com.lagradost.cloudstream3.utils.DOWNLOAD_HEADER_CACHE +import com.lagradost.cloudstream3.utils.* import com.lagradost.cloudstream3.utils.DataStore.getKey -import com.lagradost.cloudstream3.utils.DataStoreHelper +import com.lagradost.cloudstream3.utils.DataStore.setKey import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllResumeStateIds import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllWatchStateIds import com.lagradost.cloudstream3.utils.DataStoreHelper.getBookmarkedData import com.lagradost.cloudstream3.utils.DataStoreHelper.getLastWatched import com.lagradost.cloudstream3.utils.DataStoreHelper.getResultWatchState import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos -import com.lagradost.cloudstream3.utils.VideoDownloadHelper import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.launch @@ -154,16 +153,10 @@ class HomeViewModel : ViewModel() { if (preferredApiName == noneApi.name) loadAndCancel(noneApi) else if(preferredApiName == randomApi.name || api == null) { - val allApis = apis.filter { api -> api.hasMainPage }.toMutableList() - var validAPIs = allApis - if (currentPrefMedia > 0) { - val listEnumAnime = listOf(TvType.Anime, TvType.AnimeMovie, TvType.ONA) - val listEnumMovieTv = listOf(TvType.Movie, TvType.TvSeries, TvType.Cartoon) - val mediaTypeList = if (currentPrefMedia==1) listEnumMovieTv else listEnumAnime - - validAPIs = allApis.filter { api -> api.supportedTypes.any { it in mediaTypeList } }.toMutableList() - } - loadAndCancel(validAPIs.random()) + var validAPIs = AppUtils.filterProviderByPreferredMedia(apis, currentPrefMedia) + val apiRandom = validAPIs.random() + loadAndCancel(apiRandom) + context?.setKey(HOMEPAGE_API, apiRandom.name) } else { loadAndCancel(api) } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerFragment.kt index 89d4a228..108ad85f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerFragment.kt @@ -34,7 +34,7 @@ import android.widget.Toast.LENGTH_SHORT import androidx.appcompat.app.AlertDialog import androidx.core.view.isVisible import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProvider +import androidx.fragment.app.activityViewModels import androidx.preference.PreferenceManager import androidx.transition.Fade import androidx.transition.Transition @@ -86,7 +86,6 @@ import com.lagradost.cloudstream3.utils.CastHelper.startCast import com.lagradost.cloudstream3.utils.DataStore.getKey import com.lagradost.cloudstream3.utils.DataStore.setKey import com.lagradost.cloudstream3.utils.DataStoreHelper.setLastWatched -import com.lagradost.cloudstream3.utils.DataStoreHelper.setViewPos import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute import com.lagradost.cloudstream3.utils.UIHelper.getNavigationBarHeight @@ -248,7 +247,7 @@ class PlayerFragment : Fragment() { private var isFullscreen = false private var isPlayerPlaying = true - private lateinit var viewModel: ResultViewModel + private val viewModel: ResultViewModel by activityViewModels() private lateinit var playerData: PlayerData private lateinit var uriData: UriData private var isDownloadedFile = false @@ -791,20 +790,20 @@ class PlayerFragment : Fragment() { if (this::exoPlayer.isInitialized) { if (exoPlayer.duration > 0 && exoPlayer.currentPosition > 0) { context?.let { ctx -> - if (this::viewModel.isInitialized) { + //if (this::viewModel.isInitialized) { viewModel.setViewPos( ctx, if (isDownloadedFile) uriData.id else getEpisode()?.id, exoPlayer.currentPosition, exoPlayer.duration ) - } else { + /*} else { ctx.setViewPos( if (isDownloadedFile) uriData.id else getEpisode()?.id, exoPlayer.currentPosition, exoPlayer.duration ) - } + }*/ if (isDownloadedFile) { ctx.setLastWatched(uriData.parentId, uriData.id, uriData.episode, uriData.season, true) @@ -880,6 +879,7 @@ class PlayerFragment : Fragment() { val isClick = !isLocked exo_play?.isClickable = isClick + sources_btt?.isClickable = isClick exo_pause?.isClickable = isClick exo_ffwd?.isClickable = isClick exo_rew?.isClickable = isClick @@ -1055,8 +1055,9 @@ class PlayerFragment : Fragment() { showToast(activity, resizeModes[resizeMode].second, LENGTH_SHORT) } PlayerEventType.ShowSpeed.value -> { - val speedsText = listOf("0.5x", "0.75x", "1x", "1.25x", "1.5x", "1.75x", "2x") - val speedsNumbers = listOf(0.5f, 0.75f, 1f, 1.25f, 1.5f, 1.75f, 2f) + val speedsText = + listOf("0.5x", "0.75x", "0.85x", "1x", "1.15x", "1.25x", "1.4x", "1.5x", "1.75x", "2x") + val speedsNumbers = listOf(0.5f, 0.75f, 0.85f, 1f, 1.15f, 1.25f, 1.4f, 1.5f, 1.75f, 2f) val speedIndex = speedsNumbers.indexOf(playbackSpeed) context?.let { ctx -> @@ -1383,7 +1384,7 @@ class PlayerFragment : Fragment() { } if (!isDownloadedFile) { - viewModel = ViewModelProvider(activity ?: this).get(ResultViewModel::class.java) + //viewModel = ViewModelProvider(activity ?: this).get(ResultViewModel::class.java) observeDirectly(viewModel.episodes) { _episodes -> episodes = _episodes diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt index 382ceb01..caa9009b 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt @@ -23,7 +23,7 @@ import androidx.core.text.color import androidx.core.view.isVisible import androidx.core.widget.NestedScrollView import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProvider +import androidx.fragment.app.activityViewModels import androidx.preference.PreferenceManager import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -165,7 +165,7 @@ class ResultFragment : Fragment() { } private var currentLoadingCount = 0 // THIS IS USED TO PREVENT LATE EVENTS, AFTER DISMISS WAS CLICKED - private lateinit var viewModel: ResultViewModel + private val viewModel: ResultViewModel by activityViewModels() private var allEpisodes: HashMap> = HashMap() private var allEpisodesSubs: HashMap> = HashMap() private var currentHeaderName: String? = null @@ -178,8 +178,8 @@ class ResultFragment : Fragment() { container: ViewGroup?, savedInstanceState: Bundle?, ): View? { - viewModel = - ViewModelProvider(activity ?: this).get(ResultViewModel::class.java) + // viewModel = + // ViewModelProvider(activity ?: this).get(ResultViewModel::class.java) return inflater.inflate(R.layout.fragment_result, container, false) } @@ -1161,6 +1161,7 @@ class ResultFragment : Fragment() { } if (restart || viewModel.resultResponse.value == null) { + viewModel.clear() viewModel.load(ctx, tempUrl, apiName, showFillers) } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel.kt index c6a09143..02f21e2d 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel.kt @@ -37,6 +37,22 @@ const val EPISODE_RANGE_SIZE = 50 const val EPISODE_RANGE_OVERLOAD = 60 class ResultViewModel : ViewModel() { + fun clear() { + repo = null + _resultResponse.value = null + _episodes.value = null + episodeById.value = null + _publicEpisodes.value = null + _publicEpisodesCount.value = null + _rangeOptions.value = null + selectedRange.value = null + selectedRangeInt.value = null + _dubStatus.value = null + id.value = null + selectedSeason.value = -2 + _dubSubEpisodes.value = null + } + private var repo: APIRepository? = null private val _resultResponse: MutableLiveData> = MutableLiveData() @@ -55,7 +71,7 @@ class ResultViewModel : ViewModel() { val publicEpisodes: LiveData>> get() = _publicEpisodes val publicEpisodesCount: LiveData get() = _publicEpisodesCount - val dubStatus: MutableLiveData get() = _dubStatus + val dubStatus: LiveData get() = _dubStatus private val _dubStatus: MutableLiveData = MutableLiveData() private val page: MutableLiveData = MutableLiveData() @@ -63,10 +79,10 @@ class ResultViewModel : ViewModel() { val selectedSeason: MutableLiveData = MutableLiveData(-2) val seasonSelections: MutableLiveData> = MutableLiveData() - val dubSubSelections: MutableLiveData> get() = _dubSubSelections + val dubSubSelections: LiveData> get() = _dubSubSelections private val _dubSubSelections: MutableLiveData> = MutableLiveData() - val dubSubEpisodes: MutableLiveData>?> get() = _dubSubEpisodes + val dubSubEpisodes: LiveData>?> get() = _dubSubEpisodes private val _dubSubEpisodes: MutableLiveData>?> = MutableLiveData() private val _watchStatus: MutableLiveData = MutableLiveData() @@ -180,7 +196,7 @@ class ResultViewModel : ViewModel() { fun changeDubStatus(context: Context, status: DubStatus?) { dubSubEpisodes.value?.get(status)?.let { episodes -> - dubStatus.postValue(status) + _dubStatus.postValue(status) updateEpisodes(context, null, episodes, null) } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt index f342ce93..e5f7550b 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt @@ -29,6 +29,9 @@ import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.network.initRequestClient import com.lagradost.cloudstream3.ui.APIRepository import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment +import com.lagradost.cloudstream3.utils.AppUtils +import com.lagradost.cloudstream3.utils.DataStore.setKey +import com.lagradost.cloudstream3.utils.HOMEPAGE_API import com.lagradost.cloudstream3.utils.InAppUpdater.Companion.runAutoUpdate import com.lagradost.cloudstream3.utils.Qualities import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog @@ -203,8 +206,7 @@ class SettingsFragment : PreferenceFragmentCompat() { return@setOnPreferenceClickListener true } - - + fun getDownloadDirs(): List { val defaultDir = getDownloadDir()?.filePath @@ -246,29 +248,29 @@ class SettingsFragment : PreferenceFragmentCompat() { } return@setOnPreferenceClickListener true } + + preferedMediaTypePreference.setOnPreferenceClickListener { + val prefNames = resources.getStringArray(R.array.media_type_pref) + val prefValues = resources.getIntArray(R.array.media_type_pref_values) + val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) - if (preferedMediaTypePreference != null) { - preferedMediaTypePreference.setOnPreferenceClickListener { - val prefNames = resources.getStringArray(R.array.media_type_pref) - val prefValues = resources.getIntArray(R.array.media_type_pref_values) - val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) + val currentPrefMedia = + settingsManager.getInt(getString(R.string.preferred_media_settings), 0) - val currentPrefMedia = - settingsManager.getInt(getString(R.string.preferred_media_settings), 0) - - context?.showBottomDialog( - prefNames.toList(), - prefValues.indexOf(currentPrefMedia), - getString(R.string.preferred_media_settings), - true, - {}) { - settingsManager.edit() - .putInt(getString(R.string.preferred_media_settings), prefValues[it]) - .apply() - context?.initRequestClient() - } - return@setOnPreferenceClickListener true + context?.showBottomDialog( + prefNames.toList(), + prefValues.indexOf(currentPrefMedia), + getString(R.string.preferred_media_settings), + true, + {}) { + settingsManager.edit() + .putInt(getString(R.string.preferred_media_settings), prefValues[it]) + .apply() + val apiRandom = AppUtils.filterProviderByPreferredMedia(apis, prefValues[it]).random() + context?.setKey(HOMEPAGE_API, apiRandom.name) + context?.initRequestClient() } + return@setOnPreferenceClickListener true } allLayoutPreference.setOnPreferenceClickListener { diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/AppUtils.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/AppUtils.kt index 03089644..c4fd1b9e 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/AppUtils.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/AppUtils.kt @@ -18,8 +18,10 @@ import com.google.android.gms.cast.framework.CastState import com.google.android.gms.common.ConnectionResult import com.google.android.gms.common.GoogleApiAvailability import com.google.android.gms.common.wrappers.Wrappers +import com.lagradost.cloudstream3.MainAPI import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.SearchResponse +import com.lagradost.cloudstream3.TvType import com.lagradost.cloudstream3.ui.result.ResultFragment import com.lagradost.cloudstream3.utils.UIHelper.navigate @@ -75,9 +77,11 @@ object AppUtils { return "" } + //private val viewModel: ResultViewModel by activityViewModels() + fun AppCompatActivity.loadResult(url: String, apiName: String, startAction: Int = 0, startValue: Int = 0) { this.runOnUiThread { - viewModelStore.clear() + // viewModelStore.clear() this.navigate(R.id.global_to_navigation_results, ResultFragment.newInstance(url, apiName, startAction, startValue)) } } @@ -184,4 +188,19 @@ object AppUtils { } return currentAudioFocusRequest } + + fun filterProviderByPreferredMedia(apis: ArrayList, currentPrefMedia: Int): List { + val allApis = apis.filter { api -> api.hasMainPage } + return if (currentPrefMedia < 1) { + allApis + } else { + // Filter API depending on preferred media type + val listEnumAnime = listOf(TvType.Anime, TvType.AnimeMovie, TvType.ONA) + val listEnumMovieTv = listOf(TvType.Movie, TvType.TvSeries, TvType.Cartoon) + val mediaTypeList = if (currentPrefMedia==1) listEnumMovieTv else listEnumAnime + + val filteredAPI = allApis.filter { api -> api.supportedTypes.any { it in mediaTypeList } } + filteredAPI + } + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_baseline_play_arrow_24.xml b/app/src/main/res/drawable/ic_baseline_play_arrow_24.xml index 0870be8f..f880379f 100644 --- a/app/src/main/res/drawable/ic_baseline_play_arrow_24.xml +++ b/app/src/main/res/drawable/ic_baseline_play_arrow_24.xml @@ -1,4 +1,4 @@ - diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index b7b0d60d..1f0b805c 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -25,16 +25,16 @@ + android:layout_height="70dp"> @@ -146,9 +146,9 @@ android:layout_gravity="center|end" android:background="?android:attr/selectableItemBackgroundBorderless" - android:src="@drawable/ic_outline_settings_24" - android:layout_width="25dp" - android:layout_height="25dp" + android:src="@drawable/ic_baseline_keyboard_arrow_down_24" + android:layout_width="30dp" + android:layout_height="30dp" android:contentDescription="@string/home_change_provider_img_des"> diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml index 86edbcc2..f5d7f56b 100644 --- a/app/src/main/res/values-tl/strings.xml +++ b/app/src/main/res/values-tl/strings.xml @@ -7,192 +7,192 @@ %s Ep %d - Paskil + Poster @string/result_poster_img_des - Episodyo Paskil - Pangunahing Paskil - Susunod Walang tiyak - Pumunta Likod - Pagbabago Pinagmulan - Prebiyu Likuran + Episode Poster + Main Poster + Next Random + Go back + Change Provider + Preview Background - Tulin (%.2fx) - Tantiyahin: %.1f - Bago magpabago itatag!\n%s -> %s - (Sobra) %s + Bilis (%.2fx) + Rated: %.1f + Bagong update!\n%s -> %s + (Filler) %s CloudStream - Simula - Hanapin - Itabi - Kagustuhan + Home + Maghanap + Mga Downloads + Mga Settings - Hanapin… - Wala Datos - Mas Opsyon - Susunod Episodyo - Dyanra - Magbahagi - Buksan Ito Panlabas - Laktawan Pagkarga - Pagkarga… + Maghanap… + Walang datos + Opsyon + Susunod na Episode + Genres + I-share + Buksan sa browser + Skip Loading… + Loading… - Magbantay - Sa-Humawak - Tapos - Bumagsak + Pinapanood + Inihinto + Tapos nang panoorin + Ayaw nang panoorin Balak panoorin - Wala + None - Laruin Pelikula - Laruin Torrent - Pinagmulan - pangalawang pamagat - Subukan muli… - Pumunta Likod - Laruin Episodyo + I-play ang Movie + Stream Torrent + Sources + Subtitles + Retry connection… + Go back + I-play ang episode - Itabi - Na naka-imbak - Pag-iimbak - Pag-iimbak humawak - Pag-iimbak - Pag-iimbak nabigo - Pag-iimbak Kinansela - Tapos + Download + Downloaded + Downloading + Download Paused + Download Started + Download Failed + Download Canceled + Download Done - Kamalian - Espasyo sa Imbakan + Error Loading Links + Internal Storage Dub Sub - Alisin - Laruin - Ipagpatuloy - Tumigil Sandali + I-delete ang file + I-play ang file + I-resume ang download + I-pause ang download - Huwag Paganahin ang Awtomatikong Pag-uulat ng Bug - Mas Impormasyon + Huwag awtomatikong mag-ulat ng bug + More Info Itago - Laruin + I-play Impormasyon - Salain ang mga Bookmark + Filter Bookmarks Bookmark Tanggalin - Gamitin + Kumpirmahin Kanselahin - Silis ng Playback + Bilis ng Playback - Pangalawang Pamagat Kagustuhan + Subtitle Setting Kulay ng Teksto - Kulay ng Balangkas + Kulay ng Outline Kulay ng Background - Kulay ng Bintana - Uri ng Gilid - Pangalawang Pamagat Kataasan - Font Estilio - Font Laki + Window Color + Edge Type + Subtitle Elevation + Istilo ng Font + Laki ng Font - Paghahanap gamit ang pinagmulan - Paghahanap gamit ang uri + Search using providers + Search using types - %d Benenes ibinigay sa devs - Wala Benenes binigay + %d Benenes na ibinigay sa mga devs + Walang Benenes na binigay - Awtomatikong pilin ang wika - Itabi Wika + Awtomatikong magpili ng lenggwahe + Download Languages Pindutin nang matagal upang i-reset sa default - Magpatuloy + Ipagpatuloy ang pinapanood Tanggalin - Mas impormasyon + Impormasyon - Maaaring kailanganin ang isang VPN upang gumana ito ng tama. - Ito ay torrent, Inirerekomenda ang isang VPN - Paglalarawan - Walang nahanap na impormasyon - Walang nahanap na paglalarawan + Maaaring nangangailangan gumamit ng VPN upang gumana ito + Ito ay torrent, inirerekomenda ang paggamit ng VPN + Deskripsyon + Walang nakitang plot + Walang nakitang deskripsyon - Larawan-sa-Larawan - Nagpapatuloy sa pag-playback sa isang maliit na manlalaro sa itaas - Pindutan na baguhin ang laki - Alisin ang mga itim na hangganan - Pangalawang Pamagat - Pangalawang Pamagat Kagustuhan + Picture-in-picture + Nagpapatuloy ang playback sa isang maliit na player sa itaas ng ibang apps + Pindutan upang baguhin ang laki + Alisin ang black borders + Subtitles + Player subtitles settings Eigengravy Mode - Nagdadagdag ng bilis kagustuhan - Palo sa maghanap - Palo sa Kaliwa o Kanan sa kontrolin ang oras sa - Palo sa magbago kagustuhan - Palo sa Kaliwa o Kanan sa magbago ningning o dami - Doble tapikin sa magnahap - Doble tapikin sa kaliwa o kanan panig sa gumalaw pasulong o paatras - Gamitin sistema ningning - Gamitin sistemo liwanag sa halip na madilim kalupkop + Nagdadagdag ng opsyon sa player upang baguhin ang bilis ng pinapanood + Swipe to seek + Swipe pakanan o pakaliwa upang makontrol ang oras ng pinapanood + Swipe to change settings + Swipe pataas/pababa sa kanan o kaliwang bahagi ng player upang dagdagan/bawasan ang brightness/volume + Double tap to seek + Tapikin ng dalawang beses sa kanan o kaliwang bahagi ng player upang mag-forward/backward + Gamitin ang brightness ng system + Gamitin ang brightness ng system para sa player - Paghahanap + Maghanap Impormasyon - Pinahusay paghahanap - Nagbibigay sa iyo ng mga resulta ng paghahanap na pinaghihiwalay ng mga pinagmulan - Nagpapadala lamang ng ulat tungkol sa pagkabigo - Hindi nagpapadala ng ulat - Magpakita sobra episodyo para sa anime - Magpakita magpabago - Awtomatikong maghanap ng bago sa simula - Magpabago sa pang-eksperimentong paglabas - Maghanap lamang ng pang-eksperimentong paglabas + Adbans na maghanap + Magbibigay ng pinaghiwa-hiwalay na resulta + Nagpapadala lamang ng data kung nag-crash ang app + Hindi magpapadala ng kahit anong data + Ipakita ang filler episode sa anime + Ipakita kung may bagong update + Awtomatikong mag-check ng bagong update pagbukas ng app + Update to prereleases + Search for prerelease updates instead of full releases only Github - Light novel app ng parehong koponan - Anime app ng parehong koponan - Jumali Discord + Light novel app ng parehong devs + Anime app ng parehong devs + Sumali sa Discord Magbigay ng benene sa ang devs Sumali benene Wika - Ito pinagmulan may hindi chromecast suporta - Walang nakitang laruin - Kinopya - Laruin Episodyo - I-reset sa default - Ipinadala ang ulat ng pag-crash + Walang chromecast support ang provider na ito + Walang link na nakita + Link copied to clipboard + Play Episode + I-reset sa default value + Paumanhin, ang app ay nag-crash. Isang anonymous bug report ang ipapadala sa developers - Bahagi - Hindi Bahagi - Episodyo - Episodyo - B + Season + No season + Episode + Episodes + S E - Tanggalin + Burahin ang file Tanggalin - Humawak - Magpatuloy - Permanenteng tatanggalin %s\nSigurado ka ba? + I-pause + I-resume + This will permanently delete %s\nAre you sure? - Nagpapatuloy - Nakumpleto + Patuloy + Tapos na Katayuan Taon Marka Tagal - Lugar + Site Sinopsis nakapila walang subtitles Default - Walang laman - Ginamit + Bakante + Gamit App Pelikula Palabas sa TV - Kartun + Cartoons Anime Torrent @@ -202,43 +202,43 @@ Unexpected player error Download error, check storage permissions - Chromecast Episodyo - Chromecast Kahalili - Laruin sa App - Laruin sa VLC - Laruin sa browser - Kopya Link - Awto pag-download - Pag-download kahalili + Chromecast Episode + Chromecast Mirror + I-play sa App + I-play sa VLC + I-play sa browser + Kopyahin ang Link + Awtomatiking i-download + Download mirror Subukan muli - Wala itatag - Siyasatin para sa magpabago + Walang bagong update + Tingnan kung may bagong update - Kandado - Laki - Pinagmulan - Laktawan OP + I-lock + Palakihin + Source + Skip OP - Wag ka nang magpakita ulit - Magpabago - Ginustong kalidas + Huwag nang ipakita ulit + Update + Preferred watch quality DNS over HTTPS - Mahusay gamitin sa pag-bypass ISP sagabal + Mainam gamitin sa pag-bypass ng ISP blocks - Magpakita Dubbed/Subbed Anime + Display Dubbed/Subbed Anime - Pinakamainam - Palakihin - Magpalaki + Fit to screen + Punan ang buong screen + Zoom Pangkalahatan - Pinagmulan wika - App Ayos - Automatiko - Telebisyon Ayos - Phone Ayos + Lenggwahe ng Provider + App Layout + Awtomatik + TV Layout + Phone Layout Pangunahin Kulay - App Tema - Ginustong Nilalaman + Tema ng app + Preferred Media