diff --git a/README.md b/README.md index 0b1e6d0..93493cb 100644 --- a/README.md +++ b/README.md @@ -155,6 +155,38 @@ audio-samplerate=48000 volume-max=200 ``` +## `Docker Guide` +If you want to run Abogen in a Docker container: +1) [Download the repository](https://github.com/denizsafak/abogen/archive/refs/heads/main.zip) and extract, or clone it using git. +2) Go to `abogen` folder. You should see `Dockerfile` there. +3) Open your termminal in that directory and run the following commands: + +```bash +# Build the Docker image: +docker build --progress plain -t abogen . + +# Note that building the image may take a while. +# After building is complete, run the Docker container: + +# Windows +docker run --name abogen -v %cd%:/shared -p 5800:5800 -p 5900:5900 --gpus all abogen + +# Linux +docker run --name abogen -v $(pwd):/shared -p 5800:5800 -p 5900:5900 --gpus all abogen + +# MacOS +docker run --name abogen -v $(pwd):/shared -p 5800:5800 -p 5900:5900 abogen + +# We expose port 5800 for use by a web browser, 5900 if you want to connect with a VNC client. +``` + +Abogen launches automatically inside the container. +- You can access it via a web browser at `http://localhost:5800` or connect to it using a VNC client at `localhost:5900`. +- You can use `/shared` directory to share files between your host and the container. +- For later use, start it with `docker start abogen` and stop it with `docker stop abogen`. + +(Special thanks to [@geo38](https://www.reddit.com/user/geo38/) from Reddit, who provided the Dockerfile and instructions in [this comment](https://www.reddit.com/r/selfhosted/comments/1k8x1yo/comment/mpe0bz8/).) + ## `Similar Projects` Abogen is a standalone project, but it is inspired by and shares some similarities with other projects. Here are a few: - [audiblez](https://github.com/santinic/audiblez): Generate audiobooks from e-books. **(Has CLI and GUI support)** diff --git a/abogen/Dockerfile b/abogen/Dockerfile new file mode 100644 index 0000000..a4fd02a --- /dev/null +++ b/abogen/Dockerfile @@ -0,0 +1,50 @@ +# Special thanks to @geo38 from Reddit, who provided this Dockerfile: +# https://www.reddit.com/r/selfhosted/comments/1k8x1yo/comment/mpe0bz8/ + +# Use a docker base image that runs a window manager that can be viewed +# outside the image with a web browser or VNC client. +# https://github.com/jlesage/docker-baseimage-gui + +FROM jlesage/baseimage-gui:debian-12-v4 + +# Load stuff needed by abogen +RUN apt-get update \ + && apt-get install -y \ + python3 \ + python3-venv \ + python3-pip \ + python3-pyqt5 \ + espeak-ng \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# The base image will run /startapp.sh on launch. +# +# The base image runs that script as user 'app' uid=1000. That user +# does not exist in the base image but is created at run time. +# +# We need to install abogen in python venv (requirement of newer python3). +# +# The python venv has to be writable by the 'app' user as abogen dynamically +# installs python packages, so create the venv as that user +# +# We intend to share the /shared directory with the host using a bind volume +# in order to access any source files and the created files. + +RUN echo '#!/bin/bash\nsource /app/venv/bin/activate\nexec abogen' > /startapp.sh \ + && chmod 555 /startapp.sh \ + && mkdir /app /shared \ + && chown 1000:1000 /app /shared \ + && chmod 755 /app /shared + +# Switch to user 1000 to create the virtual environment +USER 1000:1000 +RUN python3 -m venv /app/venv + +# Make /app the working dir, copy your project in, and install from “.” +COPY . /app/ +WORKDIR /app +RUN /bin/bash -c "source venv/bin/activate && pip install ." + +# Change back to root for the base‐image startup scripts +USER root \ No newline at end of file diff --git a/abogen/utils.py b/abogen/utils.py index d8cd5cd..1b0625b 100644 --- a/abogen/utils.py +++ b/abogen/utils.py @@ -67,8 +67,18 @@ def get_version(): # Define config path def get_user_config_path(): from platformdirs import user_config_dir - # Use platformdirs to get the user configuration directory - config_dir = user_config_dir("abogen", appauthor=False, roaming=True) + # TODO Config directory is changed for Linux and MacOS. But if old config exists, it will be used. + # On non‑Windows, prefer ~/.config/abogen if it already exists + if platform.system() != "Windows": + custom_dir = os.path.join(os.path.expanduser("~"), ".config", "abogen") + if os.path.exists(custom_dir): + config_dir = custom_dir + else: + config_dir = user_config_dir("abogen", appauthor=False, roaming=True) + else: + # Windows and fallback case + config_dir = user_config_dir("abogen", appauthor=False, roaming=True) + os.makedirs(config_dir, exist_ok=True) return os.path.join(config_dir, "config.json")