Skip to content

Commit

Permalink
finally getting m3u8 url ( it's fixed) ^^
Browse files Browse the repository at this point in the history
  • Loading branch information
kl3jvi committed Jan 17, 2022
1 parent e575b29 commit 178400d
Show file tree
Hide file tree
Showing 18 changed files with 232 additions and 176 deletions.
17 changes: 17 additions & 0 deletions .idea/deploymentTargetDropDown.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 11 additions & 6 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -93,14 +93,14 @@ dependencies {
// Coroutine Lifecycle Scopes
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0'
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0"
implementation 'com.google.firebase:firebase-analytics-ktx:20.0.0'
implementation 'com.google.firebase:firebase-crashlytics-ktx:18.2.5'
implementation 'com.google.firebase:firebase-analytics-ktx:20.0.2'
implementation 'com.google.firebase:firebase-crashlytics-ktx:18.2.6'
implementation 'androidx.test.ext:junit-ktx:1.1.3'
androidTestImplementation 'junit:junit:4.13.2'

//dependency injection
kapt "com.google.dagger:hilt-android-compiler:2.38.1"
implementation "com.google.dagger:hilt-android:2.40"
implementation "com.google.dagger:hilt-android:2.40.5"

// Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
Expand All @@ -113,7 +113,7 @@ dependencies {
implementation 'androidx.legacy:legacy-support-v4:1.0.0'

//Room Library
def room_version = '2.4.0-beta02'
def room_version = '2.4.1'
implementation "androidx.room:room-ktx:$room_version"
kapt "androidx.room:room-compiler:$room_version"

Expand All @@ -128,7 +128,7 @@ dependencies {
implementation 'com.ms-square:expandableTextView:0.1.4'

//animation lib
def lottieVersion = '4.1.0'
def lottieVersion = '4.2.2'
implementation "com.airbnb.android:lottie:$lottieVersion"

// image library
Expand All @@ -138,7 +138,7 @@ dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

//splash screen
implementation "androidx.core:core-splashscreen:1.0.0-alpha02"
implementation "androidx.core:core-splashscreen:1.0.0-beta01"

implementation 'com.onesignal:OneSignal:4.6.2'

Expand All @@ -147,4 +147,9 @@ dependencies {

implementation 'org.apache.commons:commons-text:1.7'

def paginationVersion = "3.1.0"
implementation "androidx.paging:paging-runtime-ktx:$paginationVersion"
implementation 'com.maxkeppeler.sheets:options:2.2.6'


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.kl3jvi.animity.data.paging

import androidx.paging.PagingSource
import androidx.paging.PagingState
import com.kl3jvi.animity.data.model.AnimeMetaModel
import com.kl3jvi.animity.data.network.AnimeApiClient
import com.kl3jvi.animity.utils.Constants
import com.kl3jvi.animity.utils.Constants.Companion.STARTING_PAGE_INDEX
import com.kl3jvi.animity.utils.Constants.Companion.getHeader
import com.kl3jvi.animity.utils.parser.HtmlParser

class SearchPagingSource(
private val animeService: AnimeApiClient,
private val query: String
) : PagingSource<Int, AnimeMetaModel>() {
override fun getRefreshKey(state: PagingState<Int, AnimeMetaModel>): Int? {
return state.anchorPosition?.let { anchorPosition ->
state.closestPageToPosition(anchorPosition)?.prevKey
}
}

override suspend fun load(params: LoadParams<Int>): LoadResult<Int, AnimeMetaModel> {
val page = params.key ?: STARTING_PAGE_INDEX
return try {
val searchList = HtmlParser.parseMovie(
animeService.fetchSearchData(
header = getHeader(),
keyword = query,
page = page
).string(),
Constants.TYPE_SEARCH
)
LoadResult.Page(
data = searchList,
prevKey = if (page == STARTING_PAGE_INDEX) null else page - 1,
nextKey = if (searchList.isNullOrEmpty()) null else page + 1
)
} catch (exception: Exception) {
exception.printStackTrace()
LoadResult.Error(exception)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.kl3jvi.animity.data.repository
import com.kl3jvi.animity.data.model.EpisodeInfo
import com.kl3jvi.animity.data.network.AnimeApiClient
import com.kl3jvi.animity.domain.repositories.PlayerRepository
import com.kl3jvi.animity.utils.Constants.Companion.REFERER
import com.kl3jvi.animity.utils.parser.HtmlParser
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext
Expand All @@ -25,18 +26,22 @@ class PlayerRepositoryImpl @Inject constructor(
parser.parseMediaUrl(apiClient.fetchEpisodeMediaUrl(header = header, url = url).string())
}


override suspend fun fetchM3u8Url(header: Map<String, String>, url: String): String =
override suspend fun fetchM3u8Url(
header: Map<String, String>,
url: String
): Pair<ArrayList<String>, ArrayList<String>> =
withContext(ioDispatcher) {
parser.parseEncryptAjax(apiClient.fetchM3u8Url(header = header, url = url).string()) ?: ""
parser.parseEncryptedUrls(apiClient.fetchM3u8PreProcessor(header = header, url = url).string())
}

override suspend fun fetchEncryptedAjaxUrl(header: Map<String, String>, url: String): String =
withContext(ioDispatcher) {
parser.parseEncryptAjax(
apiClient.fetchM3u8PreProcessor(header = header, url = url).string()
apiClient.fetchM3u8Url(
header = header,
url = url
).string()
)
}

}

Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package com.kl3jvi.animity.data.repository

import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.PagingData
import com.kl3jvi.animity.data.paging.SearchPagingSource
import com.kl3jvi.animity.data.model.AnimeMetaModel
import com.kl3jvi.animity.data.network.AnimeApiClient
import com.kl3jvi.animity.domain.repositories.SearchRepository
import com.kl3jvi.animity.utils.Constants.Companion.TYPE_SEARCH
import com.kl3jvi.animity.utils.parser.HtmlParser
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOn
import javax.inject.Inject
import javax.inject.Singleton

Expand All @@ -16,21 +19,19 @@ class SearchRepositoryImpl @Inject constructor(
private val apiClient: AnimeApiClient,
private val ioDispatcher: CoroutineDispatcher
) : SearchRepository {
override val parser: HtmlParser
get() = HtmlParser

override suspend fun fetchSearchData(
override fun fetchSearchData(
header: Map<String, String>,
keyword: String,
page: Int
): List<AnimeMetaModel> = withContext(ioDispatcher) {
parser.parseMovie(
apiClient.fetchSearchData(
header = header,
keyword = keyword,
page = page
).string(),
TYPE_SEARCH
)
): Flow<PagingData<AnimeMetaModel>> {
return Pager(
config = PagingConfig(enablePlaceholders = false, pageSize = NETWORK_PAGE_SIZE),
pagingSourceFactory = { SearchPagingSource(apiClient, keyword) }
).flow.flowOn(ioDispatcher)
}

companion object {
const val NETWORK_PAGE_SIZE = 20
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ import com.kl3jvi.animity.utils.parser.HtmlParser
interface PlayerRepository {
val parser: HtmlParser
suspend fun fetchEpisodeMediaUrl(header: Map<String, String>, url: String): EpisodeInfo
suspend fun fetchM3u8Url(header: Map<String, String>, url: String):String
suspend fun fetchM3u8Url(header: Map<String, String>, url: String):Pair<ArrayList<String>,ArrayList<String>>
suspend fun fetchEncryptedAjaxUrl(header: Map<String, String>, url: String):String
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package com.kl3jvi.animity.domain.repositories

import androidx.paging.PagingData
import com.kl3jvi.animity.data.model.AnimeMetaModel
import com.kl3jvi.animity.utils.parser.HtmlParser
import kotlinx.coroutines.flow.Flow

interface SearchRepository {
val parser: HtmlParser
suspend fun fetchSearchData(
fun fetchSearchData(
header: Map<String, String>,
keyword: String,
page: Int
): List<AnimeMetaModel>
): Flow<PagingData<AnimeMetaModel>>
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.kl3jvi.animity.domain.use_cases

import android.util.Log
import com.kl3jvi.animity.data.repository.PlayerRepositoryImpl
import com.kl3jvi.animity.utils.Constants
import com.kl3jvi.animity.utils.Constants.Companion.REFERER
import com.kl3jvi.animity.utils.Constants.Companion.getNetworkHeader
import com.kl3jvi.animity.utils.Resource
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.flow
Expand All @@ -25,12 +28,28 @@ class GetEpisodeInfoUseCase @Inject constructor(
}.flowOn(ioDispatcher)

fun fetchM3U8(url: String?) = flow {
emit(Resource.Loading())
try {
val response = playerRepository.fetchM3u8Url(getNetworkHeader(), url ?: "")
Log.e("respons'ua", response.toString())
emit(Resource.Success(data = response.first.first()))
} catch (e: Exception) {
e.printStackTrace()
emit(Resource.Error("Couldn't find a Stream for this Anime"))
}
}.flowOn(ioDispatcher)

fun fetchEncryptedAjaxUrl(url: String?) = flow {
emit(Resource.Loading())
try {
val response = playerRepository.fetchEncryptedAjaxUrl(Constants.getHeader(), url ?: "")
emit(Resource.Success(data = response))
val streamUrl = "${REFERER}encrypt-ajax.php?${response}"
Log.e("Stream Url", streamUrl)
emit(Resource.Success(data = streamUrl))
} catch (e: Exception) {
e.printStackTrace()
emit(Resource.Error("Couldn't find a Stream for this Anime"))
}
}.flowOn(ioDispatcher)

}
Original file line number Diff line number Diff line change
@@ -1,52 +1,29 @@
package com.kl3jvi.animity.domain.use_cases

import androidx.paging.PagingData
import com.kl3jvi.animity.data.model.AnimeMetaModel
import com.kl3jvi.animity.data.repository.SearchRepositoryImpl
import com.kl3jvi.animity.domain.repositories.SearchRepository
import com.kl3jvi.animity.utils.Constants
import com.kl3jvi.animity.utils.Resource
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.toList
import retrofit2.HttpException
import java.io.IOException
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class GetSearchResultUseCase @Inject constructor(
private val searchRepository: SearchRepositoryImpl,
private val ioDispatcher: CoroutineDispatcher
private val searchRepository: SearchRepositoryImpl
) {
operator fun invoke(searchQuery: String): Flow<Resource<List<AnimeMetaModel>>> =
flow {
try {
emit(Resource.Loading())
val response = searchRepository.fetchSearchData(
Constants.getHeader(),
searchQuery,
1
).toList()
emit(
Resource.Success(
data = response
)
)
} catch (e: HttpException) {
emit(
Resource.Error(
message = e.localizedMessage ?: "An unexpected error occurred",
)
)
} catch (e: IOException) {
emit(
Resource.Error(
e.localizedMessage
?: "Couldn't reach server. Check your internet connection.",

)
)
}
}.flowOn(ioDispatcher)

operator fun invoke(searchQuery: String): Flow<PagingData<AnimeMetaModel>>{
return searchRepository.fetchSearchData(
Constants.getHeader(),
searchQuery
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import com.google.android.exoplayer2.trackselection.MappingTrackSelector
import com.google.android.exoplayer2.ui.AspectRatioFrameLayout
import com.google.android.exoplayer2.ui.TrackSelectionDialogBuilder
import com.google.android.exoplayer2.upstream.DataSource
import com.google.android.exoplayer2.util.MimeTypes
import com.google.android.exoplayer2.util.Util
import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
Expand Down Expand Up @@ -291,13 +290,12 @@ class PlayerActivity : AppCompatActivity() {
e.printStackTrace()
}
viewBinding.loadingOverlay.visibility = View.GONE

}
is Resource.Error -> {

}
is Resource.Loading -> {

viewBinding.loadingOverlay.visibility = View.VISIBLE
}
is Resource.Error -> {
showSnack(viewBinding.root, res.message)
}
}
}
Expand Down
Loading

0 comments on commit 178400d

Please sign in to comment.