Skip to content

Commit

Permalink
Add the ability to instantly search when tapping on a search suggesti…
Browse files Browse the repository at this point in the history
…on (Fixed #226)
  • Loading branch information
maxrave-dev committed Jan 21, 2024
1 parent 8b26301 commit c75a809
Show file tree
Hide file tree
Showing 17 changed files with 54 additions and 159 deletions.
2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -26,7 +26,7 @@ A simple music app using YouTube Music for backend
- Caching and can save data for offline playback
- Synced lyrics from Musixmatch and YouTube Transcript and translated lyrics (Community translation
from Musixmatch)
- Personalize data (*)
- Personalize data (*) and multi-YouTube-account support
- Support SponsorBlock
- Sleep Timer
- Android Auto
Expand Down
Expand Up @@ -7,18 +7,37 @@ import com.maxrave.simpmusic.databinding.ItemSuggestQueryBinding

class SuggestQueryAdapter(private var suggestQuery: ArrayList<String>): RecyclerView.Adapter<SuggestQueryAdapter.ViewHolder>() {
private lateinit var mListener: onItemClickListener
interface onItemClickListener{
private lateinit var mCopyListener: OnCopyClickListener

interface onItemClickListener {
fun onItemClick(position: Int)
}
fun setOnClickListener(listener: onItemClickListener){

interface OnCopyClickListener {
fun onCopyClick(position: Int)
}

fun setOnClickListener(listener: onItemClickListener) {
mListener = listener
}
inner class ViewHolder(val binding: ItemSuggestQueryBinding, listener: onItemClickListener) :

fun setOnCopyClickListener(listener: OnCopyClickListener) {
mCopyListener = listener
}

inner class ViewHolder(
val binding: ItemSuggestQueryBinding,
listener: onItemClickListener,
mCopyClickListener: OnCopyClickListener
) :
RecyclerView.ViewHolder(binding.root) {
init {
binding.root.setOnClickListener {
listener.onItemClick(bindingAdapterPosition)
}
binding.btCopySuggestQuery.setOnClickListener {
mCopyClickListener.onCopyClick(bindingAdapterPosition)
}
}
}
fun updateData(newData: ArrayList<String>){
Expand All @@ -28,7 +47,7 @@ class SuggestQueryAdapter(private var suggestQuery: ArrayList<String>): Recycler
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = ItemSuggestQueryBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding, mListener)
return ViewHolder(binding, mListener, mCopyListener)
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
Expand Down
Expand Up @@ -802,8 +802,13 @@ class SearchFragment : Fragment() {
resultAdapter.updateList(resultList)
}
}
suggestAdapter.setOnClickListener(object: SuggestQueryAdapter.onItemClickListener{
suggestAdapter.setOnClickListener(object : SuggestQueryAdapter.onItemClickListener {
override fun onItemClick(position: Int) {
binding.svSearch.setQuery(suggestList[position], true)
}
})
suggestAdapter.setOnCopyClickListener(object : SuggestQueryAdapter.OnCopyClickListener {
override fun onCopyClick(position: Int) {
binding.svSearch.setQuery(suggestList[position], false)
}
})
Expand All @@ -813,8 +818,7 @@ class SearchFragment : Fragment() {
if (binding.chipGroupTypeSearch.isEnabled) {
setEnabledAll(binding.chipGroupTypeSearch, false)
}
}
else {
} else {
if (!binding.chipGroupTypeSearch.isEnabled) {
setEnabledAll(binding.chipGroupTypeSearch, true)
}
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/layout/item_suggest_query.xml
Expand Up @@ -21,6 +21,7 @@
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_marginEnd="15sp"
android:padding="15dp"
android:src="@drawable/baseline_arrow_outward_24"
android:background="@android:color/transparent"
android:layout_centerVertical="true">
Expand Down
Binary file modified asset/screenshot/new_home_ui.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified asset/screenshot/new_setting_sponsor_block.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 9 additions & 0 deletions fastlane/metadata/android/en-US/changelogs/15.txt
@@ -0,0 +1,9 @@
- "New release" in home page
- Multiple YouTube Accounts Support
- Bigger thumbnails in home page
- Click suggest query to search
- Drag and drop to reorder songs in queue
- "Play next" feature
- Fixed "Conflict songs in queue when getting related songs"
- Fixed "LIKE" button
- Fixed all known bugs in Local Playlists
1 change: 1 addition & 0 deletions fastlane/metadata/android/en-US/full_description.txt
Expand Up @@ -8,6 +8,7 @@ Not a simple music player, it's SimpMusic
- Analyze your playing data, create custom playlists and sync with YouTube Music...
- Play video option with subtitle
- Caching and can save data for offline playback
- Login to YouTube Music account and support multiple accounts
- Synced lyrics from Musixmatch, YouTube Transcript and translate lyrics (Community translation from Musixmatch)
- Support SponsorBlock
- Sleep Timer
Expand Down
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 9 additions & 0 deletions fastlane/metadata/android/vi-VN/changelogs/15.txt
@@ -0,0 +1,9 @@
- Thêm "Mới phát hành" trên trang chủ
- Hỗ trợ chuyển đổi giữa nhiều tài khoản YouTube
- Tăng kích thước ảnh thumbnail trên trang chủ
- Click vào gợi ý để tìm kiếm
- Kéo thả để sắp xếp lại bài hát trong hàng đợi
- Chức năng "Phát tiếp theo"
- Sửa lỗi "Trùng lặp bài hát trong hàng đợi khi lấy bài hát liên quan"
- Sửa lỗi nút "LIKE"
- Sửa tất cả các lỗi đã biết trong danh sách phát cục bộ
1 change: 1 addition & 0 deletions fastlane/metadata/android/vi-VN/full_description.txt
Expand Up @@ -8,6 +8,7 @@ Không chỉ là ứng dụng nghe nhạc, nó là SimpMusic
- Thống kê dữ liệu nghe nhạc của bạn, tạo danh sách phát tùy chỉnh và đồng bộ với YouTube Music
- Tuỳ chọn xem video hỗ trợ phụ đề
- Lưu trữ dữ liệu ngoại tuyến
- Đăng nhập tài khoản YouTube và hỗ trợ đa tài khoản
- Lời bài hát được đồng bộ từ Musixmatch và YouTube Transcript, dịch lời bài hát với cộng đồng từ Musixmatch
- Hỗ trợ SponsorBlock
- Hẹn giờ đi ngủ
Expand Down
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Expand Up @@ -16,164 +16,15 @@ fun main() {
runBlocking {
YouTube.apply {
locale = YouTubeLocale("VN", "vi")
cookie =
"VISITOR_INFO1_LIVE=zhhx1-pXFL0; __utmz=27069237.1673094830.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); DEVICE_INFO=ChxOekk1TlRJMU5qazNORGszTnpNek56SXdNZz09EJHr96kGGJHr96kG; VISITOR_PRIVACY_METADATA=CgJWThIEGgAgTg%3D%3D; __utma=27069237.597876058.1673094830.1701522667.1702909192.30; HSID=AKmR2wltBTtzS_ssL; SSID=AmqXseQN3blQJAlw-; APISID=HLtlhkG_cz7HW8sh/AW6T1ufP21Y-B0BOP; SAPISID=5wLR0vjnRB0XSl6C/Agh-ZC5Cqfpx9x9Gj; __Secure-1PAPISID=5wLR0vjnRB0XSl6C/Agh-ZC5Cqfpx9x9Gj; __Secure-3PAPISID=5wLR0vjnRB0XSl6C/Agh-ZC5Cqfpx9x9Gj; SID=fQiHuJ_WVR-i8-Dj3hFzHfh8DnFQ2mW2LD5osSjDqaNf4Z3blFcY_nvLCrkOs3vdiSVgHg.; __Secure-1PSID=fQiHuJ_WVR-i8-Dj3hFzHfh8DnFQ2mW2LD5osSjDqaNf4Z3b8e9gPCrAxY9Xefj2kKpKUw.; __Secure-3PSID=fQiHuJ_WVR-i8-Dj3hFzHfh8DnFQ2mW2LD5osSjDqaNf4Z3bjcWRdG1Ehl94K2R5mfxdoA.; PREF=f6=40000000&tz=Asia.Saigon&f7=100&autoplay=true&volume=30&gl=VN&hl=vi&guide_collapsed=false&f5=20000&repeat=ALL; LOGIN_INFO=AFmmF2swRQIhAIoGt33kkyxNC21Oo7SDCC3sWGKl_2C3S5kgeZg1WZniAiAbNeI6wa74ewn9k7xs6cH3t5Zp-nSaXed5Km7QftOjGg:QUQ3MjNmeVhQMlI3NjBCS3ZOTDRVUndzZ2dGZFcxa2lFTmFEcTcxMElocmFWQmRyb1Q0cTBuOUk2dUEzNTFlbFcxOXVwV3dnS19pNlRWcTBOWUg5M3NNcUpZeVpjOTVZZTE4blQ5RmpmYVMybTVnTmNnQVV6bVAtbWdjM011aW5DbUtJcGZiRko2YXVSaU5sSlpybFlKQTVjTGNuTFByOXpB; YSC=i41GgqnGE5s; __Secure-1PSIDTS=sidts-CjEBPVxjSnxPDBGPY1lto4D_fgFSj1a0QaMH4PrIW5eHcUtc8OsqJFplt5TPs_ETEEp1EAA; __Secure-3PSIDTS=sidts-CjEBPVxjSnxPDBGPY1lto4D_fgFSj1a0QaMH4PrIW5eHcUtc8OsqJFplt5TPs_ETEEp1EAA; SIDCC=ABTWhQGVGIodP7jK127I-HWNfzEz4z519Hww7Q4c6Q--DqH06_erpbZwHVrFHlbcUelk45Z7DJ3f; __Secure-1PSIDCC=ABTWhQFhb4TlFYjoh_0-Uprx6R01HC7jTYEDobY_gcPKjW2gecEtSlBV960ClGdSSjQ-F4u44JZn; __Secure-3PSIDCC=ABTWhQGwIqRZw1RXfUJWOl-4IbHAZ-N4xJMLldKtPgK5-moJkVS01x113n5mSJL6I602Gk8e4_Y"
cookie = ""
}.getNotification().onSuccess { account ->
println(account)
}
.onFailure {
it.printStackTrace()
}
}
// Ytmusic().player(YouTubeClient.ANDROID_MUSIC, )
// YouTube.spotifyCookie =
// "sp_t=a910acb941e990e349d79e8170f2dafe; _scid=e96b060c-30fc-4c59-9e44-25f376482edd; _ga=GA1.2.2112854199.1671017821; sp_adid=95e621d6-b86c-4ce5-bed4-6b03ab65155b; _ga_ZWG1NSHWD8=GS1.1.1671017821.1.0.1671017823.0.0.0; sp_dc=AQAYI79gjZIRlNjJUDXJLIq1yw5Nb_E85T55B8jgHOVWOseGrnhlVuEKRziSRV1XA8Ca2d7bx7RAQ-6hjGLWNlsxHrZ6DP6Jmn_Joz-6djb05evRb31kKFGrTXhRzFBRMr5MePVo2pujxkVtOjCZp_qNP1J3ryQ; sp_key=595700a0-212b-4ce5-a497-0f7eea005f35; OptanonAlertBoxClosed=2022-12-27T15:05:03.114Z; sp_m=vn-vi; sp_landing=https%3A%2F%2Fopen.spotify.com%2Ftrack%2F1GPRHgVXzRfzoc44HEZZQI%3Fsp_cid%3Da910acb941e990e349d79e8170f2dafe%26device%3Ddesktop; OptanonConsent=isIABGlobal=false&datestamp=Sat+Sep+30+2023+22%3A30%3A16+GMT%2B0700+(Indochina+Time)&version=6.26.0&hosts=&landingPath=NotLandingPage&groups=s00%3A1%2Cf00%3A1%2Cm00%3A1%2Ct00%3A1%2Ci00%3A1%2Cf11%3A0&AwaitingReconsent=false&geolocation=VN%3BSG"
// YouTube.cookie =
// "VISITOR_INFO1_LIVE=zhhx1-pXFL0; __utmz=27069237.1673094830.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); VISITOR_PRIVACY_METADATA=CgJWThICGgA%3D; __utma=27069237.597876058.1673094830.1691393097.1693037834.24; LOGIN_INFO=AFmmF2swRQIhALlK-GIKSX-_-wAq3MR4LiZxDEyZau-CdERSaDCSToolAiBHixfkKWkvAOsMjXax7ia-Nsld97BRcVkrl0mP4wkxNA:QUQ3MjNmeVBBcWJNVnp1cWNLVnFnNVhCdTQ5d3JzaTNsaUVLZWwzNUFFM21Gd3BaWTZHdTh6VzJDZDhaR09UTDVHYkpORWdudXFwNVNybE1wWVVKM3p5ZFpoODgyQWc2OUlISnc1TUJpU09DXzVJR3FUVWdhVGxZT3RLcTBXcThZdGhjVENjMmI4ZnJZWGtrQ29UejhRMVl0N1NTVUxRYnl3; SID=bAiHuOSAVkOcHMA4cuCGz3Esa2qGLgDbdsMbk5UHs0UUkVJkLIWqC4og39fPQOPkDMu2xg.; __Secure-1PSID=bAiHuOSAVkOcHMA4cuCGz3Esa2qGLgDbdsMbk5UHs0UUkVJkk5EjmxcjfH2pbmn4iPwjuw.; __Secure-3PSID=bAiHuOSAVkOcHMA4cuCGz3Esa2qGLgDbdsMbk5UHs0UUkVJkYXoKeyvKnENZHS6ubzdUJg.; HSID=Anikjx73sQ4s47Hjp; SSID=AKVpi9FZspt0u7zj8; APISID=GF09QQoyirI05dF7/ALTs2_GFCeABgB3sQ; SAPISID=T_NjR_vKV6wufMQH/A1MpNmKnmYUpD9ALL; __Secure-1PAPISID=T_NjR_vKV6wufMQH/A1MpNmKnmYUpD9ALL; __Secure-3PAPISID=T_NjR_vKV6wufMQH/A1MpNmKnmYUpD9ALL; PREF=f6=40000000&tz=Asia.Saigon&f7=100&autoplay=true&volume=56&gl=VN&hl=vi&guide_collapsed=false&f5=20000; YSC=zlOmTzYFmfA; __Secure-1PSIDTS=sidts-CjEB3e41hVMGhnny0RrJ_9Xo7vlv9Snp5RI0Os4UJf3o0eTVQpu6XIgu1WiB4h-85ieZEAA; __Secure-3PSIDTS=sidts-CjEB3e41hVMGhnny0RrJ_9Xo7vlv9Snp5RI0Os4UJf3o0eTVQpu6XIgu1WiB4h-85ieZEAA; SIDCC=ACA-OxNYWmgFXxZbBBCm28QjtcfRwJ-5KptqbNeVrmmzSTfn17hF36FVWfNBS-xsXZZQ2MtFaAWJ; __Secure-1PSIDCC=ACA-OxMd3YwVX5FAZmRVz9dag48RWH8hv-WvzziDAcc4aYGNDEfK7OXwf3N_uMe7Z7KeBEBpvbn3; __Secure-3PSIDCC=ACA-OxP0D1K8y4lhUZR35NgHhmj3PZ_1o51V9gUcB8X-SChuTiQF7gyOCq9cTx5Orr483Owq2_U"
// YouTube.next(endpoint = WatchEndpoint(playlistId = "RDEMgtw3oC9Zt7NLrWZyopXq4Q"))
// .onSuccess {
// val songs = ArrayList<SongItem>()
// songs.addAll(it.items)
// println(songs.size)
// if (it.continuation != null) {
// YouTube.next(endpoint = WatchEndpoint(playlistId = "RDEMgtw3oC9Zt7NLrWZyopXq4Q"), continuation = it.continuation).onSuccess { value ->
// songs.addAll(value.items)
// println(songs.size)
// println(songs)
// }
// }
// }
// YouTube.getMusixmatchUserToken().onSuccess {
// println(it.message.body.user_token)
// YouTube.postMusixmatchCredentials("ndtminh2608@gmail.com", "minh123456", it.message.body.user_token).onSuccess { value ->
// println(value)
// YouTube.musixmatchUserToken = it.message.body.user_token
// delay(2000)
// YouTube.getMusixmatchTranslateLyrics("144114431", it.message.body.user_token, "vi").onSuccess { lyrics ->
// println(lyrics)
// }.onFailure {
// it.printStackTrace()
// }
//
// }
// .onFailure {
// it.printStackTrace()
// }
// }
// .onFailure {
// it.printStackTrace()
// }
// YouTube.browse(browseId = "VLOLAK5uy_nX6nwnLobDcXKOKCk2gH-xql7B6aU1Ta4", params = "ggMCCAI%3D").onSuccess { result ->
// println(result.items)
// }.onFailure { error ->
// error.printStackTrace()
// }
}
// YouTube.authentication().onSuccess { token ->
// if (token.accessToken != null) {
//
// YouTube.getSongId(token.accessToken, "Feel Good Gryffin").onSuccess { spotifyResult ->
// if (!spotifyResult.tracks?.items.isNullOrEmpty()) {
// val list = arrayListOf<String>()
// for (index in spotifyResult.tracks?.items!!.indices) {
// list.add(spotifyResult.tracks?.items?.get(index)?.name + spotifyResult.tracks?.items?.get(index)?.artists?.get(0)?.name)
// }
// bestMatchingIndex("Feel Good Gryffin", list).let {
// spotifyResult.tracks?.items?.get(it)?.let {item ->
// item.id?.let { it1 ->
// YouTube.getAccessToken().onSuccess { value: AccessToken ->
// println(value)
// YouTube.getLyrics(it1, value.accessToken).onSuccess { lyrics ->
// println(lyrics)
// }.onFailure {
// it.printStackTrace()
// }
// }
// }
// }
// }
// }
// }.onFailure {
// it.printStackTrace()
// }
// }
//
// }
// }.onFailure {
// it.printStackTrace()
// }
// YouTube.player("cPcGnUJmcFg", "").onSuccess { player ->
//// player.playbackTracking?.videostatsPlaybackUrl?.baseUrl?.let { url ->
//// YouTube.initPlayback(url).onSuccess { playback ->
//// println(playback)
//// delay(5000)
//// player.playbackTracking.atrUrl?.baseUrl?.let {
//// YouTube.initPlayback(it).onSuccess { atr ->
//// println(atr)
//// }
//// }
//// }
//// }
// if (player.playbackTracking?.videostatsPlaybackUrl?.baseUrl != null && player.playbackTracking.atrUrl?.baseUrl != null && player.playbackTracking.videostatsWatchtimeUrl?.baseUrl != null) {
// YouTube.initPlayback(player.playbackTracking.videostatsPlaybackUrl.baseUrl,
// player.playbackTracking.atrUrl.baseUrl, player.playbackTracking.videostatsWatchtimeUrl.baseUrl
// ).onSuccess { playback ->
//
// }
// }
// }
// .onFailure { error ->
// error.printStackTrace()
// }
// YouTube.getLibraryPlaylists().onSuccess {data ->
// val input = data.contents?.singleColumnBrowseResultsRenderer?.tabs?.get(0)?.tabRenderer?.content?.sectionListRenderer?.contents?.get(0)?.gridRenderer?.items ?: null
// if (input != null) {
// val list = parseLibraryPlaylist(input)
// println(list)
// }
// else {
// println("null")
// }
// }
// .onFailure { error ->
// error.printStackTrace()
// }
// }
// YouTube.customQuery("FEmusic_history", setLogin = true).onSuccess {
// println(Json.encodeToString(it))
// }
// .onFailure { error ->
// error.printStackTrace()
// }
// YouTube.scrapeYouTube("XLbiC-ly7v8").onSuccess { scrape ->
// var response = ""
// var data = ""
// val ksoupHtmlParser = KsoupHtmlParser(
// object : KsoupHtmlHandler {
// override fun onText(text: String) {
// super.onText(text)
// if (text.contains("var ytInitialPlayerResponse")) {
// val temp = text.replace("var ytInitialPlayerResponse = ", "").dropLast(1)
// response = temp.trimIndent()
// }
// else if (text.contains("var ytInitialData")) {
// val temp = text.replace("var ytInitialData = ", "").dropLast(1)
// data = temp.trimIndent()
// }
// }
// }
// )
// ksoupHtmlParser.write(scrape)
// ksoupHtmlParser.end()
// val json = Json {ignoreUnknownKeys = true}
// val ytScrapeData = json.decodeFromString<YouTubeDataPage>(data)
// val ytScrapeInitial = json.decodeFromString<YouTubeInitialPage>(response)
// println(ytScrapeInitial.playbackTracking.toString())
//
// }
// .onFailure { error ->
// error.printStackTrace()
// }
}

fun parseLibraryPlaylist(input: List<GridRenderer.Item>): ArrayList<PlaylistsResult> {
val list : ArrayList<PlaylistsResult> = arrayListOf()
Expand Down

0 comments on commit c75a809

Please sign in to comment.