{"id":37356712,"url":"https://github.com/machineonamission/mediaforge","last_synced_at":"2026-01-16T04:39:53.406Z","repository":{"id":39718899,"uuid":"315462403","full_name":"machineonamission/mediaforge","owner":"machineonamission","description":"A Discord bot for editing and creating videos, images, GIFs, and more!","archived":false,"fork":false,"pushed_at":"2026-01-12T02:14:59.000Z","size":132756,"stargazers_count":93,"open_issues_count":33,"forks_count":31,"subscribers_count":7,"default_branch":"master","last_synced_at":"2026-01-12T07:35:57.819Z","etag":null,"topics":["bot","discord","discord-py","ffmpeg","fun","gifs","libvips","meme","python"],"latest_commit_sha":null,"homepage":"https://discord.com/oauth2/authorize?client_id=780570413767983122","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/machineonamission.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"ko_fi":"machineonamission","custom":"https://www.buymeacoffee.com/machineonamission"}},"created_at":"2020-11-23T23:06:14.000Z","updated_at":"2026-01-12T02:15:02.000Z","dependencies_parsed_at":"2024-09-07T23:31:25.218Z","dependency_job_id":"061d204c-9745-43e1-9bcd-0b6a0e89bb7f","html_url":"https://github.com/machineonamission/mediaforge","commit_stats":null,"previous_names":["reticivis-net/mediaforge","hexcodefff/mediaforge","machineonamission/mediaforge"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/machineonamission/mediaforge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/machineonamission%2Fmediaforge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/machineonamission%2Fmediaforge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/machineonamission%2Fmediaforge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/machineonamission%2Fmediaforge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/machineonamission","download_url":"https://codeload.github.com/machineonamission/mediaforge/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/machineonamission%2Fmediaforge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28477210,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T03:13:13.607Z","status":"ssl_error","status_checked_at":"2026-01-16T03:11:47.863Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bot","discord","discord-py","ffmpeg","fun","gifs","libvips","meme","python"],"created_at":"2026-01-16T04:39:53.344Z","updated_at":"2026-01-16T04:39:53.400Z","avatar_url":"https://github.com/machineonamission.png","language":"Python","funding_links":["https://ko-fi.com/machineonamission","https://www.buymeacoffee.com/machineonamission","https://ko-fi.com/Q5Q75US4A"],"categories":[],"sub_categories":[],"readme":"# ![MediaForge](media/external/banner.png)\n\n# [Invite MediaForge!](https://discord.com/oauth2/authorize?client_id=780570413767983122)\n\n[![Discord Bots](https://top.gg/api/widget/780570413767983122.svg)](https://top.gg/bot/780570413767983122)\n\n![Total Lines](https://img.shields.io/endpoint?url=https://ghloc.vercel.app/api/machineonamission/mediaforge/badge?filter=.py\u0026style=flat\u0026label=Lines%20of%20Code)\n[![wakatime](https://wakatime.com/badge/user/ceaa3b2d-5469-499f-97ed-b23bda26c31a/project/7114917f-f795-4c9f-aadf-0e66528176be.svg)](https://wakatime.com/@machineonamission/projects/ttvriomkzo)\n[![stars](https://img.shields.io/github/stars/machineonamission/mediaforge?style=social)](https://github.com/machineonamission/mediaforge/stargazers)\n[![uptime](https://app.statuscake.com/button/index.php?Track=6022597\u0026Design=6)](https://uptime.statuscake.com/?TestID=JyWrfGfIjT)\n[![MediaForge Discord](https://discordapp.com/api/guilds/803788965215338546/widget.png)](https://discord.gg/xwWjgyVqBz)\n[![built with immense swag](https://img.shields.io/static/v1?label=built+with\u0026message=immense+swag\u0026color=D262BA)](https://knowyourmeme.com/memes/trollface)\n\n[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/Q5Q75US4A)\n\n### A Discord bot for editing and creating videos, images, GIFs, and more!\n\n## general technical info about the bot\n\n- inspired by [esmBot](https://github.com/esmBot/esmBot)\n- uses discord.py 2\n- uses libvips for captioning\n- uses FFmpeg for media processing\n\n## self-host with docker\n\n### to install\n\nas of writing, a working docker copy of MediaForge takes up ~3.46GB. if this is a concern and you are using some of the\napt libraries MediaForge does, see [to self-host natively](#to-self-host-natively)\n\nAll you need to install yourself is [Docker Desktop](https://docs.docker.com/get-docker/)\n\nonce that's installed, run these commands in your terminal of choice.\n\n```shell\ndocker build -t machineonamission/mediaforge https://github.com/machineonamission/mediaforge.git\ndocker run -it --cap-add SYS_NICE --name mediaforge machineonamission/mediaforge\n```\n\non linux, you may need to run docker with `sudo`\n\nif the installation succeeded, you should be prompted with some options. you'll need to select \"Edit Config\". this will\nopen a text editor within your terminal. the 1 required config setting to change for proper functionality is the\n[discord token](https://github.com/reactiflux/discord-irc/wiki/creating-a-discord-bot-\u0026-getting-a-token). be sure not to\nadd or remove quotes. press `CTRL+S` to save and `CTRL+X` to exit.\n\nif you don't want to use the built-in text editor, you can [get the example config from GitHub](config.example.py), hold\ndown `CTRL+K` to clear the file and then use `CTRL+V` to paste in your config.\n\n### to run\n\nrun in your favorite terminal:\n\n```shell\ndocker start -ia mediaforge\n```\n\nby default, MediaForge will await user input for 10 seconds before attempting to run the bot automatically.\n\n### to stop\n\nkilling the terminal window/`CTRL+C` won't kill the bot, because docker runs in the background.\n\nto stop the bot, run\n\n```shell\ndocker stop mediaforge\n```\n\nif the bot refuses to stop for some reason, you can run\n\n```shell\ndocker kill mediaforge\n```\n\nto forcibly kill it.\n\n### to limit resource consumption\n\nsince docker is very containerized, you can easily limit the amount of resources it's allowed to consume.\n\nthe main command to do this is [`docker update`](https://docs.docker.com/engine/reference/commandline/update/#usage),\nthough most of these arguments can be passed verbatim to `docker run` during setup.\n\nthe most useful options are `--memory` and `--cpus`.\n\nfor example, this is (as of writing) what the official MediaForge bot uses:\n\n```shell\ndocker update --memory 9000M --memory-swap -1 --cpus \"3.9\" mediaforge\n```\n\n- `--memory 9000M`: this limits it to 9gb (9000mb) of physical memory\n- `--memory-swap -1`: this allows it to use as much swap memory as it wants (swap memory is temporarily storing memory\n  on disk)\n- `--cpus \"3.9\"`: the host server has 4 cores, so this allows it to use \"3.9\"/4 (97.5%) of the PC's CPU time.\n\n### Automode\n\nthis is designed to work with hosting providers where terminal control is not possible. There are 3 arguments to this\nmode that can be set as\ndocker [build arguments](https://docs.docker.com/engine/reference/commandline/build/#build-arg)\nor [environment variables](https://docs.docker.com/engine/reference/commandline/run/#env)\n.\n`AUTOMODE`: set to \"ON\" to enable automode\n`AUTOUPDATE`: set to \"ON\" to update code and packages every run\n`CONFIG`: base64 encoded version of your config file.\n\n#### to encode base 64\n\n##### on linux:\n\n- `base64 config.py` prints the output to terminal\n- `base64 config.py \u003e config.txt` writes the output to `config.txt`\n\n##### with python:\n\n```python\nimport base64\n\nwith open(\"config.py\", \"rb\") as f:\n    out = base64.b64encode(f.read())\nprint(out)  # write to terminal\n# write to file\nwith open(\"config.txt\", \"wb+\") as f:\n    f.write(out)\n```\n\n## to self-host natively\n\nMediaForge is a complex application and manually installing all dependencies is a headache. for almost all use\ncases, [the docker distribution](#self-host-with-docker) is much better.\n\n### summary\n\nensure your OS is one of the [supported OSes](#supported-oses), then install the [python libraries](#python-libraries)\nand the [non-python libraries](#non-python-libraries), set up the [config](#config), and [run](#to-run)\n\n### supported OSes\n\nbuilt and tested on windows 11 and debian bookworm (inside docker). these 2 OSes (and their successors) will\ncontinue to be officially supported.\n\nMediaForge only has official support for x86_64, but ARM64 seems to work fine\n\nwill _probably_ work on macos and other linux/unix distros if the below libraries are available but theyre untested and\nunsupported. just replace `apt-get` with your system's preferred package manager ([`brew`](https://brew.sh/) for macos)\n\non Windows, color emojis won't work. no idea why, just is a windows pango bug.\n\n### python libraries\n\n- MediaForge depends on Python ≥3.11. `uv` will install it automatically.\n- This project uses [`uv`](https://github.com/astral-sh/uv), which will automatically install python and dependencies on\n  run.\n    - install `uv` with [these instructions](https://docs.astral.sh/uv/getting-started/installation/) (varies per\n      system)\n    - part of [`pyvips`](https://pypi.org/project/pyvips/) is built from source on installation.\n        - on Windows this will require the MSVC compiler, which is an optional component\n          of [Visual Studio](https://visualstudio.microsoft.com/downloads/)\n        - on Linux this will require [`gcc`](https://packages.ubuntu.com/bionic/gcc), installable\n          by `sudo apt-get install gcc`\n\n### non-python libraries\n\nthe bot uses many external CLI programs for media processing.\n\n- FFmpeg - not included but [easily installable on windows and linux](https://ffmpeg.org/download.html)\n    - **If installing on linux, ensure that ffmpeg version \u003e= 5**\n- libvips - installable on linux with `sudo apt-get install libvips-dev`\n  . [windows instructions here](https://www.libvips.org/install.html#installing-the-windows-binary)\n- ImageMagick - **not included** but [downloadable here](https://imagemagick.org/script/download.php)\n- TTS\n    - on linux, this uses [`mimic`](https://github.com/MycroftAI/mimic1). a pre-compiled binary is included.\n        - the male and female voices are downloaded from mimic's repo on bot start if they are not detected. if you want\n          to re-download for some reason, delete the 2 files ending in `.flitefox` in `tts/`\n    - on windows, [`powershell`](https://aka.ms/powershell) is used to\n      access [Windows's native TTS](https://docs.microsoft.com/en-us/uwp/api/windows.media.speechsynthesis.speechsynthesizer)\n      . Both are included in modern versions of Windows, but ensure powershell is in the system path.\n- deno - [deno](https://deno.com/)\n    - if you're curious, it's used for the retro TTS and yt-dlp's bgpot plugin\n\n### config\n\n- create a copy of [`config.example.py`](config.example.py) and name it `config.py`.\n- insert/change the appropriate config settings such as your discord api token. be sure not to add or remove quotes.\n- the 2 required config settings to change for proper functionality are the discord and tenor tokens.\n\n### python\n\n- developed and tested on python 3.11. use that or a later compatible version\n\n### to run\n\n- once you've set up all of the libraries, just run the program with `uv run python src/main.py` make sure it can read\n  and write to the\n  directory it lives in and also access/execute all the aforementioned libraries\n- terminate the bot by running the `shutdown` command, this will _probably_ close better than a termination\n\n## legal stuff\n\n[terms of service](media/external/terms_of_service.md)\n\n[privacy policy](media/external/privacy_policy.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmachineonamission%2Fmediaforge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmachineonamission%2Fmediaforge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmachineonamission%2Fmediaforge/lists"}