Remove Android submodule and update to mobile-only structure

This commit is contained in:
Tomas Dvorak
2026-03-18 20:02:53 +01:00
parent 5152d9dfeb
commit 72358288cd
4 changed files with 564 additions and 181 deletions
+193 -178
View File
@@ -1,11 +1,11 @@
<div align="center" style="display: flex; justify-content: center; align-items: center;">
<img class="lo" src='https://github.com/swingmx/swingmusic/raw/master/.github/images/logo-fill.light.svg' style="height: 4rem">
</div>
<div align="center" style="font-size: 2rem"><b>Swing Music</b></div>
<div align="center" style="font-size: 2rem"><b>SwingMusic Extended</b></div>
<div align="center"><b><sub><code>v2.1.0</code></sub></b></div>
<div align="center"><b><sub><code>v2.1.4</code></sub></b></div>
**<div align="center" style="padding-top: 1.25rem">[Download](https://swingmx.com/downloads) • [Get Android Client](https://github.com/swingmx/android) • <a href="https://github.com/sponsors/swingmx" target="_blank">Sponsor Us ❤️</a> • [Docs](https://swingmx.com/guide/introduction.html) • [Screenshots](https://swingmx.com) • [r/SwingMusicApp](https://www.reddit.com/r/SwingMusicApp)</div>**
**<div align="center" style="padding-top: 1.25rem">[Web Client](https://github.com/Dvorinka/swingmusic-extended-webclient) • [Desktop App](https://github.com/Dvorinka/swingmusic-extended-desktop) • [Android App](https://github.com/Dvorinka/swingmusic-extended-android) • [Mobile App](https://github.com/Dvorinka/swingmusic-mobile) • <a href="https://github.com/sponsors/Dvorinka" target="_blank">Sponsor Us ❤️</a></div>**
##
@@ -13,108 +13,153 @@
##
Swing Music is a fast and beautiful, self-hosted music player for your local audio files. Like a cooler Spotify ... but bring your own music. Just run the app and enjoy your music library in a web browser.
SwingMusic Extended is a comprehensive, multi-platform music player ecosystem for your local audio files. Like a cooler Spotify ... but bring your own music. This monorepo contains the backend server and orchestrates all client applications.
## Features
## 🚀 Platform Overview
- **Daily Mixes** - curated everyday based on your listening activity
- **Metadata normalization** - a clean and consistent library
- **Album versioning** - normalized albums and association with version labels (eg. Deluxe, Remaster, etc)
- **Related artist and albums**
- **Folder view** - Browse your music library by folders
- **Playlist management**
- **Beautiful browser based UI**
- **Silence detection** - Combine cross-fade with silence detection to create a seamless listening experience
- **Collections** - Group albums and artists based on your preferences
- **Statistics** - Get insights into your listening activity
- **Lyrics view**
- **Android client**
- **Last.fm scrobbling**
- **Multi-user support**
- **Cross-platform** - Windows, Linux, MacOS (coming soon), arm64, x86
- **Blazingly fast**
- **Pure awesomeness**
### 🌐 **Web Client** - [swingmusic-extended-webclient](https://github.com/Dvorinka/swingmusic-extended-webclient)
- **Status**: ✅ Fully Implemented
- **Technology**: Vue 3, TypeScript, Vite, Tailwind CSS
- **Features**: Progressive Web App, Spotify integration, universal downloader, audio quality controls
- **Installation**: `yarn install && yarn dev`
### Installation
### 🖥️ **Desktop App** - [swingmusic-extended-desktop](https://github.com/Dvorinka/swingmusic-extended-desktop)
- **Status**: ✅ Fully Implemented
- **Technology**: Tauri, Rust, Vue.js
- **Features**: Native performance, system tray integration, global hotkeys, file associations
- **Installation**: `npm install && npm run dev`
Swing Music is available as pre-compiled binaries for Windows and Linux. Just download the latest release from the [downloads page](https://swingmusic.vercel.app/downloads) and launch it.
### 📱 **Android App** - [swingmusic-extended-android](https://github.com/Dvorinka/swingmusic-extended-android)
- **Status**: ✅ Fully Implemented
- **Technology**: Kotlin, Jetpack Compose, Android SDK
- **Features**: Material Design 3, offline mode, analytics, background playback
- **Installation**: `./gradlew assembleDebug`
[FFmpeg](https://ffmpeg.org/) is needed for the audio silence skip feature, so you need to install it first. On windows, you can follows [this tutorial](https://phoenixnap.com/kb/ffmpeg-windows) to install FFmpeg.
### 📲 **Flutter Mobile App** - [swingmusic-mobile](https://github.com/Dvorinka/swingmusic-mobile)
- **Status**: 🔄 In Development
- **Technology**: Flutter, Dart
- **Features**: Cross-platform mobile (iOS/Android), unified UI with web client
- **Installation**: `flutter pub get && flutter run`
On Linux, you can install FFmpeg using:
## 🎯 Core Features
```sh
sudo apt-get install ffmpeg libev-dev libavcodec-extra -y
### Backend Server (This Repository)
- **Multi-Platform Support** - Serves all client applications
- **Advanced Audio Processing** - Cross-fade, silence detection, gapless playback
- **Metadata Management** - Automatic normalization and organization
- **Multi-User Support** - Individual user profiles and preferences
- **API Integration** - RESTful API with WebSocket support
- **Real-Time Sync** - Synchronizes across all platforms
### Universal Features Across All Platforms
- **Daily Mixes** - Curated playlists based on listening activity
- **Advanced Search** - Full-text search with filters and suggestions
- **Playlist Management** - Create, edit, and organize playlists
- **Folder View** - Browse music by directory structure
- **Statistics & Analytics** - Comprehensive listening insights
- **Lyrics Display** - Real-time lyrics synchronization
- **Last.fm Integration** - Automatic scrobbling
- **Theme Support** - Light/dark modes with system awareness
## 🏗️ Project Structure
```
SwingMusic Extended/
├── src/ # Backend server (Python/FastAPI)
├── swingmusic-webclient/ # Vue.js web application
├── swingmusic-desktop/ # Tauri desktop application
├── swingmusic-android/ # Android native application
├── swingmusic_mobile/ # Flutter cross-platform mobile
├── services/ # Additional services and scripts
└── docs/ # Documentation
```
The `libev` package is needed on Linux and MacOS. You can install it on other system as shown:
## 🚀 Quick Start
```sh
# Arch Linux
pacman -S libev
### Prerequisites
- **Python** 3.11+ for backend
- **Node.js** 19+ for web client development
- **Flutter** 3.0+ for mobile app
- **Android Studio** for Android development
- **Rust** 1.70+ for desktop development
# Fedora, CentOS
dnf install libev-devel
# MacOS
brew install libev
```
Then make the file executable first.
### Backend Installation
1. **Clone this repository**:
```bash
chmod a+x ./swingmusic
./swingmusic
git clone https://github.com/Dvorinka/swingmusic-extended.git
cd swingmusic-extended
```
The app should start at <http://localhost:1970> by default. Open it in your browser to configure and use Swing Music. You can change the default port by using the `--port` flag.
2. **Install dependencies**:
```bash
# Using uv (recommended)
uv sync
```sh
./swingmusic --port 1980
# Or using pip
pip install -r requirements.txt
```
> [!IMPORTANT]
> The default password for user `admin` is "admin". Please change the password via the settings after first login.
3. **Install system dependencies**:
To stream your music from your Android device, you can download the [Android mobile client](https://github.com/swingmx/android).
**FFmpeg** (required for audio processing):
```bash
# Ubuntu/Debian
sudo apt-get install ffmpeg libev-dev libavcodec-extra -y
### Options
# macOS
brew install ffmpeg libev
Options flags can be passed when starting the app in the terminal to tweak runtime settings or perform tasks. You can use the `-h` flag to see all supported options.
> [!TIP]
> You can read more about options in [the docs](https://swingmusic.vercel.app/guide/getting-started.html#options).
### Docker
Pull the latest Docker image and run it:
```sh
docker pull ghcr.io/swingmx/swingmusic:latest
# Windows
# Download from https://ffmpeg.org/
```
```sh
docker run --name swingmusic -p 1970:1970 \
-v /path/to/music:/music \
-v /path/to/config:/config \
--restart unless-stopped \
ghcr.io/swingmx/swingmusic:latest
4. **Run the server**:
```bash
uv run python run.py
```
Don't forget to replace `/path/to/music` and `/path/to/config` with the appropriate values. In addition, specify the the `/music` directory as the root directory. Using the `Home Directory` option won't work.
The server will start at `http://localhost:1970` by default.
> [!TIP]
> For more info, see the [Docker section](https://swingmusic.vercel.app/guide/getting-started.html#docker) on the docs.
### Client Applications
#### Using Docker Compose
Each client application has its own repository with detailed setup instructions:
Here's a sample Docker compose file:
- **Web Client**: See [swingmusic-extended-webclient](https://github.com/Dvorinka/swingmusic-extended-webclient)
- **Desktop App**: See [swingmusic-extended-desktop](https://github.com/Dvorinka/swingmusic-extended-desktop)
- **Android App**: See [swingmusic-extended-android](https://github.com/Dvorinka/swingmusic-extended-android)
- **Flutter Mobile**: See [swingmusic-mobile](https://github.com/Dvorinka/swingmusic-mobile)
## 🔧 Configuration
### Server Options
```bash
# Change port
uv run python run.py --port 1980
# Enable debug mode
uv run python run.py --debug
# Set music directory
uv run python run.py --music-dir /path/to/music
# All options
uv run python run.py --help
```
### Environment Variables
- `SWINGMUSIC_PORT` - Server port (default: 1970)
- `SWINGMUSIC_MUSIC_DIR` - Music library path
- `SWINGMUSIC_CONFIG_DIR` - Configuration directory
- `SWINGMUSIC_LOG_LEVEL` - Logging level
## 🐳 Docker Deployment
### Using Docker Compose
```yaml
services:
swingmusic:
image: ghcr.io/swingmx/swingmusic:latest
image: ghcr.io/Dvorinka/swingmusic-extended:latest
container_name: swingmusic
volumes:
- /path/to/music:/music
@@ -122,124 +167,94 @@ services:
ports:
- "1970:1970"
restart: unless-stopped
environment:
- SWINGMUSIC_PORT=1970
```
### Contributing and Development
### Manual Docker
```bash
docker pull ghcr.io/Dvorinka/swingmusic-extended:latest
Swing Music is looking for contributors. If you're interested, please join us at the [Swing Music Community](https://t.me/+9n61PFcgKhozZDE0) group on Telegram. For more information, take a look at https://github.com/swing-opensource/swingmusic/issues/186.
[**CONTRIBUTING GUIDELINES**](.github/contributing.md).
> [!TIP]
> This project runs on Python 3.11 or newer and uses [uv](https://docs.astral.sh/uv) to manage dependencies. Please [install uv](https://docs.astral.sh/uv/getting-started/installation/) before continuing for an easy setup.
To set up this project on your computer follow the following steps:
```sh
# 1. Fork the project
git clone https://github.com/swingmx/swingmusic.git
# or via SSH
git clone git@github.com:swingmx/swingmusic.git
docker run --name swingmusic -p 1970:1970 \
-v /path/to/music:/music \
-v /path/to/config:/config \
--restart unless-stopped \
ghcr.io/Dvorinka/swingmusic-extended:latest
```
```sh
# 2. Install dependencies
## 🛠️ Development
uv sync
### Backend Development
```bash
# Install development dependencies
uv sync --dev
# Run with hot reload
uv run python run.py --reload
# Run tests
uv run pytest
# Run with coverage
uv run pytest --cov=src
```
> [!TIP]
> The `libev` package is needed on Linux and MacOS. You can install it on other system as shown:
>
> ```sh
> # Arch Linux
> pacman -S libev
>
> # Fedora, CentOS
> dnf install libev-devel
>
> # MacOS
> brew install libev
> ```
### Updating Submodules
```bash
# Update all submodules
git submodule update --remote --merge
```sh
# 4. Run the program
# Update specific submodule
git submodule update --remote swingmusic-webclient
uv run python run.py
# Initialize after cloning
git submodule update --init --recursive
```
### License
## 📊 Platform Implementation Status
This software is provided to you with terms stated in the [AGPLv3 License](https://github.com/swingmx/swingmusic/blob/master/LICENSE) or any later version. Read the full text in the `LICENSE` file located at the root of this repository.
| Platform | Status | Features | Last Updated |
|----------|--------|----------|-------------|
| **Backend** | ✅ Complete | Full API, multi-user, real-time sync | Active |
| **Web Client** | ✅ Complete | PWA, Spotify integration, downloader | Active |
| **Desktop App** | ✅ Complete | Native performance, system integration | Active |
| **Android App** | ✅ Complete | Material Design 3, offline mode | Active |
| **Flutter Mobile** | 🔄 In Development | Cross-platform iOS/Android | In Progress |
### Contributors
## 🤝 Contributing
Shout out to the following code contributors who have helped maintain and improve Swing Music:
We welcome contributions! Please see our [Contributing Guidelines](.github/CONTRIBUTING.md) for details.
<div align="left">
<table>
<tr>
<td align="center">
<a href="https://github.com/cwilvx">
<img src="https://github.com/cwilvx.png" width="80px;"/>
<br />
<sub><b>@cwilvx</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/Ericgacoki">
<img src="https://github.com/Ericgacoki.png" width="80px;" alt=""/>
<br />
<sub><b>@Ericgacoki</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/Simonh2o">
<img src="https://github.com/Simonh2o.png" width="80px;"/>
<br />
<sub><b>@Simonh2o</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/tcsenpai">
<img src="https://github.com/tcsenpai.png" width="80px;"/>
<br />
<sub><b>@tcsenpai</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/jensgrunzer1">
<img src="https://github.com/jensgrunzer1.png" width="80px;"/>
<br />
<sub><b>@jensgrunzer1</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/Type-Delta">
<img src="https://github.com/Type-Delta.png" width="80px;" alt=""/>
<br />
<sub><b>@Type-Delta</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/MarcOrfilaCarreras">
<img src="https://github.com/MarcOrfilaCarreras.png" width="80px;" alt=""/>
<br />
<sub><b>@MarcOrfilaCarreras</b></sub>
</a>
</td>
</tr>
<tr>
<td align="center">
<a href="https://github.com/tralph3">
<img src="https://github.com/tralph3.png" width="80px;" alt=""/>
<br />
<sub><b>@tralph3</b></sub>
</a>
</td>
</tr>
</table>
</div>
### Development Workflow
1. Fork this repository
2. Create a feature branch
3. Make your changes
4. Test across all platforms
5. Submit a pull request
### Platform-Specific Contributions
- **Backend**: Submit PRs to this repository
- **Web Client**: Submit PRs to [swingmusic-extended-webclient](https://github.com/Dvorinka/swingmusic-extended-webclient)
- **Desktop App**: Submit PRs to [swingmusic-extended-desktop](https://github.com/Dvorinka/swingmusic-extended-desktop)
- **Android App**: Submit PRs to [swingmusic-extended-android](https://github.com/Dvorinka/swingmusic-extended-android)
- **Flutter Mobile**: Submit PRs to [swingmusic-mobile](https://github.com/Dvorinka/swingmusic-mobile)
## 📄 License
This project is licensed under the AGPL-3.0 License - see the [LICENSE](LICENSE) file for details.
## 🔗 Links
- **Main Repository**: [swingmusic-extended](https://github.com/Dvorinka/swingmusic-extended)
- **Web Client**: [swingmusic-extended-webclient](https://github.com/Dvorinka/swingmusic-extended-webclient)
- **Desktop App**: [swingmusic-extended-desktop](https://github.com/Dvorinka/swingmusic-extended-desktop)
- **Android App**: [swingmusic-extended-android](https://github.com/Dvorinka/swingmusic-extended-android)
- **Flutter Mobile**: [swingmusic-mobile](https://github.com/Dvorinka/swingmusic-mobile)
## 🙏 Acknowledgments
Based on the original [SwingMusic](https://github.com/swingmx/swingmusic) by swingmx, extended with additional platforms and features.
---
**Built with ❤️ by the SwingMusic Extended community**