Giter Site home page Giter Site logo

maxrave-dev / simpmusic Goto Github PK

View Code? Open in Web Editor NEW
1.3K 21.0 96.0 54.99 MB

A simple music app using YouTube Music for backend

Home Page: https://simpmusic.tech/

License: GNU General Public License v3.0

Kotlin 100.00%
android android-application kotlin media3 youtube android-app exoplayer mp3 music spotify video-streaming youtube-music android-14 android-auto kotlin-only

simpmusic's Introduction

SimpMusic

A FOSS YouTube Music client for Android with many features from
Spotify, Musixmatch, SponsorBlock, ReturnYouTubeDislike



Nightly Build


Features ✨️

  • Play music from YouTube Music or YouTube free without ads in the background
  • Browsing Home, Charts, Podcast, Moods & Genre with YouTube Music data at high speed
  • Search everything on YouTube
  • Analyze your playing data, create custom playlists, and sync with YouTube Music...
  • Spotify Canvas supported
  • Play video option with subtitle
  • AI suggest songs
  • Caching and can save data for offline playback
  • Synced lyrics from Musixmatch, Spotify (require login) and YouTube Transcript and translated lyrics (Community translation from Musixmatch)
  • Personalize data (*) and multi-YouTube-account support
  • Support SponsorBlock, Return YouTube Dislike
  • Sleep Timer
  • Android Auto with online content
  • And many more!

(*) For users who chose "Send back to Google" feature

Warning

This app is in the beta stage, so it may have many bugs and make it crash. If you find any bugs, please create an issue or contact me via email or discord sever.

Screenshots

More screenshot here.

Data

  • This app uses hidden API from YouTube Music with some tricks to get data from YouTube Music.
  • Use Spotify Web API and some tricks to get Spotify Canvas and Lyrics
  • Thanks to InnerTune for the idea to get data from YouTube Music. This repo is my inspiration to create this app
  • My app is using SponsorBlock to skip sponsor in YouTube videos.
  • ReturnYouTubeDislike for getting information on votes
  • Lyrics data from Musixmatch. More information Musixmatch

Privacy

SimpMusic doesn't have any tracker or third-party server for collecting user data. If YouTube logged-in users enable "Send back to Google" feature, SimpMusic only uses YouTube Music Tracking API to send listening history and listening record of video to Google for better recommendations and supporting artist or YouTube Creator (For API reference, see this).

Translation

Crowdin
You can help me translate this app into your language by using Crowdin SimpMusic on Crowdin

FAQ

1. Wrong Lyrics?

YouTube Music is not an official partner of Musixmatch so you can't get lyrics directly if using YouTube" videoId" parameter. So I need to use some "String Matcher" and "Duration" for search lyrics. So sometimes, some songs or videos get the wrong lyric's

2. Why the name or brand is "SimpMusic"?

Simply, because I love this name. It's a combination of Simple and Music. But SimpMusic is not a simple app, it's all you need for a powerful music streaming app.

Developer/Team

maxrave-dev: Founder/Developer/Designer

owen connor: Discord Server Admin.

Support & Donations

Visit the website   Discord Server  
Buy me a Coffee   liberapay

MOMO or Vietnamese banking

simpmusic's People

Contributors

dattran2k avatar eric100lin avatar maxrave-dev avatar maxravework avatar owencz1998 avatar sidharthmudgil avatar waldist avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

simpmusic's Issues

Ui problem

Screenshot_20230730_073211_SimpMusic.png

Navigation button is to bottom
Samsung galaxy a34 5g
Android 13 One UI 5.1

Info about new releases by the followed artists

I don't know if it's feasible but is there a way to be informed in some way about new releases from the artists you follow? Be it a notification or a hint through a dot or something similar.

Thanks for the great app and your hard work.

Add feature

Why downloads are cached not a local file?

Resume last played track after restarting the app

It would be great if you implement the resumption of the last played track after restarting the application, or at least return to the previous playlist. For now, if I open the app again, I need to select the playlist again.

Brilliant App

Saw this app on Izzydroid repo on F-Droid. Gave it a try. Now it is my go-to music app because it is brilliant and it has synced lyrics. Keep it up Max!

SO LAGGING

I have been waiting for 30min but the software can't load any song ╰(‵□′)╯

lag

