toolsx packages a small CLI toolbox with a few ready-to-use commands:
ytm-dl- download a single YouTube Music song or a full playlist as tagged MP3 files.tg-uploader- upload a file to Telegram with a bot session.subtitle-extract- extract video subtitles or auto-captions as UTF-8 JSON, SRT, or text.netis- Netis router administration CLI for status, Wi-Fi, WAN, devices, and WPS.toolsx- list the installed tools and dispatch to a tool by name.
pip install tools_extraThe package is published as tools_extra, but the installed CLI commands stay toolsx, ytm-dl, tg-uploader and netis.
From the repo:
python -m pip install .Running toolsx prints the available tools:
toolsxYou can also dispatch through the umbrella command:
toolsx ytm-dl --help
toolsx tg-uploader --help
toolsx subtitle-extract --help
toolsx netis --helpDirect commands stay available too:
ytm-dl --help
tg-uploader --help
subtitle-extract --help
netis --helpsubtitle-extract uses yt-dlp metadata to inspect available subtitles, lets you choose a language when needed, and writes UTF-8 output as json, srt, or txt.
Examples:
subtitle-extract --url "https://www.youtube.com/watch?v=VIDEO_ID"
subtitle-extract --id VIDEO_ID --lang en --type srt
subtitle-extract --url "https://www.youtube.com/watch?v=VIDEO_ID" --lang ar --type txt --output ./captions.txt
subtitle-extract --url "https://www.youtube.com/watch?v=VIDEO_ID" --cookies-file ./cookies.txt --debug
subtitle-extract --url "https://www.youtube.com/watch?v=VIDEO_ID" --browser chrome --browser-profile Default
subtitle-extract --url "https://www.youtube.com/watch?v=VIDEO_ID" --js-runtime bun --js-runtime-path /opt/homebrew/bin/bun--langskips the interactive language picker.--typedefaults tojson.--outputdefaults to<video-id>.<type>.--cookies-fileand--browsersupport videos that need authenticated subtitle access.--js-runtimedefaults tobun; use--js-runtime-pathto point yt-dlp at a specific runtime binary.- If
--langis omitted, the tool shows available languages and prompts you to choose one.
No browser.json file is required for public URLs or IDs.
ytm-dl --url "https://music.youtube.com/playlist?list=PL..."
ytm-dl --url "https://music.youtube.com/watch?v=VIDEO_ID"
ytm-dl --id VIDEO_IDFor private playlists, liked songs, or library selection, create browser.json first with the ytmusicapi browser auth guide:
Then run:
ytm-dl --auth-file browser.json --library-index 1ytm-dl \
--url "https://music.youtube.com/playlist?list=PL..." \
--output-dir ./exports \
--yes-all \
--songs-limit 25 \
--lyrics-metadata \
--zip \
--zip-max-size 2000000000--cookies-fileuses acookies.txtfile instead of browser cookie extraction.--browserand--browser-profileuse cookies directly from a browser when needed.--js-runtimedefaults tobun;--js-runtime-pathlets yt-dlp use an explicit runtime binary path.--yes-allskips the first-song confirmation and downloads the whole playlist immediately.--output-dirsets the base export directory; by default files go to./[Album-Name].--songs-limitdefaults to all songs when omitted.--lyrics-metadatafetches lyrics with timestamps and saves them into MP3 metadata.--keep-original-audioskips MP3 conversion/tagging and keeps the downloaded source audio extension.--mp3-bitratecontrols MP3 conversion bitrate when MP3 conversion is enabled.--debugenables verbose logs for lyrics, thumbnails, metadata, and full yt-dlp output.--zip-max-sizesplits archives into.partNN.zipfiles once the source bytes per archive reach the limit.
If required input is missing in interactive mode, ytm-dl asks for it.
tg-uploader accepts values from CLI args first, then environment variables, then prompts.
It supports both --file for a single upload and --files for multiple uploads from explicit paths or glob patterns.
Supported environment variables:
TOOLSX_TG_API_ID,TG_API_ID,TELEGRAM_API_IDTOOLSX_TG_API_HASH,TG_API_HASH,TELEGRAM_API_HASHTOOLSX_TG_BOT_TOKEN,TG_BOT_TOKEN,TELEGRAM_BOT_TOKENTOOLSX_TG_CHAT_ID,TG_CHAT_ID,TELEGRAM_CHAT_ID
Example:
export TOOLSX_TG_API_ID=12345
export TOOLSX_TG_API_HASH=your_api_hash
export TOOLSX_TG_BOT_TOKEN=123:token
export TOOLSX_TG_CHAT_ID=-1001234567890
tg-uploader --file ./archive.zip --caption "Nightly build"
tg-uploader --files './exports/*'
tg-uploader --files './exports/*.mp3' './exports/*.flac'Interactive mode also accepts glob patterns from the current directory. For example, entering (*) uploads all visible files in the current directory, and (*.mp3) uploads all matching MP3 files. If a pattern matches nothing, the command exits with an error.
Debug mode:
tg-uploader --file ./archive.zip --debug- Example:
netis # Friendly TUI
netis --full-report
netis --wlan-info
netis --admin-password newpasshere
netis --internet-info
netis --devices-info
netis --wps-info
netis -h-
Working with all
netisWi-Fi Routers, Models:- Wi-Fi 6:
NX62,NX31,NX30,NX10,N6. - Wi-Fi 5:
NC65,NC66,NC63,NC21,N2,N3F,WF2780,N5,N3D, and all other Wi-Fi 5 Routers. - Wi-Fi 4:
WF2409E,WF2409PD,WF2419E,W1,W4, and all other Wi-Fi 4 Routers.
- Wi-Fi 6:
-
Tested on:
N3Dwith latest versionV4.0.1.4296WF2409Ewith latest versionV4.0.1.4296
git clone https://github.com/z44d/toolsx
cd toolsx
python -m pip install -e .- Add the new module under
src/. - Register it in
src/toolsx/registry.pysotoolsxlists it. - Add one console script entry under
[project.scripts]inpyproject.toml.
The GitHub workflow at .github/workflows/publish.yml builds and publishes to PyPI on version tags like v0.1.0.
Before using it, configure PyPI trusted publishing for the repository or provide the required PyPI credentials in GitHub.