Add README.md
Document project structure, configuration, build/run instructions, storage schema, and ID3 tag mapping.
This commit is contained in:
1 parent
fe62910311
commit
8e0ad5c90a
1 file changed
+131
@@ -0,0 +1,131 @@
|
|||||||
|
# ym-dl
|
||||||
|
|
||||||
|
Yandex Music downloader — Go service for monitoring and downloading tracks/albums from Yandex Music for configured artists.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **Token-only authentication** via Yandex Music OAuth token
|
||||||
|
- **Artist monitoring** — periodic check for new tracks and albums
|
||||||
|
- **Track & album download** with direct URL signing
|
||||||
|
- **SQLite storage index** with migration from legacy JSON index
|
||||||
|
- **Rich ID3 tags** — genre, comment, lyrics, publisher, ISRC, copyright, original year, encoded by
|
||||||
|
- **High-resolution covers** (1000×1000) embedded in MP3 tags and saved as `cover.jpg`
|
||||||
|
- **Idempotent downloads** — tracks are not re-downloaded
|
||||||
|
- **Structured JSON logging** for Docker environments
|
||||||
|
|
||||||
|
## Project structure
|
||||||
|
|
||||||
|
```
|
||||||
|
ym-dl/
|
||||||
|
├── cmd/ym-dl/ # Main entry point
|
||||||
|
├── internal/
|
||||||
|
│ ├── config/ # Configuration loading (artist IDs, API credentials)
|
||||||
|
│ ├── downloader/ # Download orchestration
|
||||||
|
│ ├── monitor/ # Periodic check logic for new releases
|
||||||
|
│ ├── storage/ # SQLite storage for downloaded tracks/albums
|
||||||
|
│ └── yandex/ # Yandex Music API client wrapper
|
||||||
|
├── Dockerfile # Multi-stage build
|
||||||
|
├── docker-compose.yml # Service definition
|
||||||
|
├── config.yaml.example # Sample configuration
|
||||||
|
├── docs/yandex-music.yaml # Yandex Music OpenAPI spec
|
||||||
|
└── README.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
Create `config.yaml` based on `config.yaml.example`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
yandex:
|
||||||
|
token: "oauth_token" # Yandex Music OAuth token (required)
|
||||||
|
|
||||||
|
artists:
|
||||||
|
- id: 12345 # Artist ID from Yandex Music
|
||||||
|
- id: 67890
|
||||||
|
|
||||||
|
storage:
|
||||||
|
path: "/data/music" # Local path for downloads
|
||||||
|
organize: true # Organize into Artist/Album/Track structure
|
||||||
|
|
||||||
|
monitor:
|
||||||
|
interval: "24h" # Check interval (duration string, e.g. "24h", "6h30m")
|
||||||
|
```
|
||||||
|
|
||||||
|
### Authentication
|
||||||
|
|
||||||
|
Only OAuth token is supported. Obtain a token from Yandex OAuth and set it in `yandex.token`.
|
||||||
|
|
||||||
|
## Build & Run
|
||||||
|
|
||||||
|
### Locally
|
||||||
|
|
||||||
|
```bash
|
||||||
|
go build -o bin/ym-dl ./cmd/ym-dl
|
||||||
|
go run ./cmd/ym-dl --config config.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Docker Compose
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up --build
|
||||||
|
```
|
||||||
|
|
||||||
|
Mount your config at `/config.yaml` and storage at `/data`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# docker-compose.yml override
|
||||||
|
volumes:
|
||||||
|
- ./config.yaml:/config.yaml
|
||||||
|
- ./data:/data
|
||||||
|
```
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Run tests
|
||||||
|
go test ./...
|
||||||
|
|
||||||
|
# Run single test
|
||||||
|
go test -v -run TestName ./internal/...
|
||||||
|
|
||||||
|
# Lint
|
||||||
|
golangci-lint run
|
||||||
|
|
||||||
|
# Build
|
||||||
|
go build -o bin/ym-dl ./cmd/ym-dl
|
||||||
|
```
|
||||||
|
|
||||||
|
## Storage
|
||||||
|
|
||||||
|
The download index is stored in SQLite (`index.db` inside the storage path). On first launch, an existing legacy `.index.json` is automatically migrated to SQLite and removed.
|
||||||
|
|
||||||
|
Albums are considered fully downloaded only when all expected tracks (per `track_count` from Yandex API) are present in the index. Compilation albums where the artist appears on only some tracks are downloaded completely.
|
||||||
|
|
||||||
|
## ID3 Tags
|
||||||
|
|
||||||
|
MP3 files are tagged with:
|
||||||
|
|
||||||
|
| Frame | Field | Source |
|
||||||
|
|-------|-------|--------|
|
||||||
|
| TIT2 | Title | track title |
|
||||||
|
| TPE1 | Artist | all track artists |
|
||||||
|
| TPE2 | Album Artist | album artist |
|
||||||
|
| TALB | Album | album title |
|
||||||
|
| TYER | Year | release year |
|
||||||
|
| TCON | Genre | track/album genre |
|
||||||
|
| TRCK | Track number | position in album |
|
||||||
|
| TPOS | Disc number | volume in album |
|
||||||
|
| TCOM | Composer | (reserved) |
|
||||||
|
| TPUB | Publisher | album label |
|
||||||
|
| TENC | Encoded by | "ym-dl" |
|
||||||
|
| TCOP | Copyright | album catalog number |
|
||||||
|
| TORY | Original year | release date year |
|
||||||
|
| TSRC | ISRC | (reserved) |
|
||||||
|
| COMM | Comment | album description |
|
||||||
|
| USLT | Lyrics | track lyrics |
|
||||||
|
| APIC | Cover art | 1000×1000 JPEG |
|
||||||
|
| TXXX | Yandex IDs | track/album/artist IDs |
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Private project.
|
||||||
Reference in new issue
Block a user