Skip to content

Commit ddaf2a9

Browse files
committed
Initial commit
0 parents  commit ddaf2a9

262 files changed

Lines changed: 24317 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Miscellaneous
2+
*.class
3+
*.log
4+
*.pyc
5+
*.swp
6+
.DS_Store
7+
.atom/
8+
.build/
9+
.buildlog/
10+
.history
11+
.svn/
12+
.swiftpm/
13+
migrate_working_dir/
14+
15+
# IntelliJ related
16+
*.iml
17+
*.ipr
18+
*.iws
19+
.idea/
20+
21+
# The .vscode folder contains launch configuration and tasks you configure in
22+
# VS Code which you may wish to be included in version control, so this line
23+
# is commented out by default.
24+
#.vscode/
25+
26+
# Flutter/Dart/Pub related
27+
**/doc/api/
28+
**/ios/Flutter/.last_build_id
29+
.dart_tool/
30+
.flutter-plugins-dependencies
31+
.pub-cache/
32+
.pub/
33+
/build/
34+
/coverage/
35+
36+
# Symbolication related
37+
app.*.symbols
38+
39+
# Obfuscation related
40+
app.*.map.json
41+
42+
# Android Studio will place build artifacts here
43+
/android/app/debug
44+
/android/app/profile
45+
/android/app/release

.metadata

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# This file tracks properties of this Flutter project.
2+
# Used by Flutter tool to assess capabilities and perform upgrades etc.
3+
#
4+
# This file should be version controlled and should not be manually edited.
5+
6+
version:
7+
revision: "f5a8537f90d143abd5bb2f658fa69c388da9677b"
8+
channel: "stable"
9+
10+
project_type: app
11+
12+
# Tracks metadata for the flutter migrate command
13+
migration:
14+
platforms:
15+
- platform: root
16+
create_revision: f5a8537f90d143abd5bb2f658fa69c388da9677b
17+
base_revision: f5a8537f90d143abd5bb2f658fa69c388da9677b
18+
- platform: android
19+
create_revision: f5a8537f90d143abd5bb2f658fa69c388da9677b
20+
base_revision: f5a8537f90d143abd5bb2f658fa69c388da9677b
21+
- platform: ios
22+
create_revision: f5a8537f90d143abd5bb2f658fa69c388da9677b
23+
base_revision: f5a8537f90d143abd5bb2f658fa69c388da9677b
24+
- platform: linux
25+
create_revision: f5a8537f90d143abd5bb2f658fa69c388da9677b
26+
base_revision: f5a8537f90d143abd5bb2f658fa69c388da9677b
27+
- platform: macos
28+
create_revision: f5a8537f90d143abd5bb2f658fa69c388da9677b
29+
base_revision: f5a8537f90d143abd5bb2f658fa69c388da9677b
30+
- platform: web
31+
create_revision: f5a8537f90d143abd5bb2f658fa69c388da9677b
32+
base_revision: f5a8537f90d143abd5bb2f658fa69c388da9677b
33+
- platform: windows
34+
create_revision: f5a8537f90d143abd5bb2f658fa69c388da9677b
35+
base_revision: f5a8537f90d143abd5bb2f658fa69c388da9677b
36+
37+
# User provided section
38+
39+
# List of Local paths (relative to this file) that should be
40+
# ignored by the migrate tool.
41+
#
42+
# Files that are not part of the templates will be ignored by default.
43+
unmanaged_files:
44+
- 'lib/main.dart'
45+
- 'ios/Runner.xcodeproj/project.pbxproj'

