Skip to content

Commit

Permalink
Merge pull request #43 from toasterofbread/readme
Browse files Browse the repository at this point in the history
Add README and LICENSE
  • Loading branch information
toasterofbread authored May 6, 2023
2 parents b48e0a1 + cc28065 commit b139803
Show file tree
Hide file tree
Showing 8 changed files with 737 additions and 180 deletions.
674 changes: 674 additions & 0 deletions LICENSE

Large diffs are not rendered by default.

58 changes: 58 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# SpMp
##### README under construction
A YouTube Music client with a focus on language and metadata customisation, built with Jetpack Compose for Android using Kotlin.
Support for Compose Multiplatform on desktop is [in-progress](https://github.com/toasterofbread/spms).

## Features

#### Metadata
- Edit song, artist, and playlist titles
- Set UI and metadata languages separately (ex. display the app's UI in English and show songs and artists in Japanese)
- Option to log into your YouTube Music account for displaying your personal feed, as well as interactions like liking songs and subscribing to artists

#### QOL
- Undo queue actions (no more accidental swipe removals)
- Store songs locally for offline playback
- Fetch and display lyrics from [PetitLyrics](https://petitlyrics.com/), with timed lyrics support (in-progress)
- Display timed lyrics above the home feed
- Accessibility service for fine volume control, even when screen is off if device is rooted

#### YouTube parity
- Home feed (with filters support)
- Song radio (with filters support)
- Radio builder
- Like/dislike songs
- Subscribe/unsubscribe from artists
- Display artists and playlists (in-progress)

#### Other
- UI theme editor
- Option to automatically use a colour from the current song thumbnail as the theme accent colour
- Customisable Discord rich presence (with image support) using [KizzyRPC](https://github.com/dead8309/KizzyRPC)
- Display furigana for Japanese kanji using [Kuromoji](https://github.com/atilika/kuromoji)

And more

## Planned features
- Full offline functionality
- Use [UtaTen](https://utaten.com/) as fallback for lyrics
- Playlists

## About the project
This project was started after I got tired of dealing with YouTube's official music app's lack of language features and customisation. I tried several alternatives, but all had at least a few issues that bugged me.

So instead of spending a few weeks learning the codebase of an existing project and contributing to it, I decided to spend almost a year (as of writing) creating my own solution.

## Contributing
Pull requests and feature suggestions (particularly for UI design!) are welcome. This is my first Compose project so there is probably plenty of room for improvement.

## Thanks to
- [ViMusic](https://github.com/vfsfitvnm/ViMusic): A major inspiration for this project
- [ytmusicapi](https://github.com/sigma67/ytmusicapi/): Used as a reference for the YouTube Music API
- [KeyMapper](https://github.com/keymapperorg/KeyMapper): For screen off volume control implementation
- [ExoVisualizer](https://github.com/dzolnai/ExoVisualizer): Music visualiser implementation

## Disclaimer
This project and its contents are not affiliated with, funded, authorized, endorsed by, or in any way associated with YouTube, Google LLC or any of its affiliates and subsidiaries.

Any trademark, service mark, trade name, or other intellectual property rights used in this project are owned by the respective owners.
78 changes: 0 additions & 78 deletions androidApp/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,29 +1,8 @@
import java.io.FileInputStream
import java.util.Properties

plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
}

fun createKeysHashTable(): String {
val keys_file = rootProject.file("keys.properties")
if (keys_file.exists()) {
val keys = Properties()
keys.load(FileInputStream(keys_file))

var value = ""
for (key in keys) {
value += String.format("put(\"%s\",%s); ", key.key, key.value)
}

return String.format("%s%s%s", "new java.util.Hashtable<String, String>(){{ ", value, "}}")
}
else {
return "null"
}
}

android {
signingConfigs {
getByName("debug") {
Expand Down Expand Up @@ -73,15 +52,6 @@ android {
targetCompatibility = JavaVersion.VERSION_11
}

// splits {
// abi {
// enable = true
// reset()
// include("x86", "x86_64", "armeabi-v7a", "arm64-v8a")
// universalApk = true
// }
// }

kotlinOptions {
jvmTarget = JavaVersion.VERSION_11.toString()
}
Expand Down Expand Up @@ -116,54 +86,6 @@ android {
dependencies {
implementation(project(":shared"))
}
// this.configure {
// java.srcDir(buildConfigDir)
// }
}
}
}


configurations.all {
resolutionStrategy.cacheChangingModulesFor(0, "seconds")
}

var compose_version = "1.2.1"

dependencies {
implementation("androidx.core:core-ktx:1.9.0")
implementation("androidx.compose.material3:material3:1.0.0-alpha11")
implementation("androidx.compose.ui:ui:$compose_version")
implementation("androidx.compose.ui:ui-tooling-preview:$compose_version")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.3.1")
implementation("androidx.activity:activity-compose:1.3.1")
implementation("androidx.fragment:fragment-ktx:1.3.0-alpha07")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.3")
androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")
androidTestImplementation("androidx.compose.ui:ui-test-junit4:$compose_version")
debugImplementation("androidx.compose.ui:ui-tooling:$compose_version")
debugImplementation("androidx.compose.ui:ui-test-manifest:$compose_version")
implementation("androidx.compose.material:material-icons-extended:$compose_version")
implementation("org.jetbrains.kotlin:kotlin-reflect:1.7.10")
implementation("net.openid:appauth:0.11.1")
implementation("androidx.palette:palette:1.0.0")

implementation("com.google.accompanist:accompanist-pager:0.21.2-beta")
implementation("com.google.accompanist:accompanist-pager-indicators:0.21.2-beta")
implementation("com.google.accompanist:accompanist-systemuicontroller:0.21.2-beta")
implementation("com.google.accompanist:accompanist-swiperefresh:0.21.2-beta")

// Shared
implementation("com.beust:klaxon:5.5")
implementation("com.godaddy.android.colorpicker:compose-color-picker:0.7.0")
implementation("com.github.TeamNewPipe:NewPipeExtractor:v0.22.1")
implementation("org.apache.commons:commons-text:1.10.0")
implementation("com.atilika.kuromoji:kuromoji-ipadic:0.9.0")
implementation("org.burnoutcrew.composereorderable:reorderable:0.9.2")

// Exoplayer
implementation(project(":library-core"))
implementation(project(":library-ui"))
implementation(project(":extension-mediasession"))
}
97 changes: 0 additions & 97 deletions launch

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.spectre7.exovisualiser
package com.spectre7.spmp.exovisualiser

import androidx.compose.foundation.Canvas
import androidx.compose.runtime.*
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.spectre7.exovisualiser
package com.spectre7.spmp.exovisualiser

import android.media.AudioTrack
import android.media.AudioTrack.ERROR_BAD_VALUE
Expand Down Expand Up @@ -227,4 +227,4 @@ class FFTAudioProcessor : AudioProcessor {
processBuffer = AudioProcessor.EMPTY_BUFFER
inputAudioFormat = AudioProcessor.AudioFormat(Format.NO_VALUE,Format.NO_VALUE,Format.NO_VALUE)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ import com.google.android.exoplayer2.upstream.ResolvingDataSource
import com.google.android.exoplayer2.upstream.cache.LeastRecentlyUsedCacheEvictor
import com.google.android.exoplayer2.upstream.cache.SimpleCache
import com.spectre7.spmp.PlayerServiceHost
import com.spectre7.exovisualiser.ExoVisualizer
import com.spectre7.exovisualiser.FFTAudioProcessor
import com.spectre7.spmp.exovisualiser.ExoVisualizer
import com.spectre7.spmp.exovisualiser.FFTAudioProcessor
import com.spectre7.spmp.model.MediaItem
import com.spectre7.spmp.model.Settings
import com.spectre7.spmp.model.Song
Expand Down

0 comments on commit b139803

Please sign in to comment.