feat: harden pos media mp3/mp4 — smart format selection, metadata, dry-run
Both tools: yt-dlp calls via spawn (honor DRY_RUN; --dry-run prints the command and skips dep checks), -o/--output, --no-playlist, --cookies (with file check), clean ffmpeg/yt-dlp guards, POS_FLAGS for completion, full embedded metadata (--embed-metadata --embed-chapters --embed-thumbnail --no-overwrites; mp3 adds --convert-thumbnails jpg + artist-from-uploader parse-metadata). mp3 gains --by-artist (~/Music/<artist>/<title>.mp3). mp4: -f <id>/--best/--worst skip the prompt (mutual-exclusion validated), and the interactive picker now shows a curated [audio]/[video]/[combo] format table on stderr (stdout carries only the chosen id — ui_pick lesson), validates the id against the real -F output, and defaults empty input to best. Docs: howto/media.md rewritten.
This commit is contained in:
@@ -72,7 +72,7 @@ Linux_post_install/
|
||||
│ ├── pos-entertainment-send # Run a public-API plugin and send its output via Telegram (default sender)
|
||||
│ ├── pos-entertainment-status # Show enabled plugins and scheduler state
|
||||
│ ├── pos-media-mp3 # Download audio as MP3 (yt-dlp)
|
||||
│ ├── pos-media-mp4 # Download video as MP4 (interactive format select)
|
||||
│ ├── pos-media-mp4 # Download video as MP4 (smart/interactive format select)
|
||||
│ ├── pos-network-checkport # Check TCP port connectivity
|
||||
│ ├── pos-network-hotspot # Wi-Fi hotspot via create_ap + wihotspot-gui
|
||||
│ ├── pos-network-ip # Show interfaces, routes, public IP + location
|
||||
@@ -267,7 +267,7 @@ All non-interactive `pos` commands log output to `~/.local/share/linux_post_inst
|
||||
| entertainment | send | `pos-entertainment-send` | Run a public-API plugin and send its output via Telegram (default sender) |
|
||||
| entertainment | status | `pos-entertainment-status` | Show enabled plugins and scheduler state |
|
||||
| media | mp3 | `pos-media-mp3` | Download audio as MP3 (yt-dlp) |
|
||||
| media | mp4 | `pos-media-mp4` | Download video as MP4 (interactive format select) |
|
||||
| media | mp4 | `pos-media-mp4` | Download video as MP4 (smart/interactive format select) |
|
||||
| network | checkport | `pos-network-checkport` | Check TCP port connectivity |
|
||||
| network | hotspot | `pos-network-hotspot` | Wi-Fi hotspot via create_ap + wihotspot-gui |
|
||||
| network | ip | `pos-network-ip` | Show interfaces, routes, public IP + location |
|
||||
@@ -573,8 +573,8 @@ Use conventional prefixes: `feat:`, `fix:`, `docs:`, `refactor:`, `chore:`
|
||||
| `bin/pos-entertainment-enable` | 49 | Enable an auto-trigger for a plugin on a schedule |
|
||||
| `bin/pos-entertainment-send` | 93 | Run a public-API plugin and send its output via Telegram (default sender) |
|
||||
| `bin/pos-entertainment-status` | 49 | Show enabled plugins and scheduler state |
|
||||
| `bin/pos-media-mp3` | 35 | Download audio as MP3 (yt-dlp) |
|
||||
| `bin/pos-media-mp4` | 38 | Download video as MP4 (interactive format select) |
|
||||
| `bin/pos-media-mp3` | 80 | Download audio as MP3 (yt-dlp) |
|
||||
| `bin/pos-media-mp4` | 126 | Download video as MP4 (smart/interactive format select) |
|
||||
| `bin/pos-network-checkport` | 45 | Check TCP port connectivity |
|
||||
| `bin/pos-network-hotspot` | 93 | Wi-Fi hotspot via create_ap + wihotspot-gui |
|
||||
| `bin/pos-network-ip` | 69 | Show interfaces, routes, public IP + location |
|
||||
@@ -587,7 +587,7 @@ Use conventional prefixes: `feat:`, `fix:`, `docs:`, `refactor:`, `chore:`
|
||||
| `bin/pos-system-nfs-server` | 134 | Manage the NFS kernel server (status, share/unshare exports, enable/disable) |
|
||||
| `bin/pos-tree` | 110 | Show the pos CLI command tree: categories, commands, and subcommands |
|
||||
| `bin/pos-usb-server` | 218 | USB Redirector server control (--ls, --share; prompts when args omitted) |
|
||||
| `completions/pos.bash` | 282 | Dynamic bash completion |
|
||||
| `completions/pos.bash` | 284 | Dynamic bash completion |
|
||||
<!-- GEN:END filetable -->
|
||||
| `apps/install.sh` | 171 | App install/uninstall picker/orchestrator |
|
||||
|
||||
|
||||
+58
-19
@@ -5,10 +5,11 @@ Download audio and video from the web via `yt-dlp`. Tools: `mp3`, `mp4`.
|
||||
| Tool | What it does |
|
||||
|------|--------------|
|
||||
| `pos media mp3` | Download audio, convert to MP3 |
|
||||
| `pos media mp4` | Download video with interactive format selection |
|
||||
| `pos media mp4` | Download video with smart/interactive format selection |
|
||||
|
||||
Requires `yt-dlp` (`sudo apt install yt-dlp`); the tools fail with a clean
|
||||
error message instead of a raw `command not found` if it's missing.
|
||||
Requires `yt-dlp` and `ffmpeg` (`sudo apt install yt-dlp ffmpeg`); the tools
|
||||
fail with a clean error message instead of a raw `command not found` if either
|
||||
is missing.
|
||||
|
||||
---
|
||||
|
||||
@@ -18,43 +19,81 @@ error message instead of a raw `command not found` if it's missing.
|
||||
pos media mp3 <url>
|
||||
```
|
||||
|
||||
Extracts and converts the audio track to MP3 in the current directory.
|
||||
Extracts and converts the audio track to MP3 in `~/Music/`. With `--by-artist`
|
||||
files land in `~/Music/<artist>/<title>.mp3` (falls back to the uploader name
|
||||
when there's no artist tag), so a library stays organized.
|
||||
|
||||
```bash
|
||||
pos media mp3 https://youtube.com/watch?v=dQw4w9WgXcQ
|
||||
pos media mp3 --by-artist https://youtu.be/dQw4w9WgXcQ
|
||||
```
|
||||
|
||||
MP3s are encoded at best quality with title/artist/album/date/chapters embedded
|
||||
(`--embed-metadata --embed-chapters`, artist falls back to uploader) plus the
|
||||
cover art as a JPEG thumbnail. Existing files are never overwritten.
|
||||
|
||||
| Flag | Meaning |
|
||||
|------|---------|
|
||||
| `-o, --output <dir>` | Output directory (default `~/Music`) |
|
||||
| `--by-artist` | Organize as `<dir>/<artist>/<title>.mp3` |
|
||||
| `--no-playlist` | Download only the single video, not the playlist |
|
||||
| `--cookies <file>` | Netscape cookies.txt for age-gated content |
|
||||
| `--dry-run` | Print the yt-dlp command without running it |
|
||||
|
||||
**Recipe:** batch — loop over a list of URLs:
|
||||
```bash
|
||||
while read -r url; do pos media mp3 "$url"; done < urls.txt
|
||||
while read -r url; do pos media mp3 --by-artist "$url"; done < urls.txt
|
||||
```
|
||||
|
||||
**Troubleshooting:** MP3 conversion needs `ffmpeg`; if the tool errors about a
|
||||
missing postprocessor, `sudo apt install ffmpeg`. Single-song playlists: use the
|
||||
video URL directly, or a playlist entry.
|
||||
|
||||
---
|
||||
|
||||
## `pos media mp4` — video with format choice
|
||||
## `pos media mp4` — video with smart format choice
|
||||
|
||||
```bash
|
||||
pos media mp4 <url>
|
||||
```
|
||||
|
||||
Lists the available formats (`yt-dlp -F`) and lets you pick interactively, then
|
||||
downloads to the current directory.
|
||||
Without a format flag, the available formats are shown as a **short curated
|
||||
list** (grouped `[audio]` / `[video]` / `[combo]`, with the raw dump's clutter
|
||||
dropped) and you pick one — the id is validated before downloading. Entering
|
||||
nothing (or `best`) picks the best video+audio automatically.
|
||||
|
||||
Non-interactive (scripting-friendly):
|
||||
|
||||
| Flag | Meaning |
|
||||
|------|---------|
|
||||
| `-f, --format <id>` | Download that format id directly (no prompt) |
|
||||
| `--best` | Best video + audio, no prompt |
|
||||
| `--worst` | Lowest quality, no prompt |
|
||||
| `-o, --output <dir>` | Output directory (default `~/Videos`) |
|
||||
| `--no-playlist` | Download only the single video |
|
||||
| `--cookies <file>` | Netscape cookies.txt for age-gated content |
|
||||
| `--dry-run` | Print the yt-dlp command without running it |
|
||||
|
||||
```bash
|
||||
pos media mp4 https://youtube.com/watch?v=dQw4w9WgXcQ
|
||||
pos media mp4 --best https://youtube.com/watch?v=dQw4w9WgXcQ
|
||||
pos media mp4 -f 22 https://youtube.com/watch?v=dQw4w9WgXcQ
|
||||
```
|
||||
|
||||
**Recipe:** grab a 4K stream for later — pick the highest `video only` format +
|
||||
best audio; yt-dlp merges them (again needs `ffmpeg`).
|
||||
Videos merge to MP4 with metadata, chapters, subtitles (all languages) and the
|
||||
thumbnail embedded (`--embed-metadata --embed-chapters --embed-subs
|
||||
--sub-langs all --embed-thumbnail`); existing files are never overwritten.
|
||||
|
||||
**Troubleshooting:**
|
||||
- Format list is empty → the site/age-gate requires cookies/auth; yt-dlp can't
|
||||
access it — use a URL yt-dlp supports, or update yt-dlp (`sudo apt upgrade yt-dlp`).
|
||||
- Very large downloads: ensure free space; files land in the current directory.
|
||||
**Recipe:** grab a 4K stream for later — `--best` already picks the best
|
||||
video+audio and merges them.
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
- Format list is empty / download fails → the site or age-gate requires
|
||||
cookies; pass `--cookies ~/cookies.txt` (export it from your browser), or
|
||||
update yt-dlp (`sudo apt upgrade yt-dlp`).
|
||||
- Error about a missing postprocessor → `sudo apt install ffmpeg`.
|
||||
- `--by-artist` leaves files loose → the source has no artist/uploader tag;
|
||||
it falls back to the uploader name in the artist slot.
|
||||
- Very large downloads: ensure free space; files land in `~/Music`/`~/Videos`
|
||||
(or your `-o` directory).
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user