[{"data":1,"prerenderedAt":223},["ShallowReactive",2],{"page:\u002Farticles\u002Fintroducing-explicitutil":3},{"id":4,"title":5,"author":6,"body":10,"cover":210,"date":211,"description":212,"extension":213,"head":214,"layout":216,"meta":217,"navigation":218,"path":219,"seo":220,"stem":221,"__hash__":222},"pages\u002Farticles\u002F12.introducing-explicitutil.md","Introducing ExplicitUtil",{"name":7,"avatarUrl":8,"link":9},"Likun Cai","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F103620968?v=4","https:\u002F\u002Fgithub.com\u002FAlchemist-Aloha",{"type":11,"value":12,"toc":207},"minimark",[13,17,21,37,42,100,103,106,184,187,203],[14,15,5],"h1",{"id":16},"introducing-explicitutil",[18,19,20],"p",{},"Media libraries accumulate chores: convert a directory of images, transcribe videos, normalize filenames, update NFO metadata, merge clips, unpack archives, and remove the empty folders left behind. ExplicitUtil collects those jobs behind one Python command-line interface.",[18,22,23,24,28,29,32,33,36],{},"Its commands cover image-to-WebP conversion, whisper.cpp transcription, regex-based grouping, asynchronous ZIP creation and extraction, ffmpeg video merging, recursive renaming through ",[25,26,27],"code",{},"namer",", NFO generation and updates, and empty-directory cleanup. Configuration such as the whisper.cpp path and thread count can be saved under ",[25,30,31],{},"~\u002F.explicitutil\u002F*.toml"," with ",[25,34,35],{},"--save",".",[38,39,41],"h2",{"id":40},"install-and-inspect-the-commands","Install and inspect the commands",[43,44,49],"pre",{"className":45,"code":46,"language":47,"meta":48,"style":48},"language-bash shiki shiki-themes github-light github-dark","git clone https:\u002F\u002Fgithub.com\u002FAlchemist-Aloha\u002FExplicitUtil.git\ncd ExplicitUtil\nuv sync\nuv run ExplicitUtil --help\n","bash","",[25,50,51,67,77,86],{"__ignoreMap":48},[52,53,56,60,64],"span",{"class":54,"line":55},"line",1,[52,57,59],{"class":58},"sScJk","git",[52,61,63],{"class":62},"sZZnC"," clone",[52,65,66],{"class":62}," https:\u002F\u002Fgithub.com\u002FAlchemist-Aloha\u002FExplicitUtil.git\n",[52,68,70,74],{"class":54,"line":69},2,[52,71,73],{"class":72},"sj4cs","cd",[52,75,76],{"class":62}," ExplicitUtil\n",[52,78,80,83],{"class":54,"line":79},3,[52,81,82],{"class":58},"uv",[52,84,85],{"class":62}," sync\n",[52,87,89,91,94,97],{"class":54,"line":88},4,[52,90,82],{"class":58},[52,92,93],{"class":62}," run",[52,95,96],{"class":62}," ExplicitUtil",[52,98,99],{"class":72}," --help\n",[18,101,102],{},"Some commands need external tools: ImageMagick for image conversion, a local whisper.cpp build for transcription, and ffmpeg for video merging. Start with help for the operation you intend to run and test it on copied files before enabling options that move, delete, or overwrite data.",[18,104,105],{},"Typical commands include:",[43,107,109],{"className":45,"code":108,"language":47,"meta":48,"style":48},"ExplicitUtil convert-pic .\u002Fpictures --quality 80\nExplicitUtil transcribe .\u002Fvideos --whisper-root \u002Fpath\u002Fto\u002Fwhisper.cpp\nExplicitUtil nfo .\u002Fmedia\nExplicitUtil group .\u002Fincoming --move\nExplicitUtil merge one.mp4 two.mp4 output.mp4\n",[25,110,111,128,144,154,167],{"__ignoreMap":48},[52,112,113,116,119,122,125],{"class":54,"line":55},[52,114,115],{"class":58},"ExplicitUtil",[52,117,118],{"class":62}," convert-pic",[52,120,121],{"class":62}," .\u002Fpictures",[52,123,124],{"class":72}," --quality",[52,126,127],{"class":72}," 80\n",[52,129,130,132,135,138,141],{"class":54,"line":69},[52,131,115],{"class":58},[52,133,134],{"class":62}," transcribe",[52,136,137],{"class":62}," .\u002Fvideos",[52,139,140],{"class":72}," --whisper-root",[52,142,143],{"class":62}," \u002Fpath\u002Fto\u002Fwhisper.cpp\n",[52,145,146,148,151],{"class":54,"line":79},[52,147,115],{"class":58},[52,149,150],{"class":62}," nfo",[52,152,153],{"class":62}," .\u002Fmedia\n",[52,155,156,158,161,164],{"class":54,"line":88},[52,157,115],{"class":58},[52,159,160],{"class":62}," group",[52,162,163],{"class":62}," .\u002Fincoming",[52,165,166],{"class":72}," --move\n",[52,168,170,172,175,178,181],{"class":54,"line":169},5,[52,171,115],{"class":58},[52,173,174],{"class":62}," merge",[52,176,177],{"class":62}," one.mp4",[52,179,180],{"class":62}," two.mp4",[52,182,183],{"class":62}," output.mp4\n",[18,185,186],{},"ExplicitUtil is most useful when these jobs recur. Instead of keeping a folder of unrelated scripts, it provides one discoverable CLI and one place for persistent defaults.",[18,188,189,190,197,198,36],{},"See the ",[191,192,196],"a",{"href":193,"rel":194},"https:\u002F\u002Fgithub.com\u002FAlchemist-Aloha\u002FExplicitUtil",[195],"nofollow","ExplicitUtil repository"," and its ",[191,199,202],{"href":200,"rel":201},"https:\u002F\u002Falchemist-aloha.github.io\u002FExplicitUtil\u002FExplicitUtil.html",[195],"generated API documentation",[204,205,206],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":48,"searchDepth":69,"depth":69,"links":208},[209],{"id":40,"depth":69,"text":41},"\u002Farticles\u002Fmedia-toolkit-cover.webp","2026-08-12T00:12:00.000Z","A Python CLI for repetitive media-library work: transcription, conversion, metadata, renaming, grouping, merging, and archives.","md",{"title":215},"Introducing ExplicitUtil: One CLI for Media Maintenance","page",{},true,"\u002Farticles\u002Fintroducing-explicitutil",{"title":5,"description":212},"articles\u002F12.introducing-explicitutil","uIk0W4gmT5s_KD5ffm8nWgMV5bUj8PxtWPqe848t0lU",1786980373684]