discstation 0.1.10 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -17,23 +17,27 @@ playback, ripping, phone uploads, and ESP32 remote control.
17
17
  | **Burn Data DVD** | Any files/folders → ISO/Joliet data disc (no quality loss) |
18
18
  | **Burn MPG** | Re-burn a previously converted movie.mpg |
19
19
  | **Play** | Playback via mpv (DVD-Video, Audio CD, VCD, SVCD) |
20
- | **Rip** | Audio CD → FLAC with MusicBrainz metadata |
20
+ | **Rip** | Audio CD → FLAC (MusicBrainz); DVD-Video → VIDEO_TS mirror or HandBrake MKV (TMDb naming) |
21
21
 
22
22
  ## Project Structure
23
23
 
24
24
  ```
25
25
  .
26
26
  ├── src/
27
- │ ├── discstation.py # Main orchestrator, serial, web server
28
- └── discstation_burn.py # Burn pipeline (download, convert, author, burn)
27
+ │ ├── discstation.py # Main orchestrator, serial, web server
28
+ ├── discstation_burn.py # Burn pipeline (download, convert, author, burn)
29
+ │ ├── discstation_host.py # Per-OS device/path/backend abstraction
30
+ │ ├── discstation_meta.py # TMDb video metadata
31
+ │ └── static/ # Built-in web UI (index.html, app.js, style.css)
32
+ ├── mobile/ # Expo (React Native) companion app
29
33
  ├── arduino/
30
- │ ├── c6/ # ESP32-C6 firmware
31
- │ └── v1/ # ESP32 DevKit firmware
32
- ├── docs/ # Platform support notes
33
- ├── install.sh # Linux host installer
34
- ├── install-macos.sh # macOS host bootstrap
35
- ├── install-windows.ps1 # Windows host bootstrap
36
- ├── systemd/ # Linux auto-start unit
34
+ │ ├── c6/ # ESP32-C6 firmware
35
+ │ └── v1/ # ESP32 DevKit firmware
36
+ ├── scripts/setup.mjs # `discstation-setup` cross-OS installer dispatch
37
+ ├── docs/ # Platform support notes
38
+ ├── install.sh / install-macos.sh / install-windows.ps1
39
+ ├── requirements.txt / requirements-optional.txt
40
+ ├── systemd/ # Linux auto-start unit
37
41
  └── README.md
38
42
  ```
39
43
 
@@ -52,7 +56,7 @@ discstation-setup # dispatches to the installer for your OS
52
56
  | OS | What runs | Optical support |
53
57
  |----|-----------|-----------------|
54
58
  | Linux | `install.sh` — apt deps, venv, systemd `--user` service, self-signed cert | full burn / rip / play |
55
- | macOS | `install-macos.sh` — Homebrew deps, venv, launchd agent, cert | experimental (set `DISC_DEVICE` if detection fails) |
59
+ | macOS | `install-macos.sh` — Homebrew deps, venv, launchd agent, cert | burn / rip / play (audio-CD *burning* is best-effort; set `DISC_DEVICE` if detection fails) |
56
60
  | Windows | `install-windows.ps1` — files + venv | web / serial control only, no burn backend |
57
61
 
58
62
  ### Or run the platform script directly
@@ -75,9 +79,10 @@ PowerShell -ExecutionPolicy Bypass -File .\install-windows.ps1
75
79
 
76
80
  ## Platform Support
77
81
 
78
- Linux currently supports the complete optical workflow. macOS and Windows use
79
- the shared Python/web workflows, but their native optical burning backends are
80
- still being implemented. See `docs/PLATFORM_SUPPORT.md`.
82
+ Linux and macOS both run the complete optical workflow (burn, rip, play)
83
+ macOS via `xorriso` / `hdiutil` / `cd-paranoia` / `dvdbackup` / HandBrake, with
84
+ audio-CD *burning* the one best-effort area. Windows runs the shared Python/web
85
+ workflow only; it has no burn backend yet. See `docs/PLATFORM_SUPPORT.md`.
81
86
 
82
87
  ## Web Interface
83
88
 
@@ -102,6 +107,11 @@ Built-in web server on port 8080 (HTTPS with self-signed cert):
102
107
  | `DISC_CLEANUP_DAYS` | 2 | Auto-cleanup old job directories |
103
108
  | `DISC_OUTPUT_LIMIT_BYTES` | 4300000000 | Conservative DVD5 payload limit |
104
109
  | `DISC_DL_OUTPUT_LIMIT_BYTES` | 8000000000 | Conservative DVD9 payload limit |
