Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
ba3e1ce
style(prettier): add prettier config and ignore files
Mahmoud-walid May 14, 2026
f511739
feat: add prettier, camera support, and project updates
Mahmoud-walid May 14, 2026
89dc6f0
feat(scripts): add scripts to export project files to formatted markdown
Mahmoud-walid May 14, 2026
e4d01a8
feat(theme): add light theme and ThemeType
Mahmoud-walid May 14, 2026
134453d
feat(ui): add reusable skeleton loading component
Mahmoud-walid May 14, 2026
f46f0f0
refactor(aimpLogo): clean up component code and add TS types
Mahmoud-walid May 14, 2026
4504e17
fix(types): correct type definitions and clean up code
Mahmoud-walid May 14, 2026
46297b0
feat(appContext): add theme support to settings
Mahmoud-walid May 14, 2026
833667b
style(useAppState): fix quote style and trailing newline
Mahmoud-walid May 14, 2026
df508e7
refactor(useAIMP): add types and improve robustness
Mahmoud-walid May 14, 2026
75c2be5
style(player/normalButton): format component code
Mahmoud-walid May 14, 2026
491a2c9
style(ui/header): reformat and add optional chaining
Mahmoud-walid May 14, 2026
7cf0f4f
feat(connect): add AIMP connect screen with manual and QR scan
Mahmoud-walid May 14, 2026
42bc4ba
style(songDetails): format code and standardize indentation
Mahmoud-walid May 14, 2026
0869d70
fix(soundWave): correct useEffect dependencies and format code
Mahmoud-walid May 14, 2026
427d3fc
style(playlist-details-header): format component code
Mahmoud-walid May 14, 2026
8b8db78
feat: add theme support and improve type safety
Mahmoud-walid May 14, 2026
c46919f
style(drawerNavigation): format code for consistent styling
Mahmoud-walid May 14, 2026
b48e302
style(togglePlayer): format code to consistent style
Mahmoud-walid May 14, 2026
2ff105e
refactor(settings): add theme support and replace Toast
Mahmoud-walid May 14, 2026
c0cb3c8
refactor(playlist): clean up component and improve type safety
Mahmoud-walid May 14, 2026
2a21370
style(player layout): format code for improved readability
Mahmoud-walid May 14, 2026
ccccf3f
feat(app): add theme support, responsive layout, auto redirect and lo…
Mahmoud-walid May 15, 2026
d1cd707
build: add remote build script and dev tooling
Mahmoud-walid May 20, 2026
e8d43a3
feat(builder): add remote expo build script
Mahmoud-walid May 20, 2026
34045a7
refactor(useAIMP): optimize state updates & cleanup
Mahmoud-walid May 20, 2026
d4a692b
feat(utils): add formatTimeHelper utility function
Mahmoud-walid May 20, 2026
84030c5
feat(types): add optional name, filename, duration
Mahmoud-walid May 20, 2026
bdf83bd
feat(ui): add offline connection failed screen
Mahmoud-walid May 20, 2026
875f5d6
fix(playlist): add metadata fallbacks & clean code
Mahmoud-walid May 20, 2026
7dcb353
fix(playlist): improve search with fallback titles
Mahmoud-walid May 20, 2026
9119628
refactor(player): clean up UI, fix time handling and improve error lo…
Mahmoud-walid May 20, 2026
644e824
feat(home): add offline support and refactor data fetching
Mahmoud-walid May 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* text=auto eol=lf
11 changes: 11 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
node_modules
dist
build
coverage
.expo
.idea
.vscode
package-lock.json
assets
android
ios
7 changes: 7 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"semi": true,
"singleQuote": true,
"bracketSpacing": true,
"printWidth": 230,
"endOfLine": "lf"
}
2 changes: 1 addition & 1 deletion .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{ "recommendations": ["expo.vscode-expo-tools"] }
{ "recommendations": ["expo.vscode-expo-tools", "esbenp.prettier-vscode"] }
23 changes: 18 additions & 5 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,20 @@
{
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll": "explicit",
"source.organizeImports": "explicit",
"source.sortMembers": "explicit"
}
}
"source.fixAll.eslint": "explicit",
"source.organizeImports": "never"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"files.eol": "\n"
}
78 changes: 41 additions & 37 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ It includes real-time playback updates, playlist browsing, now playing controls,
[![TypeScript](https://img.shields.io/badge/TypeScript-5.x-3178C6?style=flat&logo=typescript)](https://www.typescriptlang.org)
[![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)

| Home | Player | Extra Info |
| :---: | :---: | :---: |
| Home | Player | Extra Info |
| :--------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------: |
| ![Home](https://github.com/user-attachments/assets/214523d4-9677-44c7-8fcb-57cfd67f07c2) | ![Player](https://github.com/user-attachments/assets/d94276e6-2820-4187-94c0-4fc3679947bd) | ![Extra Info](https://github.com/user-attachments/assets/11bf50d7-a6b7-4aa9-a03d-7c7edc37a9a2) |

| Settings | Playlist Details |
| :---: | :---: |
| Settings | Playlist Details |
| :------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------: |
| ![Settings](https://github.com/user-attachments/assets/2813abbd-a7e6-4a0f-a463-0656fef92fd6) | ![Playlist Details](https://github.com/user-attachments/assets/c0dcf099-6cbc-4b21-8c16-ade8955dd2fc) |

## ✨ Features
Expand Down Expand Up @@ -58,51 +58,51 @@ This app requires the **AIMP Web Control Plugin** running on your PC. The plugin

#### 🎵 Track Information

| Endpoint | Method | Description |
|----------|--------|-------------|
| `/track/info` | GET | Get current track metadata (title, artist, album, etc.) |
| `/track/cover` | GET | Get album artwork for current track |
| `/track/position` | GET | Get current playback position |
| `/track/position` | POST | Set playback position (seek) |
| `/track/duration` | GET | Get track duration |
| Endpoint | Method | Description |
| ----------------- | ------ | ------------------------------------------------------- |
| `/track/info` | GET | Get current track metadata (title, artist, album, etc.) |
| `/track/cover` | GET | Get album artwork for current track |
| `/track/position` | GET | Get current playback position |
| `/track/position` | POST | Set playback position (seek) |
| `/track/duration` | GET | Get track duration |

#### ▶️ Player Controls

| Endpoint | Method | Description |
|----------|--------|-------------|
| `/playerstate` | GET | Get player state (playing/paused/stopped) |
| `/playpause` | GET | Toggle play/pause |
| `/next` | GET | Skip to next track |
| `/previous` | GET | Go to previous track |
| Endpoint | Method | Description |
| -------------- | ------ | ----------------------------------------- |
| `/playerstate` | GET | Get player state (playing/paused/stopped) |
| `/playpause` | GET | Toggle play/pause |
| `/next` | GET | Skip to next track |
| `/previous` | GET | Go to previous track |

#### 🔊 Audio Controls

| Endpoint | Method | Description |
|----------|--------|-------------|
| `/volume` | GET | Get current volume level |
| `/volume` | POST | Set volume level |
| `/mute` | GET | Get mute state |
| `/mute` | POST | Toggle mute on/off |
| Endpoint | Method | Description |
| --------- | ------ | ------------------------ |
| `/volume` | GET | Get current volume level |
| `/volume` | POST | Set volume level |
| `/mute` | GET | Get mute state |
| `/mute` | POST | Toggle mute on/off |

#### 🔀 Playback Modes

| Endpoint | Method | Description |
|----------|--------|-------------|
| `/track/repeat` | GET | Get repeat mode |
| `/track/repeat` | POST | Set repeat mode |
| `/shuffle` | GET | Get shuffle state |
| `/shuffle` | POST | Toggle shuffle on/off |
| Endpoint | Method | Description |
| --------------- | ------ | --------------------- |
| `/track/repeat` | GET | Get repeat mode |
| `/track/repeat` | POST | Set repeat mode |
| `/shuffle` | GET | Get shuffle state |
| `/shuffle` | POST | Toggle shuffle on/off |

#### 📋 Playlists

| Endpoint | Method | Description |
|----------|--------|-------------|
| `/playlist` | GET | Get all playlists |
| `/playlist/current` | GET | Get currently active playlist |
| `/playlist/items` | GET | Get tracks from a specific playlist |
| `/playlist/info` | GET | Get basic playlist information |
| `/playlist/stats` | GET | Get playlist statistics |
| `/playlist/play` | GET | Play a specific track from playlist |
| Endpoint | Method | Description |
| ------------------- | ------ | ----------------------------------- |
| `/playlist` | GET | Get all playlists |
| `/playlist/current` | GET | Get currently active playlist |
| `/playlist/items` | GET | Get tracks from a specific playlist |
| `/playlist/info` | GET | Get basic playlist information |
| `/playlist/stats` | GET | Get playlist statistics |
| `/playlist/play` | GET | Play a specific track from playlist |

#### 🔌 WebSocket Events

Expand All @@ -127,17 +127,20 @@ Connect to `ws://<server-ip>:3554` for real-time updates:
## 🚀 Installation

1. Clone the repository:

```bash
git clone https://github.com/yourusername/aimp-remote.git
cd aimp-remote
```

2. Install dependencies:

```bash
npm install
```

3. Start the app:

```bash
npm run start
```
Expand Down Expand Up @@ -244,6 +247,7 @@ Current communication is **LAN-oriented** and uses HTTP/WebSocket without encryp
⚠️ **Not recommended for production or internet-facing deployments**

For non-local or production-grade scenarios, consider:

- Implementing HTTPS/WSS with valid certificates
- Adding authentication (API keys, OAuth)
- Implementing rate limiting
Expand Down
20 changes: 8 additions & 12 deletions app.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,18 @@
"name": "AIMP Remote Control",
"slug": "aimp-remote",
"version": "1.1.0",
"orientation": "portrait",
"orientation": "default",
"icon": "./assets/icons/adaptive-icon-color.png",
"scheme": "aimpremote",
"userInterfaceStyle": "automatic",
"ios": {
"infoPlist": {
"NSCameraUsageDescription": "This app uses the camera to scan QR codes to connect to the AIMP server."
},
"supportsTablet": true
},
"android": {
"permissions": ["CAMERA"],
"adaptiveIcon": {
"backgroundColor": "#363636",
"foregroundImage": "./assets/icons/adaptive-icon-color.png",
Expand Down Expand Up @@ -42,13 +46,7 @@
[
"expo-font",
{
"fonts": [
"./assets/fonts/MPLUS-Bold.ttf",
"./assets/fonts/MPLUS-ExtraBold.ttf",
"./assets/fonts/MPLUS-Regular.ttf",
"./assets/fonts/MPLUS-Medium.ttf",
"./assets/fonts/MPLUS-Thin.ttf"
]
"fonts": ["./assets/fonts/MPLUS-Bold.ttf", "./assets/fonts/MPLUS-ExtraBold.ttf", "./assets/fonts/MPLUS-Regular.ttf", "./assets/fonts/MPLUS-Medium.ttf", "./assets/fonts/MPLUS-Thin.ttf"]
}
],
[
Expand All @@ -67,14 +65,12 @@
"extra": {
"router": {},
"eas": {
"projectId": "cca8de19-da90-4dff-bdec-f261cd0abbda"
"projectId": "031e69da-7b3f-4e59-9000-d375c17424ec"
}
},
"runtimeVersion": {
"policy": "appVersion"
},
"updates": {
"url": "https://u.expo.dev/cca8de19-da90-4dff-bdec-f261cd0abbda"
}
"owner": "mahmoudwalid"
}
}
4 changes: 3 additions & 1 deletion eslint.config.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
// https://docs.expo.dev/guides/using-eslint/
const { defineConfig } = require('eslint/config');
const expoConfig = require('eslint-config-expo/flat');
const eslintPluginPrettierRecommended = require('eslint-plugin-prettier/recommended');

module.exports = defineConfig([
expoConfig,
eslintPluginPrettierRecommended,
{
ignores: ['dist/*'],
ignores: ['dist/*', '.expo/*'],
},
]);
Loading