App is Crashing v0.0.4

Hello,
after the update to the 0.0.4 the app unfortunately still crashes, immediately after the start.

type: crash
osVersion: google/cheetah/cheetah:13/TQ3A.230705.001/2023072600:user/release-keys
package: com.maxrave.simpmusic:4
process: com.maxrave.simpmusic
processUptime: 218 + 245 ms
installer: com.looker.droidify

java.lang.ArrayIndexOutOfBoundsException: length=2; index=-1
	at com.maxrave.simpmusic.viewModel.HomeViewModel$getHomeItemList$3.invokeSuspend(HomeViewModel.kt:80)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
	at kotlinx.coroutines.EventLoop.processUnconfinedEvent(EventLoop.common.kt:68)
	at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:375)
	at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:30)
	at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable$default(Cancellable.kt:25)
	at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:110)
	at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:126)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:56)
	at kotlinx.coroutines.BuildersKt.launch(Unknown Source:1)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:47)
	at kotlinx.coroutines.BuildersKt.launch$default(Unknown Source:1)
	at com.maxrave.simpmusic.viewModel.HomeViewModel.<init>(HomeViewModel.kt:55)
	at com.maxrave.simpmusic.DaggerSimpMusicApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider.get(DaggerSimpMusicApplication_HiltComponents_SingletonC.java:782)
	at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory$1.create(HiltViewModelFactory.java:102)
	at androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.kt:90)
	at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:114)
	at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:187)
	at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153)
	at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:53)
	at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:35)
	at com.maxrave.simpmusic.ui.fragment.home.HomeFragment.getViewModel(HomeFragment.kt:48)
	at com.maxrave.simpmusic.ui.fragment.home.HomeFragment.initObserver(HomeFragment.kt:225)
	at com.maxrave.simpmusic.ui.fragment.home.HomeFragment.onViewCreated(HomeFragment.kt:81)
	at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3147)
	at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:588)
	at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:272)
	at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:114)
	at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1455)
	at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3034)
	at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:2945)
	at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3148)
	at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:588)
	at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:272)
	at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:114)
	at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1455)
	at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3034)
	at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2952)
	at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:263)
	at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:350)
	at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:251)
	at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1548)
	at android.app.Activity.performStart(Activity.java:8414)
	at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3680)
	at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:224)
	at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:204)
	at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2313)
	at android.os.Handler.dispatchMessage(Handler.java:106)
	at android.os.Looper.loopOnce(Looper.java:201)
	at android.os.Looper.loop(Looper.java:288)
	at android.app.ActivityThread.main(ActivityThread.java:7940)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
	at com.android.internal.os.ExecInit.main(ExecInit.java:49)
	at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
	at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:355)
	Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@ed22cd4, Dispatchers.Main.immediate]

Navigation bar

Please add maybe blur to the background of the navigation bar so it's clearer to see or maybe ingrate dynamic theme in both navigation bar and the main background like homescreen and other pages.

Context menu

When you are in artist page or in album page, songs should have a context menu so that you can like it without playing the song, you can add it in a play queue, ...

Replay Gain Normalization

Feature description

Some songs are louder than others in a playlist. Replay Gain Normalization can be used to make them equally loud.

The variable volume is annoying and some songs aren't even audible unless you manually set the volume right for the song.

Discord sever

@maxrave-dev
Hey man I'm a ex moderator of many github projects and also the main dev of redbot discord bot I was thinking can I make you a discord sever for this project this opens up a Community for people to report bugs and ask for new features obviously I can keep track on the issues they open and remove any duplicate ones we can also upload bigger files like screen records that github can't do.

Many thanks 😊

Share menu

Make SimpMusic available in the "Share" menu.

This would make sharing from the left easier.

Multiple selection

In an album I'd like to select some songs and like them. You can't select any song by keep pressing on a song

API Level 25

Is it possible to lower the min SDK to level 25?

Crash when starting music (v0.0.5)

Hello,
Unfortunately, when I try to start playing music, the app crashes.

type: crash
osVersion: google/cheetah/cheetah:13/TQ3A.230705.001/2023072600:user/release-keys
package: com.maxrave.simpmusic:5
process: com.maxrave.simpmusic
processUptime: 8018 + 228 ms
installer: io.github.muntashirakon.AppManager