110
+ | `DISC_DEVICE` | auto | Optical drive node override (required on Windows) |
111
+ | `DISC_PORT` | auto | ESP32 serial port override |
112
+ | `DISCSTATION_HTTP_PORT` | 8081 | Plain-HTTP port for the mobile app (`0` disables) |
113
+ | `DISCSTATION_DVD_RIP_MODE` | mirror | `mkv` = HandBrake main-feature transcode instead of a full VIDEO_TS mirror |
114
+ | `DISC_AUDIO_DEVICE` | auto | mpv audio-output device override |
105
115
 
106
116
  ### YouTube Download Configuration
107
117
 
@@ -9,16 +9,23 @@ Run `./install.sh` on Debian, Ubuntu, or Raspberry Pi OS.
9
9
 
10
10
  ## macOS
11
11
 
12
- The Python host and web/control workflow run with Homebrew dependencies. Data
13
- and DVD image burning use `hdiutil`; DVD-Video discs can be mounted read-only
14
- for playback and VIDEO_TS ripping; audio CD burning uses cdrdao. Optical-device
15
- discovery and video/audio workflows are experimental; use `DISC_DEVICE`
16
- when automatic detection does not find the external drive. Apple Music owns
17
- audio CD playback and ripping on macOS, so DiscStation does not probe or access
18
- audio tracks for those operations. Audio burns include CD-TEXT from the source
19
- folder/file name and track metadata. Apple Music may still show generic track
20
- names when its online CD lookup has no match; CD-TEXT-capable players can read
21
- the embedded names. The macOS installer installs a persistent `launchd` service.
12
+ Near-complete native support via Homebrew dependencies (`install-macos.sh`
13
+ installs them and a persistent `launchd` agent):
14
+
15
+ - **Detect** optical device via `ioreg` / `drutil` / `diskutil`; blank and
16
+ rewritable media are classified, so the OLED offers the burn menu.
17
+ - **Burn** data and DVD-Video images are built with `xorriso -as mkisofs`
18
+ (`-dvd-video` for a set-top-compatible VIDEO_TS layout) and written with
19
+ `hdiutil burn` (progress streamed from its `-puppetstrings` output).
20
+ - **Rip** audio CD via `cd-paranoia` FLAC with MusicBrainz metadata and
21
+ cover art; DVD-Video via `dvdbackup -M` (or HandBrake main-feature with
22
+ `DISCSTATION_DVD_RIP_MODE=mkv`), `libdvdcss` handling CSS.
23
+ - **Play** — `mpv`, with `dvdnav://` menu navigation for DVD-Video and a
24
+ mounted-VOB fallback.
25
+
26
+ Set `DISC_DEVICE` if automatic drive detection fails. The one known limitation
27
+ is **audio-CD *burning*** — `cdrdao` is the only option and often cannot claim
28
+ the drive on recent macOS; DiscStation reports this clearly instead of hanging.
22
29
 
23
30
  ## Windows
24
31
 
@@ -32,8 +39,8 @@ instead of silently attempting Linux commands.
32
39
  - DiscStation workflows and web UI
33
40
  - ESP32 serial protocol
34
41
  - File upload and folder preservation
35
- - Video/audio metadata handling
42
+ - Video/audio metadata handling (MusicBrainz, TMDb)
36
43
  - QR-code web URL display
37
44
 
38
- The optical-drive backend is the platform boundary. It should be completed per
39
- OS before claiming full native burning support on that platform.
45
+ The optical-drive backend is the platform boundary. Linux and macOS are
46
+ complete (bar macOS audio-CD burning); Windows still needs its writer backend.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "discstation",
3
- "version": "0.1.10",
3
+ "version": "0.1.11",
4
4
  "description": "DiscStation optical-media appliance host — one cross-OS installer",
5
5
  "bin": {
6
6
  "discstation-setup": "scripts/setup.mjs"
package/scripts/setup.mjs CHANGED
@@ -18,7 +18,7 @@ if (args.includes('-h') || args.includes('--help')) {
18
18
 
19
19
  Runs the installer for the current OS:
20
20
  linux install.sh full: apt deps, venv, systemd --user service, self-signed cert
21
- darwin install-macos.sh full: Homebrew deps, venv, launchd agent, cert (optical is experimental)
21
+ darwin install-macos.sh full: Homebrew deps, venv, launchd agent, cert (audio-CD burn is best-effort)
22
22
  windows install-windows.ps1 files + venv only; web/serial control, no burn backend
23
23
 
24
24
  Prereqs: Node 16+, Python 3 (python3 / py on PATH), and either bash (linux/macOS)
@@ -289,10 +289,6 @@ def null_device():
289
289
  return "NUL" if system_name() == "windows" else "/dev/null"
290
290
 
291
291
 
292
- def can_use_linux_optical_backend():
293
- return system_name() == "linux" and all(shutil.which(name) for name in ("growisofs", "wodim", "cdrdao"))
294
-
295
-
296
292
  def build_data_image(source_paths, output_path, label, video=False):
297
293
  system = system_name()
298
294
  if system in ("darwin", "windows"):