README.md

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# Musly - Subsonic Client
2+
3+
A beautiful Flutter music streaming client with an Apple Music-inspired UI for Subsonic-compatible servers.
4+
5+
## Features
6+
7+
- 🎵 **Music Streaming** - Stream music from your Subsonic server
8+
- 🎨 **Apple Music UI** - Beautiful, modern interface inspired by Apple Music
9+
- 🌙 **Dark/Light Mode** - Automatic theme switching based on system settings
10+
- 📱 **Responsive Design** - Works on phones and tablets
11+
- 🔍 **Search** - Search artists, albums, and songs
12+
- 📚 **Library** - Browse your music collection
13+
- 📋 **Playlists** - View and manage playlists
14+
- ▶️ **Now Playing** - Full-featured music player with controls
15+
- 🔀 **Shuffle & Repeat** - Control playback modes
16+
- 📊 **Queue Management** - View and modify the play queue
17+
18+
## Getting Started
19+
20+
### Prerequisites
21+
22+
- Flutter SDK 3.10.0 or higher
23+
- A Subsonic-compatible music server (Subsonic, Navidrome, Airsonic, etc.)
24+
25+
### Installation
26+
27+
1. Install dependencies:
28+
```bash
29+
flutter pub get
30+
```
31+
2. Run the app:
32+
```bash
33+
flutter run
34+
```
35+
36+
### Connecting to Your Server
37+
38+
1. Launch the app
39+
2. Enter your Subsonic server URL (e.g., `https://your-server.com`)
40+
3. Enter your username and password
41+
4. Toggle "Legacy Authentication" if using an older server
42+
5. Tap "Connect"
43+
44+
## Project Structure
45+
46+
```
47+
lib/
48+
├── main.dart # App entry point
49+
├── models/ # Data models
50+
├── services/ # API and storage services
51+
├── providers/ # State management
52+
├── screens/ # UI screens
53+
├── widgets/ # Reusable widgets
54+
└── theme/ # App theming
55+
```
56+
57+
## Supported Servers
58+
59+
Musly works with any Subsonic API-compatible server:
60+
61+
- [Subsonic](http://www.subsonic.org/)
62+
- [Navidrome](https://www.navidrome.org/)
63+
- [Airsonic](https://airsonic.github.io/)
64+
- [Gonic](https://github.com/sentriz/gonic)
65+
66+
## License
67+
68+
This project is open source and available under the MIT License.

analysis_options.yaml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# This file configures the analyzer, which statically analyzes Dart code to
2+
# check for errors, warnings, and lints.
3+
#
4+
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
5+
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
6+
# invoked from the command line by running `flutter analyze`.
7+
8+
# The following line activates a set of recommended lints for Flutter apps,
9+
# packages, and plugins designed to encourage good coding practices.
10+
include: package:flutter_lints/flutter.yaml
11+
12+
linter:
13+
# The lint rules applied to this project can be customized in the
14+
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
15+
# included above or to enable additional rules. A list of all available lints
16+
# and their documentation is published at https://dart.dev/lints.
17+
#
18+
# Instead of disabling a lint rule for the entire project in the
19+
# section below, it can also be suppressed for a single line of code
20+
# or a specific dart file by using the `// ignore: name_of_lint` and
21+
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
22+
# producing the lint.
23+
rules:
24+
# avoid_print: false # Uncomment to disable the `avoid_print` rule
25+
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
26+
27+
# Additional information about this file can be found at
28+
# https://dart.dev/guides/language/analysis-options

android/.gitignore

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
gradle-wrapper.jar
2+
/.gradle
3+
/captures/
4+
/gradlew
5+
/gradlew.bat
6+
/local.properties
7+
GeneratedPluginRegistrant.java
8+
.cxx/
9+
10+
# Remember to never publicly share your keystore.
11+
# See https://flutter.dev/to/reference-keystore
12+
key.properties
13+
**/*.keystore
14+
**/*.jks

android/app/build.gradle.kts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
plugins {
2+
id("com.android.application")
3+
id("kotlin-android")
4+
id("dev.flutter.flutter-gradle-plugin")
5+
}
6+
7+
android {
8+
namespace = "com.musly.musly"
9+
compileSdk = flutter.compileSdkVersion
10+
ndkVersion = flutter.ndkVersion
11+
12+
compileOptions {
13+
sourceCompatibility = JavaVersion.VERSION_17
14+
targetCompatibility = JavaVersion.VERSION_17
15+
}
16+
17+
kotlinOptions {
18+
jvmTarget = JavaVersion.VERSION_17.toString()
19+
}
20+
21+
defaultConfig {
22+
applicationId = "com.musly.musly"
23+
minSdk = flutter.minSdkVersion
24+
targetSdk = flutter.targetSdkVersion
25+
versionCode = flutter.versionCode
26+
versionName = flutter.versionName
27+
}
28+
29+
buildTypes {
30+
release {
31+
signingConfig = signingConfigs.getByName("debug")
32+
}
33+
}
34+
}
35+
36+
dependencies {
37+
implementation("androidx.media:media:1.7.0")
38+
implementation("androidx.core:core-ktx:1.13.1")
39+
}
40+
41+
flutter {
42+
source = "../.."
43+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
2+
<!-- The INTERNET permission is required for development. Specifically,
3+
the Flutter tool needs it to communicate with the running application
4+
to allow setting breakpoints, to provide hot reload, etc.
5+
-->
6+
<uses-permission android:name="android.permission.INTERNET"/>
7+
</manifest>
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
2+
<!-- Network and basic permissions -->
3+
<uses-permission android:name="android.permission.INTERNET"/>
4+
<uses-permission android:name="android.permission.WAKE_LOCK"/>
5+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
6+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK"/>
7+
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
8+
9+
<!-- Bluetooth permissions for AVRCP metadata transmission -->
10+
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30"/>
11+
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30"/>
12+
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
13+
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation"/>
14+
15+
<!-- Media and audio permissions -->
16+
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
17+
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
18+
19+
<!-- Samsung-specific permissions -->
20+
<uses-permission android:name="com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY"/>
21+
<uses-permission android:name="com.samsung.android.sdk.look.permission.READ"/>
22+
23+
<!-- Optional features -->
24+
<uses-feature android:name="android.hardware.bluetooth" android:required="false"/>
25+
<uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/>
26+
27+
<application
28+
android:label="musly"
29+
android:name="${applicationName}"
30+
android:icon="@mipmap/ic_launcher"
31+
android:usesCleartextTraffic="true"
32+
android:networkSecurityConfig="@xml/network_security_config">
33+
34+
<!-- Android Auto Support -->
35+
<meta-data
36+
android:name="com.google.android.gms.car.application"
37+
android:resource="@xml/automotive_app_desc"/>
38+
39+
<activity
40+
android:name=".MainActivity"
41+
android:exported="true"
42+
android:launchMode="singleTop"
43+
android:taskAffinity=""
44+
android:theme="@style/LaunchTheme"
45+
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
46+
android:hardwareAccelerated="true"
47+
android:windowSoftInputMode="adjustResize">
48+
<!-- Specifies an Android theme to apply to this Activity as soon as
49+
the Android process has started. This theme is visible to the user
50+
while the Flutter UI initializes. After that, this theme continues
51+
to determine the Window background behind the Flutter UI. -->
52+
<meta-data
53+
android:name="io.flutter.embedding.android.NormalTheme"
54+
android:resource="@style/NormalTheme"
55+
/>
56+
<intent-filter>
57+
<action android:name="android.intent.action.MAIN"/>
58+
<category android:name="android.intent.category.LAUNCHER"/>
59+
</intent-filter>
60+
</activity>
61+
62+
<!-- Media Browser Service for Android Auto -->
63+
<service
64+
android:name=".MusicService"
65+
android:exported="true"
66+
android:enabled="true"
67+
android:stopWithTask="false"
68+
android:foregroundServiceType="mediaPlayback">
69+
<intent-filter>
70+
<action android:name="android.media.browse.MediaBrowserService"/>
71+
</intent-filter>
72+
</service>
73+
74+
<!-- Media Button Receiver -->
75+
<receiver
76+
android:name="androidx.media.session.MediaButtonReceiver"
77+
android:exported="true">
78+
<intent-filter>
79+
<action android:name="android.intent.action.MEDIA_BUTTON"/>
80+
</intent-filter>
81+
</receiver>
82+
83+
<!-- Auto Start Receiver for background service -->
84+
<receiver
85+
android:name=".AutoStartReceiver"
86+
android:enabled="true"
87+
android:exported="true">
88+
<intent-filter>
89+
<action android:name="android.intent.action.BOOT_COMPLETED"/>
90+
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
91+
</intent-filter>
92+
</receiver>
93+
94+
<!-- Don't delete the meta-data below.
95+
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
96+
<meta-data
97+
android:name="flutterEmbedding"
98+
android:value="2" />
99+
</application>
100+
101+
<!-- Required to query activities that can process text, see:
102+
https://developer.android.com/training/package-visibility and
103+
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
104+
105+
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
106+
<queries>
107+
<intent>
108+
<action android:name="android.intent.action.PROCESS_TEXT"/>
109+
<data android:mimeType="text/plain"/>
110+
</intent>
111+
</queries>
112+
</manifest>

0 commit comments

Comments
 (0)