java.lang.IllegalStateException: Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number. You can simply fix this by increasing the version number. Expected identity hash: 584c84929cc872dea0e4fa287c3c6809, found: 0b79be7c71e3cd87102b15f8daf00fd9
	at androidx.room.RoomOpenHelper.checkIdentity(RoomOpenHelper.kt:147)
	at androidx.room.RoomOpenHelper.onOpen(RoomOpenHelper.kt:128)
	at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onOpen(FrameworkSQLiteOpenHelper.kt:287)
	at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:434)
	at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:323)
	at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableOrReadableDatabase(FrameworkSQLiteOpenHelper.kt:232)
	at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.innerGetDatabase(FrameworkSQLiteOpenHelper.kt:190)
	at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getSupportDatabase(FrameworkSQLiteOpenHelper.kt:151)
	at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.kt:104)
	at androidx.room.RoomDatabase.internalBeginTransaction(RoomDatabase.kt:528)
	at androidx.room.RoomDatabase.beginTransaction(RoomDatabase.kt:517)
	at com.maxrave.simpmusic.data.db.DatabaseDao_Impl$28.call(DatabaseDao_Impl.java:601)
	at com.maxrave.simpmusic.data.db.DatabaseDao_Impl$28.call(DatabaseDao_Impl.java:598)
	at androidx.room.CoroutinesRoom$Companion$execute$2.invokeSuspend(CoroutinesRoom.kt:65)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
	at androidx.room.TransactionExecutor.execute$lambda$1$lambda$0(TransactionExecutor.kt:36)
	at androidx.room.TransactionExecutor.$r8$lambda$AympDHYBb78s7_N_9gRsXF0sHiw(Unknown Source:0)
	at androidx.room.TransactionExecutor$$ExternalSyntheticLambda0.run(Unknown Source:4)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
	at java.lang.Thread.run(Thread.java:1012)
	Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@790b6d2, Dispatchers.Main.immediate]

Expendable Textview

My scanner found a library in your app which it does not know about. Do you have any idea where the source for com.example.expandabletextview_compose can be found? It's not mentioned in your code base either, so it must be a dependency of a dependency; maybe running gradle :app:dependencies can reveal it?

Player bug

I don't it is implemented that way but in player it shows this :
Screenshot_20230802-154955_SimpMusic
The icon are not visible fully without scrolling down

Swipe feature from currently playing menu

It'd be cool to have a swipe feature so we could skip tracks back and forth without touching a button and we could swipe down to get back to home screen and minimize the currently playing tab.

Thanks 🦸‍♂️

Add "refresh playlist" button

It will be great if you implement "refresh playlists" button in playlists. That help us to get songs that we added recently in playlists by youtube.

Implement animation while swiping down

Implement animation while we swipe down now playing screen. There is an only animation for minimize to now playing screen. So it will be great if you implement animation while we swipe down

the app crashes frequently

the app crashes frequently, mostly in the settings menu. if you e.g. clicks Downloads or most played.

Device: Samsung Galaxy a8, Android 9

Content not working

IMG_20230803_225832
i chose PH content but it seems doesn't work, Hopefully we can choose what music county we want to appear on homepage.

Good app Tho very nice UI and Player it's clean like Spotify compared to Music Player of other app on Playstore they too extra that's why i like Spotify like player and this one.

Status bar and Navigation bar not transparent

Is there a way for simpmusic to use the android api to make the navbar transparent? Also, although on stock android, the status bar is transparent, on Samsung devices, there's like a little tint that remains which looks weird~

Automatic backup function

An automatic backup function like Blackhole would be very useful if you change your phone or tablet

Piped Support Feature Request

Is Piped account and custom instance support planned for library backup? This app looks beautiful so far and I would love to see it work as a drop in replacement for any other proprietary app.

Add a Crowdin Page

Hi! First of all I want to give you a huge thanks for this incredible app. SimpMusic is super useful and simple to use! I just want to ask if it's possible to add a Crowdin Page for the app, because it's easier for people instead of downloading Android Studio. I don't know if it's possible or if it's easier for you, but if you have time, please consider it! I'm interested in translating the app into Italian, but I don't have Android Studio on my PC and I don't have too much space to download it (I already have Visual Studio and Visual Studio Code). Thanks in advance, have a nice day!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.