forked from recloudstream/cloudstream
		
	fixed #652 (downloaded subtitles) and migration tool
This commit is contained in:
		
							parent
							
								
									59b0dc988b
								
							
						
					
					
						commit
						cd6c79b961
					
				
					 7 changed files with 61 additions and 34 deletions
				
			
		|  | @ -124,7 +124,7 @@ class WcoProvider : MainAPI() { | ||||||
| 
 | 
 | ||||||
|         while (!document.select(".pagination").isEmpty()) { |         while (!document.select(".pagination").isEmpty()) { | ||||||
|             val link = document.select("a.page-link[rel=\"next\"]") |             val link = document.select("a.page-link[rel=\"next\"]") | ||||||
|             if (!link.isEmpty()) { |             if (!link.isEmpty() && returnValue.size < 40) { | ||||||
|                 val extraResponse = app.get(fixUrl(link[0].attr("href"))).text |                 val extraResponse = app.get(fixUrl(link[0].attr("href"))).text | ||||||
|                 document = Jsoup.parse(extraResponse) |                 document = Jsoup.parse(extraResponse) | ||||||
|                 returnValue.addAll(parseSearchPage(document)) |                 returnValue.addAll(parseSearchPage(document)) | ||||||
|  | @ -132,7 +132,7 @@ class WcoProvider : MainAPI() { | ||||||
|                 break |                 break | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         return returnValue |         return returnValue.distinctBy { it.url } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     override suspend fun quickSearch(query: String): List<SearchResponse> { |     override suspend fun quickSearch(query: String): List<SearchResponse> { | ||||||
|  |  | ||||||
|  | @ -129,8 +129,7 @@ object DownloadButtonSetup { | ||||||
|                                         displayName = keyInfo.displayName, |                                         displayName = keyInfo.displayName, | ||||||
|                                         relativePath = keyInfo.relativePath, |                                         relativePath = keyInfo.relativePath, | ||||||
|                                     ) |                                     ) | ||||||
|                                 ), |                                 ) | ||||||
|                                 0 |  | ||||||
|                             ) |                             ) | ||||||
|                         ) |                         ) | ||||||
|                         //R.id.global_to_navigation_player, PlayerFragment.newInstance( |                         //R.id.global_to_navigation_player, PlayerFragment.newInstance( | ||||||
|  |  | ||||||
|  | @ -43,11 +43,23 @@ class ParentItemAdapter( | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fun updateList(newList: List<HomePageList>) { |     fun updateList(newList: List<HomePageList>) { | ||||||
|  |         // this moves all bad results to the bottom | ||||||
|  |         val endList = mutableListOf<HomePageList>() | ||||||
|  |         val newFilteredList = mutableListOf<HomePageList>() | ||||||
|  |         for (item in newList) { | ||||||
|  |             if(item.list.isEmpty()) { | ||||||
|  |                 endList.add(item) | ||||||
|  |             } else { | ||||||
|  |                 newFilteredList.add(item) | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         newFilteredList.addAll(endList) | ||||||
|  | 
 | ||||||
|         val diffResult = DiffUtil.calculateDiff( |         val diffResult = DiffUtil.calculateDiff( | ||||||
|             SearchDiffCallback(this.items, newList)) |             SearchDiffCallback(this.items, newFilteredList)) | ||||||
| 
 | 
 | ||||||
|         items.clear() |         items.clear() | ||||||
|         items.addAll(newList) |         items.addAll(newFilteredList) | ||||||
| 
 | 
 | ||||||
|         diffResult.dispatchUpdatesTo(this) |         diffResult.dispatchUpdatesTo(this) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -120,14 +120,13 @@ class CS3IPlayer : IPlayer { | ||||||
|                 Handler(it).post { |                 Handler(it).post { | ||||||
|                     try { |                     try { | ||||||
|                         seekTime(1L) |                         seekTime(1L) | ||||||
|                     } catch (e : Exception) { |                     } catch (e: Exception) { | ||||||
|                         logError(e) |                         logError(e) | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } catch (e : Exception) { |             } catch (e: Exception) { | ||||||
|                 logError(e) |                 logError(e) | ||||||
|             } |             } | ||||||
| 
 |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -287,7 +286,7 @@ class CS3IPlayer : IPlayer { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     companion object { |     companion object { | ||||||
|         var requestSubtitleUpdate : (() -> Unit)? = null |         var requestSubtitleUpdate: (() -> Unit)? = null | ||||||
| 
 | 
 | ||||||
|         private fun createOnlineSource(link: ExtractorLink): DataSource.Factory { |         private fun createOnlineSource(link: ExtractorLink): DataSource.Factory { | ||||||
|             // Because Trailers.to seems to fail with http/1.1 the normal one uses. |             // Because Trailers.to seems to fail with http/1.1 the normal one uses. | ||||||
|  | @ -660,8 +659,8 @@ class CS3IPlayer : IPlayer { | ||||||
|             val offlineSourceFactory = context.createOfflineSource() |             val offlineSourceFactory = context.createOfflineSource() | ||||||
| 
 | 
 | ||||||
|             val (subSources, activeSubtitles) = getSubSources( |             val (subSources, activeSubtitles) = getSubSources( | ||||||
|                 offlineSourceFactory, |                 onlineSourceFactory = offlineSourceFactory, | ||||||
|                 offlineSourceFactory, |                 offlineSourceFactory = offlineSourceFactory, | ||||||
|                 subtitleHelper, |                 subtitleHelper, | ||||||
|             ) |             ) | ||||||
| 
 | 
 | ||||||
|  | @ -740,8 +739,8 @@ class CS3IPlayer : IPlayer { | ||||||
|             val offlineSourceFactory = context.createOfflineSource() |             val offlineSourceFactory = context.createOfflineSource() | ||||||
| 
 | 
 | ||||||
|             val (subSources, activeSubtitles) = getSubSources( |             val (subSources, activeSubtitles) = getSubSources( | ||||||
|                 offlineSourceFactory, |                 onlineSourceFactory = onlineSourceFactory, | ||||||
|                 onlineSourceFactory, |                 offlineSourceFactory = offlineSourceFactory, | ||||||
|                 subtitleHelper |                 subtitleHelper | ||||||
|             ) |             ) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -12,6 +12,8 @@ import androidx.fragment.app.Fragment | ||||||
| import androidx.fragment.app.activityViewModels | import androidx.fragment.app.activityViewModels | ||||||
| import androidx.recyclerview.widget.GridLayoutManager | import androidx.recyclerview.widget.GridLayoutManager | ||||||
| import androidx.recyclerview.widget.RecyclerView | import androidx.recyclerview.widget.RecyclerView | ||||||
|  | import com.lagradost.cloudstream3.APIHolder.apis | ||||||
|  | import com.lagradost.cloudstream3.APIHolder.getApiProviderLangSettings | ||||||
| import com.lagradost.cloudstream3.HomePageList | import com.lagradost.cloudstream3.HomePageList | ||||||
| import com.lagradost.cloudstream3.R | import com.lagradost.cloudstream3.R | ||||||
| import com.lagradost.cloudstream3.mvvm.Resource | import com.lagradost.cloudstream3.mvvm.Resource | ||||||
|  | @ -34,7 +36,16 @@ class QuickSearchFragment(var isMainApis: Boolean = false) : Fragment() { | ||||||
|         fun pushSearch(activity: Activity?, autoSearch: String? = null) { |         fun pushSearch(activity: Activity?, autoSearch: String? = null) { | ||||||
|             activity.navigate(R.id.global_to_navigation_quick_search, Bundle().apply { |             activity.navigate(R.id.global_to_navigation_quick_search, Bundle().apply { | ||||||
|                 putBoolean("mainapi", true) |                 putBoolean("mainapi", true) | ||||||
|                 putString("autosearch", autoSearch) |                 autoSearch?.let { | ||||||
|  |                     putString( | ||||||
|  |                         "autosearch", | ||||||
|  |                         it.trim() | ||||||
|  |                             .removeSuffix("(DUB)") | ||||||
|  |                             .removeSuffix("(SUB)") | ||||||
|  |                             .removeSuffix("(Dub)") | ||||||
|  |                             .removeSuffix("(Sub)").trim() | ||||||
|  |                     ) | ||||||
|  |                 } | ||||||
|             }) |             }) | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | @ -120,18 +131,24 @@ class QuickSearchFragment(var isMainApis: Boolean = false) : Fragment() { | ||||||
|             }) |             }) | ||||||
| 
 | 
 | ||||||
|         val searchExitIcon = |         val searchExitIcon = | ||||||
|             quick_search.findViewById<ImageView>(androidx.appcompat.R.id.search_close_btn) |             quick_search?.findViewById<ImageView>(androidx.appcompat.R.id.search_close_btn) | ||||||
|         val searchMagIcon = |         val searchMagIcon = | ||||||
|             quick_search.findViewById<ImageView>(androidx.appcompat.R.id.search_mag_icon) |             quick_search?.findViewById<ImageView>(androidx.appcompat.R.id.search_mag_icon) | ||||||
| 
 | 
 | ||||||
|         searchMagIcon.scaleX = 0.65f |         searchMagIcon?.scaleX = 0.65f | ||||||
|         searchMagIcon.scaleY = 0.65f |         searchMagIcon?.scaleY = 0.65f | ||||||
|         quick_search.setOnQueryTextListener(object : SearchView.OnQueryTextListener { |         quick_search?.setOnQueryTextListener(object : SearchView.OnQueryTextListener { | ||||||
|             override fun onQueryTextSubmit(query: String): Boolean { |             override fun onQueryTextSubmit(query: String): Boolean { | ||||||
|  |                 val active = if (isMainApis) { | ||||||
|  |                     val langs = context?.getApiProviderLangSettings() | ||||||
|  |                     apis.filter { langs?.contains(it.lang) == true }.map { it.name }.toSet() | ||||||
|  |                 } else emptySet() | ||||||
|  | 
 | ||||||
|                 searchViewModel.searchAndCancel( |                 searchViewModel.searchAndCancel( | ||||||
|                     query = query, |                     query = query, | ||||||
|                     isMainApis = isMainApis, |                     isMainApis = isMainApis, | ||||||
|                     ignoreSettings = true |                     ignoreSettings = false, | ||||||
|  |                     providersActive = active | ||||||
|                 ) |                 ) | ||||||
|                 quick_search?.let { |                 quick_search?.let { | ||||||
|                     UIHelper.hideKeyboard(it) |                     UIHelper.hideKeyboard(it) | ||||||
|  | @ -152,26 +169,26 @@ class QuickSearchFragment(var isMainApis: Boolean = false) : Fragment() { | ||||||
|                 is Resource.Success -> { |                 is Resource.Success -> { | ||||||
|                     it.value.let { data -> |                     it.value.let { data -> | ||||||
|                         if (data.isNotEmpty()) { |                         if (data.isNotEmpty()) { | ||||||
|                             (search_autofit_results?.adapter as SearchAdapter?)?.updateList(data) |                             (search_autofit_results?.adapter as? SearchAdapter?)?.updateList(data) | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                     searchExitIcon.alpha = 1f |                     searchExitIcon?.alpha = 1f | ||||||
|                     quick_search_loading_bar.alpha = 0f |                     quick_search_loading_bar?.alpha = 0f | ||||||
|                 } |                 } | ||||||
|                 is Resource.Failure -> { |                 is Resource.Failure -> { | ||||||
|                     // Toast.makeText(activity, "Server error", Toast.LENGTH_LONG).show() |                     // Toast.makeText(activity, "Server error", Toast.LENGTH_LONG).show() | ||||||
|                     searchExitIcon.alpha = 1f |                     searchExitIcon?.alpha = 1f | ||||||
|                     quick_search_loading_bar.alpha = 0f |                     quick_search_loading_bar?.alpha = 0f | ||||||
|                 } |                 } | ||||||
|                 is Resource.Loading -> { |                 is Resource.Loading -> { | ||||||
|                     searchExitIcon.alpha = 0f |                     searchExitIcon?.alpha = 0f | ||||||
|                     quick_search_loading_bar.alpha = 1f |                     quick_search_loading_bar?.alpha = 1f | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         quick_search_master_recycler.adapter = masterAdapter |         quick_search_master_recycler?.adapter = masterAdapter | ||||||
|         quick_search_master_recycler.layoutManager = GridLayoutManager(context, 1) |         quick_search_master_recycler?.layoutManager = GridLayoutManager(context, 1) | ||||||
| 
 | 
 | ||||||
|         //quick_search.setOnQueryTextFocusChangeListener { _, b -> |         //quick_search.setOnQueryTextFocusChangeListener { _, b -> | ||||||
|         //    if (b) { |         //    if (b) { | ||||||
|  | @ -185,7 +202,7 @@ class QuickSearchFragment(var isMainApis: Boolean = false) : Fragment() { | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         arguments?.getString("autosearch")?.let { |         arguments?.getString("autosearch")?.let { | ||||||
|             quick_search.setQuery(it, true) |             quick_search?.setQuery(it, true) | ||||||
|             arguments?.remove("autosearch") |             arguments?.remove("autosearch") | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -223,7 +223,7 @@ class EpisodeAdapter( | ||||||
|                         card.episode, |                         card.episode, | ||||||
|                         card.season, |                         card.season, | ||||||
|                         card.id, |                         card.id, | ||||||
|                         0, |                         card.parentId, | ||||||
|                         card.rating, |                         card.rating, | ||||||
|                         card.description, |                         card.description, | ||||||
|                         System.currentTimeMillis(), |                         System.currentTimeMillis(), | ||||||
|  |  | ||||||
|  | @ -118,7 +118,7 @@ data class ResultEpisode( | ||||||
|     val description: String?, |     val description: String?, | ||||||
|     val isFiller: Boolean?, |     val isFiller: Boolean?, | ||||||
|     val tvType: TvType, |     val tvType: TvType, | ||||||
|     val parentId: Int?, |     val parentId: Int, | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| fun ResultEpisode.getRealPosition(): Long { | fun ResultEpisode.getRealPosition(): Long { | ||||||
|  | @ -151,7 +151,7 @@ fun buildResultEpisode( | ||||||
|     description: String?, |     description: String?, | ||||||
|     isFiller: Boolean?, |     isFiller: Boolean?, | ||||||
|     tvType: TvType, |     tvType: TvType, | ||||||
|     parentId: Int?, |     parentId: Int, | ||||||
| ): ResultEpisode { | ): ResultEpisode { | ||||||
|     val posDur = getViewPos(id) |     val posDur = getViewPos(id) | ||||||
|     return ResultEpisode( |     return ResultEpisode( | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue