Music Tool Bot is the ultimate bot for managing your music files effortlessly! 🎵✨. Check it out here: @MusicToolBot
Currently, supports 6 languages: English and Persian, Russian, Spanish, French, Arabic. (Add more if you want)
- Python 3.8 or higher (Preferably)
ffmpegvenv- Optionally you can install
pm2(globally) which is a Node.js module to manage processes. Sincepm2can also manage Python processes, I use it to run the bot in production. No Node.js/JavaScript knowledge is required. Just installpm2and run convenient script runners usingmake. If you want to run the bot using other process managers, that's fine.
-
Register for a Telegram Bot:
Register a new bot at Bot Father and get a bot token. -
Clone this repo:
Rungit clone https://github.com/amirhoseinsalimi/music-tool-bot.git music-tool-bot && cd music-tool-bot -
Install Poetry (if not installed):
Follow Poetry’s official installation guide. -
Install dependencies:
Runpoetry install.
This will also create a virtual environment for the project. Run commands inside this virtual environment with:poetry run <command> -
Setup environment variables:
Runcp .env.example .env. Then put your credentials there:Field Type Description APP_ENV strDefines app's environment. Valid values: productionBOT_NAME strThe name of the bot BOT_USERNAME strThe username of the bot. This username is sent as signature in captions. BOT_TOKEN strThe bot token you grabbed from @BotFather DB_HOST strDatabase host (for postgres). DB_PORT intDatabase port (for postgres). DB_DATABASE strDatabase name (for postgres). DB_USERNAME strDatabase username (for postgres). DB_PASSWORD strDatabase password (for postgres). OWNER_USER_ID intThe user ID of the owner of the bot. This user has more privileges. DEBUGGER booleanEnables remote attach with pydevd-pycharmDEBUGGER_HOST strOptional PyCharm debug server host. Defaults to 127.0.0.1locally and trieshost.docker.internalin DockerDEBUGGER_PORT intPyCharm debug server port. Defaults to 5400DEBUGGER_SUSPEND booleanSuspends on debugger attach when trueBTC_WALLET_ADDRESS strBTC wallet address to receive donations. ETH_WALLET_ADDRESS strETH wallet address to receive donations. TRX_WALLET_ADDRESS strTRX wallet address to receive donations. USDT_TRC20_WALLET_ADDRESS strUSDT (TRC20) wallet address to receive donations. USDT_ERC20_WALLET_ADDRESS strUSDT (ERC20) wallet address to receive donations. SHIBA_BEP20_WALLET_ADDRESS strSHIBA (BEP20) wallet address to receive donations. SHIBA_ERC20_WALLET_ADDRESS strSHIBA (ERC20) wallet address to receive donations. DOGE_WALLET_ADDRESS strDOGE wallet address to receive donations. ZARIN_LINK_ADDRESS strZarinLink address to receive donations. -
Set up the database:
This bot persists users/admins in PostgreSQL. Run migrations:
make db-migrate.
Then run seeds to populate theadminstable with an owner-level access:
make db-seed. -
Run the bot
a. Start the botmake start
b. Restart the botmake restart
See below for all possible commands:
Command make <cmd> |
Description |
|---|---|
dev |
Start the bot for development with hot reload thanks to jurigged |
start |
Start the bot for production using pm2 module. Creates a process called music-tool-bot |
restart |
Restarts the bot process with the name music-tool-bot |
stop |
Stops the bot process with the name music-tool-bot |
db:migrate |
Run migrations |
db:refresh |
Rollback all migration and re-run them (Use with caution) |
db:status |
Print the status of migrations |
db:seed |
Run seeds to create a user with owner privileges |
test |
Run tests (Not implemented yet) |
t |
Alias for test command |
You can also run the bot in Docker, without installing Python, Poetry, or ffmpeg on your machine.
-
Clone the repo
git clone https://github.com/amirhoseinsalimi/music-tool-bot.git music-tool-bot cd music-tool-bot -
Prepare your environment file
cp .env.example .envFill in your bot credentials as explained above. -
Run database migrations
docker compose -f docker-compose.yaml -f docker-compose.dev.yaml run --rm bot make db-migrate docker compose -f docker-compose.yaml -f docker-compose.dev.yaml run --rm bot make db-seed
-
Start the bot (development mode with hot reload)
docker compose -f docker-compose.yaml -f docker-compose.dev.yaml upIn dev mode, Docker Compose starts a local Postgres container and publishes it on
${DB_PORT:-5432}. -
Start the bot (production mode)
docker compose -f docker-compose.yaml -f docker-compose.prod.yaml up -d -
Apply migrations in production before first start
docker compose -f docker-compose.yaml -f docker-compose.prod.yaml run --rm bot make db-migrate docker compose -f docker-compose.yaml -f docker-compose.prod.yaml run --rm bot make db-seed
This repo includes an optional Grafana Alloy setup that tails the bot container logs from Docker and forwards them to Grafana Cloud Logs.
Why this uses a separate Compose file:
- Grafana log shipping is optional, so it is kept as an overlay instead of being forced into every local run.
- This lets you enable or disable log shipping by adding or removing one
-f docker-compose.grafana.yaml.
You need three values:
- Loki push URL
- Loki username
- Grafana Cloud API token
How to find them in Grafana Cloud:
- Sign in to Grafana Cloud and open your stack.
- Select Details for the stack.
- Open the Loki / Logs section.
- Copy the stack URL and user ID from the Loki details page.
The push URL should look similar to:
The username is the numeric stack user / instance ID.
GRAFANA_CLOUD_LOKI_URL=https://logs-xxx.grafana.net/loki/api/v1/push
- Create a token:
- Open Administration -> Cloud access policies inside the stack, or use the Cloud Portal access policies page.
- Create an access policy scoped to your stack.
- Give it
logs:writepermission. - Add a token under that policy and copy it immediately. Grafana only shows it once.
Add these values to .env:
GRAFANA_CLOUD_LOKI_URL=https://logs-xxx.grafana.net/loki/api/v1/push
GRAFANA_CLOUD_LOKI_USERNAME=123456
GRAFANA_CLOUD_API_KEY=your-tokendocker compose \
-f docker-compose.yaml \
-f docker-compose.dev.yaml \
-f docker-compose.grafana.yaml \
updocker compose \
-f docker-compose.yaml \
-f docker-compose.prod.yaml \
-f docker-compose.grafana.yaml \
up -dOpen Grafana Explore and query:
{app="music-tool-bot"}
You can also filter by environment:
{app="music-tool-bot", environment="development"}
or:
{app="music-tool-bot", environment="production"}
Development:
docker compose -f docker-compose.yaml -f docker-compose.dev.yaml upProduction:
docker compose -f docker-compose.yaml -f docker-compose.prod.yaml up -dThe included Alloy config only ships logs from the Compose service named bot, and adds these labels:
app="music-tool-bot"compose_projectcompose_serviceservice_nameenvironment
Alloy's local debug UI is exposed on http://127.0.0.1:12345.
In the beginning, I had written this bot in JavaScript, but due to a lack of quality packages, it was full of bugs. Then
I decided to learn Python and thought: Why not re-write @MusicToolBot in Python? And then I began to revive the
project.
This tiny bot is my first practical Python project. I tried to learn Python along with coding, so I could better wrap my head around the syntax and the built-in functionality of the language. However, as a novice Python developer, I know this bot can be written in a more smart way with better code structure. So, if you know Python, I would really appreciate any help to make this kid better. My main concern is the application structure, but please feel free to create PRs, open discussions and make small fixes (like typos). In addition, I have some plans and features for this bot, you can find them on the issue board. Also, I'd really appreciate it if you can translate the bot to your language.