diff --git a/apps/solara/README.md b/apps/solara/README.md new file mode 100644 index 000000000..e6addd4f8 --- /dev/null +++ b/apps/solara/README.md @@ -0,0 +1,18 @@ +## 产品介绍 + +由轻量后端服务支撑的现代化网页音乐播放器,整合多种音乐聚合接口,覆盖搜索、播放与音频下载全流程。 + +## 主要功能 + +- **主题美学**:内置亮/暗模式与玻璃拟态界面,根据当前曲目封面自动取色渲染沉浸式背景,具备沉浸体验。 +- **竖屏移动端**:全新竖屏布局匹配移动端手势与屏幕比例,按钮、列表与歌词均针对单手操作优化。 +- **跨站曲库检索**:一键切换数据源,支持分页浏览并批量导入播放队列。 +- **队列管理灵活**:新增、删除、清空操作即时生效,并自动持久化到浏览器 localStorage。 +- **收藏列表**:搜索结果与播放列表均可一键收藏,收藏列表拥有独立的播放进度、播放模式与批量操作面板。 +- **丰富的播放模式**:列表循环、单曲循环与随机播放随手切换,记忆上次偏好。 +- **动态歌词视图**:逐行滚动高亮,当前行自动聚焦,手动滚动后短暂锁定视图。 +- **列表导入导出**:支持播放队列与收藏列表统一导入/导出,可一键迁移或恢复收藏歌曲并同步到播放队列。 +- **多码率下载**:可挑选 128K / 192K / 320K / FLAC 等品质并直接获取音频文件。 +- **轻量后端代理**:通过 Cloudflare Pages Functions 统一聚合各数据源并处理音频跨域。 +- **锁屏播放控制**:锁屏界面自动显示专辑封面与播放控件,无需解锁即可进行播放控制。 +- **调试控制台**:按下 Ctrl + D 呼出实时日志面板,便于排查接口或交互异常。 \ No newline at end of file diff --git a/apps/solara/README_en.md b/apps/solara/README_en.md new file mode 100644 index 000000000..851081a14 --- /dev/null +++ b/apps/solara/README_en.md @@ -0,0 +1,18 @@ +## Introduction + +A modern web music player powered by lightweight backend services, integrating multiple music aggregation interfaces, covering the entire process from search and playback to audio download. + +## Features + +- **Thematic Aesthetics**: Built-in light/dark modes and a glass morphism interface automatically extract colors from the current track's cover to render immersive backgrounds, delivering an engaging experience. +- **Vertical Mobile Interface**: A new vertical screen layout matches mobile gestures and screen proportions, with buttons, lists, and lyrics optimized for one-handed operation. +- **Cross-Site Music Library Search**: Switch data sources with one click, supporting paginated browsing and batch import to the playback queue. +- **Flexible Queue Management**: Add, delete, and clear operations take effect immediately and are automatically persisted to the browser's localStorage. +- **Favorites List**: Search results and playlists can be added to favorites with one click. The Favorites List features independent playback progress, playback modes, and a batch operation panel. +- **Rich Playback Modes**: Seamlessly switch between list loop, single-track loop, and shuffle play, with preferences remembered from the last session. +- **Dynamic Lyrics View**: Scrolling highlight line-by-line, auto-focus on the current line, with view temporarily locked after manual scrolling. +- **List Import/Export**: Supports unified import/export of playback queue and favorites list, enabling seamless migration or restoration of favorite songs and synchronization to the playback queue. +- **Multi-bitrate Downloads**: Select from 128K / 192K / 320K / FLAC quality options and directly obtain audio files. +- **Lightweight Backend Proxy**: Unifies and aggregates various data sources via Cloudflare Pages Functions while handling audio cross-origin requests. +- **Lock Screen Playback Controls**: Automatically displays album art and playback controls on the lock screen, allowing playback control without unlocking the device. +- **Debug Console**: Press Ctrl + D to summon a real-time log panel, making it easier to troubleshoot interface or interaction issues. \ No newline at end of file diff --git a/apps/solara/data.yml b/apps/solara/data.yml new file mode 100644 index 000000000..6c1d3fde7 --- /dev/null +++ b/apps/solara/data.yml @@ -0,0 +1,30 @@ +name: Solara(光域) +tags: + - 多媒体 +title: 基于免费API的极简风格音乐播放器 +description: 基于免费API的极简风格音乐播放器 +additionalProperties: + key: solara + name: Solara(光域) + tags: + - Media + shortDescZh: 基于免费API的极简风格音乐播放器 + shortDescEn: A minimalist style music player based on free API + description: + en: A minimalist style music player based on free API + zh: 基于免费API的极简风格音乐播放器 + zh-Hant: 基於免費API的極簡風格音樂播放器 + ja: 無料APIを基にしたミニマリストスタイルの音楽プレーヤー + ms: Pemain muzik gaya minimalis berdasarkan API percuma + pt-br: Um player de música estilo minimalista baseado em API gratuita + ru: Минималистичный музыкальный плеер на основе бесплатного API + ko: 무료 API 기반의 미니멀리스트 스타일 음악 플레이어 + type: website + crossVersionUpdate: true + limit: 0 + website: https://github.com/akudamatata/Solara + github: https://github.com/akudamatata/Solara + document: https://github.com/akudamatata/Solara + architectures: + - amd64 + - arm64 diff --git a/apps/solara/latest/data.yml b/apps/solara/latest/data.yml new file mode 100644 index 000000000..5be8ab86f --- /dev/null +++ b/apps/solara/latest/data.yml @@ -0,0 +1,42 @@ +additionalProperties: + formFields: + - default: 8080 + envKey: PANEL_APP_PORT_HTTP + labelZh: HTTP 端口 + labelEn: HTTP Port + label: + zh: HTTP 端口 + zh-Hant: HTTP 連接埠 + en: HTTP Port + ja: HTTP ポート + ko: HTTP 포트 + ms: Port HTTP + pt-br: Porta HTTP + ru: HTTP Порт + tr: HTTP Portu + description: + zh: "设置应用的 HTTP 访问端口,有效范围: 1-65535" + zh-Hant: "設定應用程式的 HTTP 存取連接埠,有效範圍: 1-65535" + en: "Set the HTTP access port for the application, valid range: 1-65535" + ja: "アプリケーションのHTTPアクセスポートを設定します。有効範囲: 1-65535" + ko: "애플리케이션의 HTTP 접근 포트를 설정합니다. 유효 범위: 1-65535" + ms: "Tetapkan port akses HTTP untuk aplikasi, julat sah: 1-65535" + pt-br: "Defina a porta de acesso HTTP para o aplicativo, intervalo válido: 1-65535" + ru: "Установите порт доступа HTTP для приложения, допустимый диапазон: 1-65535" + tr: "Uygulama için HTTP erişim portunu ayarlayın, geçerli aralık: 1-65535" + required: true + type: number + edit: true + rule: paramPort + - default: solara + envKey: SOLARA_PASSWORD + labelZh: 登录密码 + labelEn: Login Password + label: + zh: 登录密码 + en: Login Password + required: true + type: password + edit: true + rule: paramComplexity + random: true diff --git a/apps/solara/latest/docker-compose.yml b/apps/solara/latest/docker-compose.yml new file mode 100644 index 000000000..174f11f17 --- /dev/null +++ b/apps/solara/latest/docker-compose.yml @@ -0,0 +1,20 @@ +services: + solara-music: + image: aexus/solara-music:latest + container_name: ${CONTAINER_NAME} + restart: always + pull_policy: always + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:3001 + environment: + - NODE_ENV=production + - PORT=3001 + - SOLARA_PASSWORD=${SOLARA_PASSWORD} + - SESSION_SECRET=${SESSION_SECRET} + labels: + createdBy: Apps +networks: + 1panel-network: + external: true diff --git a/apps/solara/latest/scripts/init.sh b/apps/solara/latest/scripts/init.sh new file mode 100644 index 000000000..fc41220f0 --- /dev/null +++ b/apps/solara/latest/scripts/init.sh @@ -0,0 +1,14 @@ +#!/bin/bash +if [[ ! -f ".env" ]]; then + exit 1 +fi +NEW_SECRET=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 32) +if grep -q "SESSION_SECRET=" .env; then + if [[ "$(uname)" == "Darwin" ]]; then + sed -i '' "s/SESSION_SECRET=.*/SESSION_SECRET=$NEW_SECRET/" .env + else + sed -i "s/SESSION_SECRET=.*/SESSION_SECRET=$NEW_SECRET/" .env + fi +else + echo "SESSION_SECRET=$NEW_SECRET" >> .env +fi diff --git a/apps/solara/logo.png b/apps/solara/logo.png new file mode 100644 index 000000000..fddfdcf5c Binary files /dev/null and b/apps/solara/logo.png differ