Skip to content

Commit

Permalink
Merge pull request #30 from emreesen27/v100-beta2
Browse files Browse the repository at this point in the history
V100-beta2 is completed
  • Loading branch information
emreesen27 authored Sep 28, 2024
2 parents 5389b72 + 89e4159 commit 35e3a3d
Show file tree
Hide file tree
Showing 16 changed files with 156 additions and 36 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
## v1.0.0-Beta2 (28.09.2024)

* [FIX] The explode error in the search has been resolved.
* [FIX] The index error that occurred after reordering playlists has been resolved.

## v1.0.0-Beta1 (12.09.2024)

* [FIX] The issue of songs not being listed when adding music to the playlist has been resolved.
Expand Down
4 changes: 2 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ android {
applicationId = "com.snstudio.hyper"
minSdk = 26
targetSdk = 34
versionCode = 1
versionName = "1.0.0-Beta1"
versionCode = 3
versionName = "1.0.0-Beta2"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class LibraryFragment : BaseFragment<FragmentLibraryBinding, LibraryViewModel>()
private lateinit var mediaViewModel: MediaViewModel

private val mediaItemAdapter: MediaItemAdapter by lazy {
MediaItemAdapter(onClick = { media ->
MediaItemAdapter(onClick = { media, _ ->
playMedia(media)
})
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import com.snstudio.hyper.core.extension.click
import com.snstudio.hyper.core.extension.infoToast
import com.snstudio.hyper.core.extension.observe
import com.snstudio.hyper.data.MediaItemBuilder
import com.snstudio.hyper.data.model.Media
import com.snstudio.hyper.databinding.FragmentPlaylistDetailBinding
import com.snstudio.hyper.feature.picker.MediaPickerDialog
import com.snstudio.hyper.shared.MediaItemAdapter
Expand All @@ -22,8 +21,8 @@ class PlaylistDetailFragment : BaseFragment<FragmentPlaylistDetailBinding, Playl
private lateinit var mediaViewModel: MediaViewModel
private val args: PlaylistDetailFragmentArgs by navArgs()
private val mediaItemAdapter by lazy {
MediaItemAdapter(onClick = {
setPlayList(it)
MediaItemAdapter(onClick = { _, pos ->
setPlayList(pos)
})
}

Expand Down Expand Up @@ -74,17 +73,15 @@ class PlaylistDetailFragment : BaseFragment<FragmentPlaylistDetailBinding, Playl
viewModel.getMediaForPlaylistOrdered(args.playListId)
}

private fun setPlayList(media: Media) {
mediaItemAdapter.getSubMediaItems(media).let { mediaList ->
val mediaItems =
mediaList.map { media ->
MediaItemBuilder()
.setMediaId(media.localPath.orEmpty())
.setMediaTitle(media.title)
.build()
}
mediaViewModel.setPlaylist(mediaItems)
}
private fun setPlayList(pos: Int) {
val mediaItems =
mediaItemAdapter.mediaItems.map { media ->
MediaItemBuilder()
.setMediaId(media.localPath.orEmpty())
.setMediaTitle(media.title)
.build()
}
mediaViewModel.setPlaylist(mediaItems, pos)
}

private fun showMediaPickerDialog() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ import com.snstudio.hyper.shared.MediaItemAdapter
import com.snstudio.hyper.shared.MediaViewModel
import com.snstudio.hyper.shared.ProgressLiveData
import com.snstudio.hyper.util.DATA_KEY
import com.snstudio.hyper.util.EXCEPTION
import com.snstudio.hyper.util.ErrorDialog
import com.snstudio.hyper.util.InfoDialog
import com.snstudio.hyper.util.ItemTouchHelperCallback
import com.snstudio.hyper.util.MediaItemType
Expand All @@ -40,7 +42,7 @@ class SearchFragment :
private lateinit var mediaViewModel: MediaViewModel

private val mediaItemAdapter by lazy {
MediaItemAdapter(onClick = { media ->
MediaItemAdapter(onClick = { media, _ ->
viewModel.invokeAudioUrl(media, SearchViewModel.AudioActionType.PLAY)
})
}
Expand Down Expand Up @@ -74,7 +76,13 @@ class SearchFragment :
}

RECEIVED.AUDIO_URL_RECEIVED.received -> {
it.argument<String>(DATA_KEY)?.let { url ->
it.argument<HashMap<String, String>>(DATA_KEY)?.let { data ->
val url = data["url"].orEmpty()
val errorCode = data["errorCode"]
if (!errorCode.isNullOrEmpty()) {
showErrorDialog(errorCode)
return@observe
}
when (audioActionType) {
SearchViewModel.AudioActionType.PLAY -> {
playMedia(url)
Expand Down Expand Up @@ -226,4 +234,14 @@ class SearchFragment :
viewModel.setTrueInfoDialogStatus()
}
}

private fun showErrorDialog(code: String) {
val errMessage =
if (code == EXCEPTION.YT_EXPLODE_EXCEPTION.code) {
R.string.yt_explode_error
} else {
R.string.unexpected_error
}
ErrorDialog(errMessage = errMessage).showDialog(childFragmentManager)
}
}
11 changes: 3 additions & 8 deletions app/src/main/java/com/snstudio/hyper/shared/MediaItemAdapter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import com.snstudio.hyper.databinding.ItemMediaSearchBinding
import com.snstudio.hyper.util.MediaItemType

class MediaItemAdapter(
private val onClick: ((Media) -> Unit)? = null,
private val onClick: ((Media, Int) -> Unit)? = null,
) : RecyclerView.Adapter<MediaItemAdapter.AutoCompleteViewHolder>() {
var mediaItems: MutableList<Media> = mutableListOf()
private set
Expand All @@ -33,11 +33,6 @@ class MediaItemAdapter(
diffResult.dispatchUpdatesTo(this)
}

fun getSubMediaItems(media: Media): MutableList<Media> {
val index = mediaItems.indexOf(media)
return mediaItems.subList(index, mediaItems.size)
}

fun moveItem(
fromPosition: Int,
toPosition: Int,
Expand Down Expand Up @@ -109,14 +104,14 @@ class MediaItemAdapter(
private fun bindMedia(media: Media) {
val itemBinding = binding as ItemMediaBinding
itemBinding.root.click {
adapter.onClick?.invoke(media)
adapter.onClick?.invoke(media, absoluteAdapterPosition)
}
}

private fun bindMediaSearchType(media: Media) {
val itemBinding = binding as ItemMediaSearchBinding
itemBinding.root.click {
adapter.onClick?.invoke(media)
adapter.onClick?.invoke(media, absoluteAdapterPosition)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,11 +90,15 @@ class MediaViewModel(application: Application) : AndroidViewModel(application) {
player.stop()
}

fun setPlaylist(mediaItems: List<MediaItem>) {
fun setPlaylist(
mediaItems: List<MediaItem>,
startPosition: Int = 0,
) {
playlist.clear()
playlist.addAll(mediaItems)
player.setMediaItems(mediaItems)
player.prepare()
player.seekTo(startPosition, 0)
player.play()
}
}
22 changes: 22 additions & 0 deletions app/src/main/java/com/snstudio/hyper/util/ErrorDialog.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.snstudio.hyper.util

import androidx.annotation.StringRes
import com.snstudio.hyper.core.base.BaseDialog
import com.snstudio.hyper.core.extension.click
import com.snstudio.hyper.databinding.DialogErrorBinding

class ErrorDialog(
@StringRes private val errMessage: Int,
) : BaseDialog<DialogErrorBinding>() {
override var setCancelable: Boolean = true

override fun getViewBinding() = DialogErrorBinding.inflate(layoutInflater)

override val dialogTag: String
get() = "ERROR_DIALOG"

override fun setupViews() {
binding.title.setText(errMessage)
binding.close.click { dismiss() }
}
}
5 changes: 5 additions & 0 deletions app/src/main/java/com/snstudio/hyper/util/Metods.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,8 @@ enum class INVOKE(val invoke: String) {
AUDIO_URL("getAudioUrl"),
NEXT("nextPage"),
}

enum class EXCEPTION(val code: String) {
YT_EXPLODE_EXCEPTION("403"),
UNEXPECTED("0"),
}
10 changes: 10 additions & 0 deletions app/src/main/res/drawable/ic_error.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="@color/text_color"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@color/text_color"
android:pathData="M11,15h2v2h-2zM11,7h2v6h-2zM11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z" />
</vector>
53 changes: 53 additions & 0 deletions app/src/main/res/layout/dialog_error.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/secondary_background_color"
android:padding="@dimen/_10sdp">


<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/image"
android:layout_width="@dimen/_48sdp"
android:layout_height="@dimen/_48sdp"
android:layout_marginHorizontal="@dimen/_10sdp"
android:layout_marginTop="@dimen/_10sdp"
android:src="@drawable/ic_error"
android:tint="@color/secondary_text_color"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<com.google.android.material.textview.MaterialTextView
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/_10sdp"
android:layout_marginTop="@dimen/_5sdp"
android:gravity="center"
android:textColor="@color/secondary_text_color"
android:textSize="@dimen/_13ssp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/image"
tools:text="@string/how_do_download" />


<com.google.android.material.textview.MaterialTextView
android:id="@+id/close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/_10sdp"
android:layout_marginTop="@dimen/_5sdp"
android:gravity="center"
android:text="@string/ok"
android:textColor="@color/main_color"
android:textSize="@dimen/_14ssp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/title" />


</androidx.constraintlayout.widget.ConstraintLayout>
3 changes: 3 additions & 0 deletions app/src/main/res/values-tr/string.xml
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,7 @@
<string name="how_to_delete">Müziği silmek için sola kaydırın</string>
<string name="no_music_downloaded_yet">Henüz bir müzik indirilmemiş</string>
<string name="all_music_contains">Bu liste eklenebilecek tüm müzikleri içeriyor</string>
<string name="err">Hata !</string>
<string name="unexpected_error">Beklenmeyen bir hata oluştu. Daha sonra tekrar deneyin</string>
<string name="yt_explode_error">Veriler işlenirken bir hata oluştu. Lütfen uygulamanın en son sürümünü kullandığınızdan emin olun.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,8 @@
<string name="how_to_delete">Swipe left to delete music</string>
<string name="no_music_downloaded_yet">No music has been downloaded yet</string>
<string name="all_music_contains">This list contains all the music that can be added</string>
<string name="err">Error !</string>
<string name="unexpected_error">An unexpected error has occurred. Try again later.</string>
<string name="yt_explode_error">An error occurred while processing the data. Please make sure you are using the latest version of the application.</string>

</resources>
14 changes: 9 additions & 5 deletions explode/lib/explode.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,16 @@ class Explode {
}

getAudioUrl(String videoId) async {
var manifest =
await _explode.videos.streamsClient.getManifest(VideoId(videoId));
String url = manifest.audioOnly.last.url.toString();

Map<String, String> result = {'url': '', 'errorCode': ''};
try {
var manifest =
await _explode.videos.streamsClient.getManifest(VideoId(videoId));
result['url'] = manifest.audioOnly.last.url.toString();
} catch (e) {
result['errorCode'] = e is YoutubeExplodeException ? '403' : '0';
}
await ChannelBridge.instance.channel
.invokeMethod('receiveAudioUrl', {'data': url});
.invokeMethod('receiveAudioUrl', {'data': result});
}

List<Map<String, String>> _fetchVideoList(VideoSearchList? videos) {
Expand Down
4 changes: 2 additions & 2 deletions explode/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -252,9 +252,9 @@ packages:
dependency: "direct main"
description:
name: youtube_explode_dart
sha256: "26c9671d638f3396a1bfb2666f586988ee7b0ba3469e478b22a4c1a168bcf6ee"
sha256: "133a65907e6cf839ac7643d92dc5c56b37fcebe4f0a8f0e67716dffa500c0ef0"
url: "https://pub.dev"
source: hosted
version: "2.2.1"
version: "2.2.2"
sdks:
dart: ">=3.2.5 <4.0.0"
2 changes: 1 addition & 1 deletion explode/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ environment:
dependencies:
flutter:
sdk: flutter
youtube_explode_dart: ^2.2.1
youtube_explode_dart: ^2.2.2

dev_dependencies:
flutter_test:
Expand Down

0 comments on commit 35e3a3d

Please sign in to comment.