[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C1TEMA6BC0FE97M58TPAH2":3,"skill-same:01M6C1TEMA6BC0FE97M58TPAH2":86},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":56,"commitSha":57,"skillDirectory":58,"forksCount":59,"repositoryHtmlUrl":60,"repositoryHomepageUrl":61,"ownerHtmlUrl":62,"ownerBlogUrl":63,"ownerDescription":64,"updatedAt":65,"install":66,"resources":79},"01M6C1TEMA6BC0FE97M58TPAH2","export",null,"Export media collection to platform-specific formats (Plex, Jellyfin, MPD, mobile, archival)","jmagly\u002Faiwg","jmagly","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1159087?v=4","01M6C10AK8N2WCSQN11FYGTJWN","Joseph Magly","01M6C10AQ8A2RMED1Y1BSVY7NF",229,"MIT","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fskills\u002Fexport\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[5,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"mobile","path","size","formats","archival","output","platform","efficiency","plex","max","collection","transcode","profile","write","read","grep","haiku","Bash","Media","2026-11-10 10:12:30",false,"---\nnamespace: aiwg\nname: export\nplatforms: [all]\ndescription: Export media collection to platform-specific formats (Plex, Jellyfin, MPD, mobile, archival)\ncommandHint:\n  argumentHint: --profile \u003Cplex|jellyfin|mpd|mobile|archival> \u003Ccollection_path> \u003Coutput_path> [--max-size \u003CGB>] [--transcode]\n  allowedTools: Bash, Read, Write, Glob, Grep\n  model: haiku\n  category: media-curator\n  modelRole: efficiency\n  modelTier: economy\n---\n\n# Export Media Collection\n\nExport a curated media collection to platform-specific formats with appropriate transcoding, metadata, and directory structures.\n\n## Purpose\n\nUsers consume media across diverse platforms, each with different format requirements, metadata standards, and organizational conventions. This command transforms a curated collection into the optimal structure for each target platform.\n\n## Platform Profiles\n\n### Plex Profile\n\n**Formats:**\n- Audio: FLAC (preferred), MP3 (320kbps), M4A (AAC)\n- Video: MP4 (H.264\u002FH.265), MKV\n- Artwork: Embedded + `folder.jpg` in album directory\n\n**Directory Structure:**\n```\nMusic\u002F\n├── Artist Name\u002F\n│   ├── Album Name (Year)\u002F\n│   │   ├── folder.jpg\n│   │   ├── 01 - Track Title.flac\n│   │   ├── 02 - Track Title.flac\n│   │   └── ...\n│   └── Videos\u002F\n│       └── Video Title.mp4\n```\n\n**YAML Spec:**\n```yaml\nprofile: plex\naudio_formats: [flac, mp3, m4a]\nvideo_formats: [mp4, mkv]\nartwork:\n  embedded: true\n  folder_jpg: true\n  max_resolution: 1500x1500\ndirectory_pattern: \"{artist}\u002F{album} ({year})\u002F{track:02d} - {title}.{ext}\"\nvideo_directory: \"{artist}\u002FVideos\u002F{title}.{ext}\"\nmetadata:\n  prefer_embedded: true\n  id3v2_version: 2.4\n```\n\n### Jellyfin Profile\n\n**Formats:**\n- Audio: FLAC (preferred), Opus, MP3\n- Video: MP4, MKV, WebM\n- Artwork: Embedded + `folder.jpg` + `artist.jpg`\n- NFO: Supported for rich metadata\n\n**Directory Structure:**\n```\nMusic\u002F\n├── Artist Name\u002F\n│   ├── artist.jpg\n│   ├── artist.nfo\n│   ├── Album Name (Year)\u002F\n│   │   ├── folder.jpg\n│   │   ├── album.nfo\n│   │   ├── 01 - Track Title.flac\n│   │   └── ...\n│   └── Videos\u002F\n│       ├── Video Title.mp4\n│       └── Video Title.nfo\n```\n\n**YAML Spec:**\n```yaml\nprofile: jellyfin\naudio_formats: [flac, opus, mp3]\nvideo_formats: [mp4, mkv, webm]\nartwork:\n  embedded: true\n  folder_jpg: true\n  artist_jpg: true\n  max_resolution: 1500x1500\nnfo_files:\n  album: true\n  artist: true\n  video: true\ndirectory_pattern: \"{artist}\u002F{album} ({year})\u002F{track:02d} - {title}.{ext}\"\nvideo_directory: \"{artist}\u002FVideos\u002F{title}.{ext}\"\nmetadata:\n  prefer_embedded: true\n  id3v2_version: 2.4\n```\n\n### MPD Profile\n\n**Formats:**\n- Audio: FLAC (preferred), Opus, MP3\n- Artwork: `folder.jpg` in album directory\n\n**Directory Structure:**\n```\nMusic\u002F\n├── Artist Name\u002F\n│   └── Album Name\u002F\n│       ├── folder.jpg\n│       ├── 01 - Track Title.flac\n│       └── ...\n```\n\n**YAML Spec:**\n```yaml\nprofile: mpd\naudio_formats: [flac, opus, mp3]\nartwork:\n  embedded: true\n  folder_jpg: true\n  max_resolution: 1000x1000\ndirectory_pattern: \"{artist}\u002F{album}\u002F{track:02d} - {title}.{ext}\"\nmetadata:\n  prefer_embedded: true\n  id3v2_version: 2.4\nscanning:\n  auto_rescan: true\n  watch_mode: inotify\n```\n\n### Mobile Profile\n\n**Formats:**\n- Audio: Opus (preferred, 128-192kbps), M4A (AAC), MP3\n- Video: MP4 (H.264, max 720p)\n- Artwork: Embedded, max 500x500\n\n**Size Constraints:**\n- Transcode high-res audio to save space\n- Limit video resolution\n- Budget-aware export (stop when size limit reached)\n\n**YAML Spec:**\n```yaml\nprofile: mobile\naudio_formats: [opus, m4a, mp3]\naudio_quality:\n  opus: 128k\n  m4a: 192k\n  mp3: 192k\nvideo_formats: [mp4]\nvideo_quality:\n  max_resolution: 720p\n  codec: h264\n  bitrate: 1500k\nartwork:\n  embedded: true\n  max_resolution: 500x500\ntranscode:\n  always: true\n  source_formats: [flac, wav, alac]\nsize_budget:\n  enabled: true\n  prioritize_by: importance\ndirectory_pattern: \"{artist}\u002F{album}\u002F{track:02d} - {title}.{ext}\"\n```\n\n### Archival Profile\n\n**Formats:**\n- Audio: FLAC, WAV (no lossy formats)\n- Video: MKV (preserve original quality)\n- Checksums: SHA256SUMS\n- Provenance: PROVENANCE.jsonld\n\n**Directory Structure:**\n```\nArchive\u002F\n├── Artist Name\u002F\n│   ├── Album Name (Year)\u002F\n│   │   ├── 01 - Track Title.flac\n│   │   ├── ...\n│   │   ├── SHA256SUMS\n│   │   ├── PROVENANCE.jsonld\n│   │   └── folder.jpg\n│   └── MANIFEST.json\n```\n\n**YAML Spec:**\n```yaml\nprofile: archival\naudio_formats: [flac, wav]\nvideo_formats: [mkv]\npreserve:\n  original_filenames: true\n  source_metadata: true\n  acquisition_dates: true\nchecksums:\n  algorithm: sha256\n  filename: SHA256SUMS\nprovenance:\n  format: jsonld\n  filename: PROVENANCE.jsonld\n  include_source_urls: true\n  include_timestamps: true\nmanifest:\n  per_album: false\n  per_artist: true\n  format: json\ndirectory_pattern: \"{artist}\u002F{album} ({year})\u002F{original_filename}\"\n```\n\n## Transcoding Commands\n\n### Audio Transcoding\n\n**FLAC to Opus:**\n```bash\nffmpeg -i input.flac -c:a libopus -b:a 128k -vn output.opus\n```\n\n**FLAC to MP3:**\n```bash\nffmpeg -i input.flac -c:a libmp3lame -b:a 320k -id3v2_version 4 output.mp3\n```\n\n**Opus to MP3:**\n```bash\nffmpeg -i input.opus -c:a libmp3lame -b:a 192k -id3v2_version 4 output.mp3\n```\n\n**Preserve Metadata:**\n```bash\nffmpeg -i input.flac -c:a libopus -b:a 128k -vn -map_metadata 0 output.opus\n```\n\n### Video Transcoding\n\n**4K to 1080p:**\n```bash\nffmpeg -i input.mkv -vf scale=1920:1080 -c:v libx264 -crf 23 -c:a copy output.mp4\n```\n\n**1080p to 720p (mobile):**\n```bash\nffmpeg -i input.mp4 -vf scale=1280:720 -c:v libx264 -crf 23 -b:v 1500k -c:a aac -b:a 128k output.mp4\n```\n\n**Extract Audio Only:**\n```bash\nffmpeg -i video.mp4 -vn -c:a libopus -b:a 192k audio.opus\n```\n\n### Artwork Processing\n\n**Resize Artwork:**\n```bash\nffmpeg -i folder.jpg -vf scale=500:500:force_original_aspect_ratio=decrease -q:v 2 folder_mobile.jpg\n```\n\n**Extract Artwork from Audio:**\n```bash\nffmpeg -i track.flac -an -vcodec copy folder.jpg\n```\n\n**Embed Artwork into Audio:**\n```bash\nffmpeg -i track.flac -i folder.jpg -map 0:a -map 1:v -c:a copy -id3v2_version 4 -metadata:s:v title=\"Album cover\" -metadata:s:v comment=\"Cover (front)\" output.flac\n```\n\n## NFO File Generation\n\n### Album NFO Template (Jellyfin\u002FKodi)\n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n\u003Calbum>\n  \u003Ctitle>{album_title}\u003C\u002Ftitle>\n  \u003Cartist>{artist_name}\u003C\u002Fartist>\n  \u003Cyear>{release_year}\u003C\u002Fyear>\n  \u003Cgenre>{genre}\u003C\u002Fgenre>\n  \u003Cstyle>{style}\u003C\u002Fstyle>\n  \u003Cmood>{mood}\u003C\u002Fmood>\n  \u003Clabel>{label}\u003C\u002Flabel>\n  \u003Creleasedate>{release_date}\u003C\u002Freleasedate>\n  \u003Crating>{rating}\u003C\u002Frating>\n  \u003Cuserrating>{user_rating}\u003C\u002Fuserrating>\n  \u003Creview>{review}\u003C\u002Freview>\n  \u003Cmusicbrainzalbumid>{mbid}\u003C\u002Fmusicbrainzalbumid>\n  \u003Cthumb aspect=\"thumb\">{artwork_url}\u003C\u002Fthumb>\n\u003C\u002Falbum>\n```\n\n## Size-Budgeted Export (Mobile)\n\nWhen exporting to mobile devices with limited storage:\n\n1. **Calculate Space Budget:**\n   - Parse `--max-size` parameter\n   - Convert to bytes\n   - Reserve 10% buffer for filesystem overhead\n\n2. **Prioritize Content:**\n   - Sort by importance score (frequency * rating * recency)\n   - Essential albums first\n   - Deep cuts last\n\n3. **Transcode to Mobile Formats:**\n   - FLAC → Opus 128kbps\n   - High-res video → 720p H.264\n   - Resize artwork to 500x500\n\n4. **Track Running Total:**\n   - Sum file sizes as files are added\n   - Stop when budget exhausted\n   - Generate report of included\u002Fexcluded content\n\n5. **Export Algorithm:**\n```bash\nbudget_bytes=$(( max_size_gb * 1024 * 1024 * 1024 * 9 \u002F 10 ))\ntotal_bytes=0\n\nwhile read -r file importance; do\n  file_size=$(stat -f%z \"$file\" 2>\u002Fdev\u002Fnull || stat -c%s \"$file\")\n\n  if (( total_bytes + file_size > budget_bytes )); then\n    echo \"Budget exhausted. Stopping export.\" >&2\n    break\n  fi\n\n  # Transcode and copy\n  transcode_and_copy \"$file\" \"$output_dir\"\n  total_bytes=$(( total_bytes + file_size ))\ndone \u003C \u003C(prioritized_file_list)\n```\n\n## Archival Export\n\n### Preserve Original Formats\n\nNever transcode. Copy files as-is to preserve quality and authenticity.\n\n### Generate SHA-256 Checksums\n\n```bash\ncd \"$album_dir\"\nfind . -type f -not -name \"SHA256SUMS\" -exec sha256sum {} \\; > SHA256SUMS\n```\n\n### Record Provenance\n\nCreate `PROVENANCE.jsonld` per W3C PROV standard:\n\n```json\n{\n  \"@context\": \"https:\u002F\u002Fwww.w3.org\u002Fns\u002Fprov\",\n  \"entity\": \"urn:aiwg:media:album:{mbid}\",\n  \"wasGeneratedBy\": {\n    \"activity\": \"urn:aiwg:activity:acquisition:{timestamp}\",\n    \"time\": \"{iso8601_timestamp}\",\n    \"wasAssociatedWith\": \"urn:aiwg:agent:media-curator\"\n  },\n  \"wasDerivedFrom\": [\n    {\n      \"entity\": \"{source_url}\",\n      \"type\": \"download\",\n      \"time\": \"{acquisition_date}\"\n    }\n  ],\n  \"atLocation\": \"{file_path}\",\n  \"hadPrimarySource\": \"{authoritative_source}\"\n}\n```\n\n### Generate Manifest\n\nPer-artist `MANIFEST.json` listing all albums, tracks, formats, and checksums:\n\n```json\n{\n  \"artist\": \"Artist Name\",\n  \"albums\": [\n    {\n      \"title\": \"Album Name\",\n      \"year\": 1973,\n      \"tracks\": [\n        {\n          \"number\": 1,\n          \"title\": \"Track Title\",\n          \"file\": \"01 - Track Title.flac\",\n          \"format\": \"flac\",\n          \"checksum\": \"sha256:abc123...\"\n        }\n      ]\n    }\n  ],\n  \"export_date\": \"{iso8601_timestamp}\",\n  \"profile\": \"archival\"\n}\n```\n\n## Workflow\n\n### 1. Select Profile\n\nParse `--profile` argument. Load corresponding YAML spec.\n\n### 2. Validate Source Collection\n\n- Scan collection directory\n- Verify files exist and are readable\n- Check format compatibility with target profile\n\n### 3. Create Output Directory Structure\n\nBased on profile's `directory_pattern`:\n\n```bash\nmkdir -p \"$output_dir\u002F{artist}\u002F{album}\"\n```\n\n### 4. Transcode If Needed\n\nCheck if source format matches target profile. If not, transcode:\n\n```bash\nif [[ \"$source_ext\" == \"flac\" ]] && [[ \"$target_profile\" == \"mobile\" ]]; then\n  ffmpeg -i \"$source\" -c:a libopus -b:a 128k -map_metadata 0 \"$target\"\nfi\n```\n\n### 5. Copy\u002FMove Files\n\n```bash\ncp -a \"$source\" \"$destination\"\n```\n\nOr move if `--move` flag set.\n\n### 6. Embed Metadata\n\nEnsure all required metadata is embedded per profile spec.\n\n### 7. Generate Supplementary Files\n\n- NFO files (Jellyfin profile)\n- SHA256SUMS (archival profile)\n- PROVENANCE.jsonld (archival profile)\n- folder.jpg, artist.jpg (Plex\u002FJellyfin profiles)\n\n### 8. Report\n\n```\nExport complete: Plex profile\nSource: \u002Fmedia\u002Fsource\u002FArtist Name\nDestination: \u002Fmedia\u002Fplex\u002FMusic\u002FArtist Name\nFiles exported: 142\nTotal size: 3.2 GB\nTranscoded: 0\nCopied: 142\n```\n\n## Examples\n\n### Export to Plex\n\n```bash\n\u002Fexport --profile plex ~\u002FMusic\u002FArchive\u002FPink\\ Floyd \u002Fmedia\u002Fplex\u002FMusic\n```\n\n### Export to Mobile with Size Limit\n\n```bash\n\u002Fexport --profile mobile ~\u002FMusic\u002FArchive \u002Fsdcard\u002FMusic --max-size 32 --transcode\n```\n\n### Archival Export\n\n```bash\n\u002Fexport --profile archival ~\u002FMusic\u002FCurated \u002Fbackup\u002FMusic\u002FArchive\n```\n\n## Error Handling\n\n- Missing source files: Report and skip\n- Insufficient disk space: Abort with clear message\n- Transcode failures: Log error, optionally skip or abort\n- Permission denied: Report file path and required permissions\n\n## Performance Considerations\n\n- Parallel transcoding: Use GNU parallel or xargs -P for multi-core systems\n- Progress reporting: Update every N files or every M seconds\n- Disk I\u002FO: Batch operations to minimize seeks\n- Memory: Stream large files instead of loading into memory\n\n## References\n\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Faddons\u002Faiwg-utils\u002Frules\u002Fhuman-authorization.md — Seek explicit authorization before overwriting existing export targets\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fskills\u002Fcurate\u002FSKILL.md — Orchestration skill that invokes export as the final curation phase\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fskills\u002Fassemble\u002FSKILL.md — Assembly skill used before export to prepare media collections\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fskills\u002Fintegrity-verification\u002FSKILL.md — Verify exported files match source checksums\n","# Export Media Collection\n\nExport a curated media collection to platform-specific formats with appropriate transcoding, metadata, and directory structures.\n\n## Purpose\n\nUsers consume media across diverse platforms, each with different format requirements, metadata standards, and organizational conventions. This command transforms a curated collection into the optimal structure for each target platform.\n\n## Platform Profiles\n\n### Plex Profile\n\n**Formats:**\n- Audio: FLAC (preferred), MP3 (320kbps), M4A (AAC)\n- Video: MP4 (H.264\u002FH.265), MKV\n- Artwork: Embedded + `folder.jpg` in album directory\n\n**Directory Structure:**\n```\nMusic\u002F\n├── Artist Name\u002F\n│   ├── Album Name (Year)\u002F\n│   │   ├── folder.jpg\n│   │   ├── 01 - Track Title.flac\n│   │   ├── 02 - Track Title.flac\n│   │   └── ...\n│   └── Videos\u002F\n│       └── Video Title.mp4\n```\n\n**YAML Spec:**\n```yaml\nprofile: plex\naudio_formats: [flac, mp3, m4a]\nvideo_formats: [mp4, mkv]\nartwork:\n  embedded: true\n  folder_jpg: true\n  max_resolution: 1500x1500\ndirectory_pattern: \"{artist}\u002F{album} ({year})\u002F{track:02d} - {title}.{ext}\"\nvideo_directory: \"{artist}\u002FVideos\u002F{title}.{ext}\"\nmetadata:\n  prefer_embedded: true\n  id3v2_version: 2.4\n```\n\n### Jellyfin Profile\n\n**Formats:**\n- Audio: FLAC (preferred), Opus, MP3\n- Video: MP4, MKV, WebM\n- Artwork: Embedded + `folder.jpg` + `artist.jpg`\n- NFO: Supported for rich metadata\n\n**Directory Structure:**\n```\nMusic\u002F\n├── Artist Name\u002F\n│   ├── artist.jpg\n│   ├── artist.nfo\n│   ├── Album Name (Year)\u002F\n│   │   ├── folder.jpg\n│   │   ├── album.nfo\n│   │   ├── 01 - Track Title.flac\n│   │   └── ...\n│   └── Videos\u002F\n│       ├── Video Title.mp4\n│       └── Video Title.nfo\n```\n\n**YAML Spec:**\n```yaml\nprofile: jellyfin\naudio_formats: [flac, opus, mp3]\nvideo_formats: [mp4, mkv, webm]\nartwork:\n  embedded: true\n  folder_jpg: true\n  artist_jpg: true\n  max_resolution: 1500x1500\nnfo_files:\n  album: true\n  artist: true\n  video: true\ndirectory_pattern: \"{artist}\u002F{album} ({year})\u002F{track:02d} - {title}.{ext}\"\nvideo_directory: \"{artist}\u002FVideos\u002F{title}.{ext}\"\nmetadata:\n  prefer_embedded: true\n  id3v2_version: 2.4\n```\n\n### MPD Profile\n\n**Formats:**\n- Audio: FLAC (preferred), Opus, MP3\n- Artwork: `folder.jpg` in album directory\n\n**Directory Structure:**\n```\nMusic\u002F\n├── Artist Name\u002F\n│   └── Album Name\u002F\n│       ├── folder.jpg\n│       ├── 01 - Track Title.flac\n│       └── ...\n```\n\n**YAML Spec:**\n```yaml\nprofile: mpd\naudio_formats: [flac, opus, mp3]\nartwork:\n  embedded: true\n  folder_jpg: true\n  max_resolution: 1000x1000\ndirectory_pattern: \"{artist}\u002F{album}\u002F{track:02d} - {title}.{ext}\"\nmetadata:\n  prefer_embedded: true\n  id3v2_version: 2.4\nscanning:\n  auto_rescan: true\n  watch_mode: inotify\n```\n\n### Mobile Profile\n\n**Formats:**\n- Audio: Opus (preferred, 128-192kbps), M4A (AAC), MP3\n- Video: MP4 (H.264, max 720p)\n- Artwork: Embedded, max 500x500\n\n**Size Constraints:**\n- Transcode high-res audio to save space\n- Limit video resolution\n- Budget-aware export (stop when size limit reached)\n\n**YAML Spec:**\n```yaml\nprofile: mobile\naudio_formats: [opus, m4a, mp3]\naudio_quality:\n  opus: 128k\n  m4a: 192k\n  mp3: 192k\nvideo_formats: [mp4]\nvideo_quality:\n  max_resolution: 720p\n  codec: h264\n  bitrate: 1500k\nartwork:\n  embedded: true\n  max_resolution: 500x500\ntranscode:\n  always: true\n  source_formats: [flac, wav, alac]\nsize_budget:\n  enabled: true\n  prioritize_by: importance\ndirectory_pattern: \"{artist}\u002F{album}\u002F{track:02d} - {title}.{ext}\"\n```\n\n### Archival Profile\n\n**Formats:**\n- Audio: FLAC, WAV (no lossy formats)\n- Video: MKV (preserve original quality)\n- Checksums: SHA256SUMS\n- Provenance: PROVENANCE.jsonld\n\n**Directory Structure:**\n```\nArchive\u002F\n├── Artist Name\u002F\n│   ├── Album Name (Year)\u002F\n│   │   ├── 01 - Track Title.flac\n│   │   ├── ...\n│   │   ├── SHA256SUMS\n│   │   ├── PROVENANCE.jsonld\n│   │   └── folder.jpg\n│   └── MANIFEST.json\n```\n\n**YAML Spec:**\n```yaml\nprofile: archival\naudio_formats: [flac, wav]\nvideo_formats: [mkv]\npreserve:\n  original_filenames: true\n  source_metadata: true\n  acquisition_dates: true\nchecksums:\n  algorithm: sha256\n  filename: SHA256SUMS\nprovenance:\n  format: jsonld\n  filename: PROVENANCE.jsonld\n  include_source_urls: true\n  include_timestamps: true\nmanifest:\n  per_album: false\n  per_artist: true\n  format: json\ndirectory_pattern: \"{artist}\u002F{album} ({year})\u002F{original_filename}\"\n```\n\n## Transcoding Commands\n\n### Audio Transcoding\n\n**FLAC to Opus:**\n```bash\nffmpeg -i input.flac -c:a libopus -b:a 128k -vn output.opus\n```\n\n**FLAC to MP3:**\n```bash\nffmpeg -i input.flac -c:a libmp3lame -b:a 320k -id3v2_version 4 output.mp3\n```\n\n**Opus to MP3:**\n```bash\nffmpeg -i input.opus -c:a libmp3lame -b:a 192k -id3v2_version 4 output.mp3\n```\n\n**Preserve Metadata:**\n```bash\nffmpeg -i input.flac -c:a libopus -b:a 128k -vn -map_metadata 0 output.opus\n```\n\n### Video Transcoding\n\n**4K to 1080p:**\n```bash\nffmpeg -i input.mkv -vf scale=1920:1080 -c:v libx264 -crf 23 -c:a copy output.mp4\n```\n\n**1080p to 720p (mobile):**\n```bash\nffmpeg -i input.mp4 -vf scale=1280:720 -c:v libx264 -crf 23 -b:v 1500k -c:a aac -b:a 128k output.mp4\n```\n\n**Extract Audio Only:**\n```bash\nffmpeg -i video.mp4 -vn -c:a libopus -b:a 192k audio.opus\n```\n\n### Artwork Processing\n\n**Resize Artwork:**\n```bash\nffmpeg -i folder.jpg -vf scale=500:500:force_original_aspect_ratio=decrease -q:v 2 folder_mobile.jpg\n```\n\n**Extract Artwork from Audio:**\n```bash\nffmpeg -i track.flac -an -vcodec copy folder.jpg\n```\n\n**Embed Artwork into Audio:**\n```bash\nffmpeg -i track.flac -i folder.jpg -map 0:a -map 1:v -c:a copy -id3v2_version 4 -metadata:s:v title=\"Album cover\" -metadata:s:v comment=\"Cover (front)\" output.flac\n```\n\n## NFO File Generation\n\n### Album NFO Template (Jellyfin\u002FKodi)\n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n\u003Calbum>\n  \u003Ctitle>{album_title}\u003C\u002Ftitle>\n  \u003Cartist>{artist_name}\u003C\u002Fartist>\n  \u003Cyear>{release_year}\u003C\u002Fyear>\n  \u003Cgenre>{genre}\u003C\u002Fgenre>\n  \u003Cstyle>{style}\u003C\u002Fstyle>\n  \u003Cmood>{mood}\u003C\u002Fmood>\n  \u003Clabel>{label}\u003C\u002Flabel>\n  \u003Creleasedate>{release_date}\u003C\u002Freleasedate>\n  \u003Crating>{rating}\u003C\u002Frating>\n  \u003Cuserrating>{user_rating}\u003C\u002Fuserrating>\n  \u003Creview>{review}\u003C\u002Freview>\n  \u003Cmusicbrainzalbumid>{mbid}\u003C\u002Fmusicbrainzalbumid>\n  \u003Cthumb aspect=\"thumb\">{artwork_url}\u003C\u002Fthumb>\n\u003C\u002Falbum>\n```\n\n## Size-Budgeted Export (Mobile)\n\nWhen exporting to mobile devices with limited storage:\n\n1. **Calculate Space Budget:**\n   - Parse `--max-size` parameter\n   - Convert to bytes\n   - Reserve 10% buffer for filesystem overhead\n\n2. **Prioritize Content:**\n   - Sort by importance score (frequency * rating * recency)\n   - Essential albums first\n   - Deep cuts last\n\n3. **Transcode to Mobile Formats:**\n   - FLAC → Opus 128kbps\n   - High-res video → 720p H.264\n   - Resize artwork to 500x500\n\n4. **Track Running Total:**\n   - Sum file sizes as files are added\n   - Stop when budget exhausted\n   - Generate report of included\u002Fexcluded content\n\n5. **Export Algorithm:**\n```bash\nbudget_bytes=$(( max_size_gb * 1024 * 1024 * 1024 * 9 \u002F 10 ))\ntotal_bytes=0\n\nwhile read -r file importance; do\n  file_size=$(stat -f%z \"$file\" 2>\u002Fdev\u002Fnull || stat -c%s \"$file\")\n\n  if (( total_bytes + file_size > budget_bytes )); then\n    echo \"Budget exhausted. Stopping export.\" >&2\n    break\n  fi\n\n  # Transcode and copy\n  transcode_and_copy \"$file\" \"$output_dir\"\n  total_bytes=$(( total_bytes + file_size ))\ndone \u003C \u003C(prioritized_file_list)\n```\n\n## Archival Export\n\n### Preserve Original Formats\n\nNever transcode. Copy files as-is to preserve quality and authenticity.\n\n### Generate SHA-256 Checksums\n\n```bash\ncd \"$album_dir\"\nfind . -type f -not -name \"SHA256SUMS\" -exec sha256sum {} \\; > SHA256SUMS\n```\n\n### Record Provenance\n\nCreate `PROVENANCE.jsonld` per W3C PROV standard:\n\n```json\n{\n  \"@context\": \"https:\u002F\u002Fwww.w3.org\u002Fns\u002Fprov\",\n  \"entity\": \"urn:aiwg:media:album:{mbid}\",\n  \"wasGeneratedBy\": {\n    \"activity\": \"urn:aiwg:activity:acquisition:{timestamp}\",\n    \"time\": \"{iso8601_timestamp}\",\n    \"wasAssociatedWith\": \"urn:aiwg:agent:media-curator\"\n  },\n  \"wasDerivedFrom\": [\n    {\n      \"entity\": \"{source_url}\",\n      \"type\": \"download\",\n      \"time\": \"{acquisition_date}\"\n    }\n  ],\n  \"atLocation\": \"{file_path}\",\n  \"hadPrimarySource\": \"{authoritative_source}\"\n}\n```\n\n### Generate Manifest\n\nPer-artist `MANIFEST.json` listing all albums, tracks, formats, and checksums:\n\n```json\n{\n  \"artist\": \"Artist Name\",\n  \"albums\": [\n    {\n      \"title\": \"Album Name\",\n      \"year\": 1973,\n      \"tracks\": [\n        {\n          \"number\": 1,\n          \"title\": \"Track Title\",\n          \"file\": \"01 - Track Title.flac\",\n          \"format\": \"flac\",\n          \"checksum\": \"sha256:abc123...\"\n        }\n      ]\n    }\n  ],\n  \"export_date\": \"{iso8601_timestamp}\",\n  \"profile\": \"archival\"\n}\n```\n\n## Workflow\n\n### 1. Select Profile\n\nParse `--profile` argument. Load corresponding YAML spec.\n\n### 2. Validate Source Collection\n\n- Scan collection directory\n- Verify files exist and are readable\n- Check format compatibility with target profile\n\n### 3. Create Output Directory Structure\n\nBased on profile's `directory_pattern`:\n\n```bash\nmkdir -p \"$output_dir\u002F{artist}\u002F{album}\"\n```\n\n### 4. Transcode If Needed\n\nCheck if source format matches target profile. If not, transcode:\n\n```bash\nif [[ \"$source_ext\" == \"flac\" ]] && [[ \"$target_profile\" == \"mobile\" ]]; then\n  ffmpeg -i \"$source\" -c:a libopus -b:a 128k -map_metadata 0 \"$target\"\nfi\n```\n\n### 5. Copy\u002FMove Files\n\n```bash\ncp -a \"$source\" \"$destination\"\n```\n\nOr move if `--move` flag set.\n\n### 6. Embed Metadata\n\nEnsure all required metadata is embedded per profile spec.\n\n### 7. Generate Supplementary Files\n\n- NFO files (Jellyfin profile)\n- SHA256SUMS (archival profile)\n- PROVENANCE.jsonld (archival profile)\n- folder.jpg, artist.jpg (Plex\u002FJellyfin profiles)\n\n### 8. Report\n\n```\nExport complete: Plex profile\nSource: \u002Fmedia\u002Fsource\u002FArtist Name\nDestination: \u002Fmedia\u002Fplex\u002FMusic\u002FArtist Name\nFiles exported: 142\nTotal size: 3.2 GB\nTranscoded: 0\nCopied: 142\n```\n\n## Examples\n\n### Export to Plex\n\n```bash\n\u002Fexport --profile plex ~\u002FMusic\u002FArchive\u002FPink\\ Floyd \u002Fmedia\u002Fplex\u002FMusic\n```\n\n### Export to Mobile with Size Limit\n\n```bash\n\u002Fexport --profile mobile ~\u002FMusic\u002FArchive \u002Fsdcard\u002FMusic --max-size 32 --transcode\n```\n\n### Archival Export\n\n```bash\n\u002Fexport --profile archival ~\u002FMusic\u002FCurated \u002Fbackup\u002FMusic\u002FArchive\n```\n\n## Error Handling\n\n- Missing source files: Report and skip\n- Insufficient disk space: Abort with clear message\n- Transcode failures: Log error, optionally skip or abort\n- Permission denied: Report file path and required permissions\n\n## Performance Considerations\n\n- Parallel transcoding: Use GNU parallel or xargs -P for multi-core systems\n- Progress reporting: Update every N files or every M seconds\n- Disk I\u002FO: Batch operations to minimize seeks\n- Memory: Stream large files instead of loading into memory\n\n## References\n\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Faddons\u002Faiwg-utils\u002Frules\u002Fhuman-authorization.md — Seek explicit authorization before overwriting existing export targets\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fskills\u002Fcurate\u002FSKILL.md — Orchestration skill that invokes export as the final curation phase\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fskills\u002Fassemble\u002FSKILL.md — Assembly skill used before export to prepare media collections\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fskills\u002Fintegrity-verification\u002FSKILL.md — Verify exported files match source checksums\n",{"name":5,"namespace":48,"platforms":49,"commandHint":51,"description":7},"aiwg",[50],"all",{"model":40,"category":52,"modelRole":31,"modelTier":53,"allowedTools":54,"argumentHint":55},"media-curator","economy","Bash, Read, Write, Glob, Grep","--profile \u003Cplex|jellyfin|mpd|mobile|archival> \u003Ccollection_path> \u003Coutput_path> [--max-size \u003CGB>] [--transcode]","main","6754967c344ccb087a8de06972f55a41067b291b","agentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fskills\u002Fexport",36,"https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg","https:\u002F\u002Faiwg.io","https:\u002F\u002Fgithub.com\u002Fjmagly","https:\u002F\u002Fintegrolabs.io","ml\u002Fai, industrial automation, safety\u002Fsecurity, ssi\r\n\r\nmagly.net\r\nintegrolabs.io\r\naiwg.io\r\nfortemi.com\r\npagenary.com\r\nbytecask.com","2026-11-14 02:10:01",{"source":8,"skillName":5,"commands":67,"prompt":77,"zipAvailable":78},[68,71,74],{"tool":69,"command":70},"npx","npx skills add jmagly\u002Faiwg --skill export",{"tool":72,"command":73},"bunx","bunx skills add jmagly\u002Faiwg --skill export",{"tool":75,"command":76},"pnpm","pnpm dlx skills add jmagly\u002Faiwg --skill export","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fskills\u002Fexport\u002FSKILL.md",true,[80],{"path":81,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":84,"sourceHtmlUrl":85},"tools.sdn","OTHER","其他",578,"https:\u002F\u002Fgithub.com\u002Formastes\u002Fsimple\u002Fblob\u002Fmain\u002Fexamples\u002F05_stdlib\u002Fspipe\u002Fdoc\u002F00_llm_process\u002Fskill_command\u002Fskills\u002Fpipe\u002Fresearch\u002Fresearch_codex\u002Ftools.sdn",[87,113,135,141,148,162],{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":94,"publishedAt":43},"01M70QA0BSYJ49EES9V4RE8QH1","host-hardening","Read-only system hardening baseline and plan-first host hardening recommendations for SSH, Docker bind addresses, firewall persistence, datastores, exporters and audit retention.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fplugins\u002Fsecurity-engineering\u002Fskills\u002Fhost-hardening\u002FSKILL.md",[93],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[95,96,97,38,98,99,100,101,102,103,41,104,105,106,107,108,109,110,111,112],"host","host hardening","hardening","re","recommendations","remediation","plan","port","verification","access","only","retention","audit","never","firewall","bind","secrets","request",{"skillNo":114,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":123,"publishedAt":43},"01M70PNT2Z4HMZPRBTAF6073NN","exposure-analysis","Read-only firewall analysis and effective host exposure reconstruction for Docker published ports, UFW bypass, stale rules, CDN scope, IPv6 asymmetry and external probe allowlists.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fplugins\u002Fforensics\u002Fskills\u002Fexposure-analysis\u002FSKILL.md",[119,122],{"categoryNo":120,"categoryName":121,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[124,125,126,38,127,102,34,128,41,129,95,130,105,131,132,108,109,133,134,37],"exposure analysis","analysis","unknown","credentials","ufw","ports","internet","local","scope","reconstruction","operator",{"skillNo":136,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":137,"categories":138,"keywords":140,"publishedAt":43},"01M70P8QATMPKA78E4FT5D2TNA","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fframeworks\u002Fsecurity-engineering\u002Fskills\u002Fhost-hardening\u002FSKILL.md",[139],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[97,95,96,104,38,112,100,99,107,101,102,103,41,111,105,106,98,108,109,110],{"skillNo":142,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":147,"publishedAt":43},"01M70NMPVJ5H0JH131P60FW4R8","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fframeworks\u002Fforensics-complete\u002Fskills\u002Fexposure-analysis\u002FSKILL.md",[145,146],{"categoryNo":120,"categoryName":121,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[125,124,108,127,102,34,41,126,95,130,105,131,132,38,109,129,128,133,134,37],{"skillNo":149,"name":150,"nameZh":6,"description":151,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":152,"categories":153,"keywords":155,"publishedAt":43},"01M6CB4DDR0B4NNCFK7ZK7449H","fixture-skill","Exercise rule delivery.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Frule-delivery\u002Fskills\u002Ffixture-skill\u002FSKILL.md",[154],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[156,157,158,159,160,161],"fixture skill","fixture","rule","delivery","true","exercise",{"skillNo":163,"name":164,"nameZh":6,"description":165,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":166,"categories":167,"keywords":169,"publishedAt":43},"01M6CB4AVK1W76MFMPP0JP32CJ","pi-local","Pi-local duplicate-precedence fixture.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Fproviders\u002Fpi\u002Fproject\u002F.pi\u002Fskills\u002Fpi-local\u002FSKILL.md",[168],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[170,171,131,172,157],"pi","pi local","duplicate"]