diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..04a23bf --- /dev/null +++ b/.htaccess @@ -0,0 +1,8 @@ +RewriteEngine on +RewriteRule rss dir2cast.php + +RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$" +RewriteRule .* - [L,R=404] + +RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.ini[? ].*$" +RewriteRule .* - [L,R=404] \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..22021bf --- /dev/null +++ b/Dockerfile @@ -0,0 +1,46 @@ +FROM php:8.1-apache + + +# prep folders and perms +RUN mkdir -p /var/www/html/episodes + +# initialize env vars with defaults +# these can be changed with -e at docker run +ENV MP3_DIR=/var/www/html/episodes \ + MP3_URL=http://var/www/html/episodes \ + RECURSIVE_DIRECTORY_ITERATOR=true \ + COPYRIGHT= \ + WEBMASTER= \ + ITUNES_OWNER_NAME= \ + ITUNES_OWNER_EMAIL= \ + LINK= \ + TITLE= \ + ITUNES_AUTHOR= \ + ITUNES_CATEGORIES= \ + ITUNES_EXPLICIT=false \ + DESCRIPTION= \ + ITUNES_SUBTITLE= \ + ITUNES_SUMMARY= \ + ITUNES_SUBTITLE_SUFFIX= \ + ITUNES_TYPE= \ + LANGUAGE="en-us" \ + ITEM_COUNT=10000 \ + TITLE= \ + AUTO_SAVE_COVER_ART=false \ + MIN_FILE_AGE=30 \ + MIN_CACHE_TIME=5 \ + TTL=60 \ + FORCE_PASSWORD= \ + ATOM_TYPE= \ + DESCRIPTION_SOURCE= \ + DESCRIPTION_HMTL= + +# copy source files to docker +COPY ./.htaccess/ /var/www/html/ +COPY ./dir2cast.php /var/www/html/ +COPY ./getID3/ /var/www/html/getID3/ +COPY entrypoint.sh /usr/local/bin/ +RUN a2enmod rewrite +ENTRYPOINT ["/bin/sh", "/usr/local/bin/entrypoint.sh"] +EXPOSE 80 +CMD ["apache2-foreground"] \ No newline at end of file diff --git a/README.md b/README.md index 2b8de3d..a29d06f 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,8 @@ Features: * You can set a per-file iTunes Summary by creating a text file with the same name as the media file (e.g. for file.mp3, create file.txt). +* You can deploy a container using the ctkcoding/dir2cast Docker image + QUICK HOW TO GUIDES ================================================================================ @@ -98,6 +100,52 @@ podcast that it generates uses the tags from your files. the "`temp`" folder that is created. +DOCKER SETUP +================================================================================ +Note: There are many ways to get dir2cast working under docker, and this guide +is a product of trial and error. There are settings in dir2cast and SWAG that are +not covered in this guide. + +Local setup +----------- +1. Map the container's port 80 to whatever port you want to access it with on your + local network (e.g. port 8080) +2. Episodes will be scanned for at `/var/www/html/episodes` unless you pass in a + different MP3_DIR, so make sure to create a volume to map under `/var/www/html`, + or directly bind the episodes folder to a location on your file system where you wish to store episodes +4. To start the container, try something like: + `docker run --name dir2cast -d -p 8080:80 -v podcast_volume:/var/www/html/episodes ctkcoding/dir2cast:latest` and add env vars to represent settings in dir2cast.ini that + you'd like to change from the default. Dockerfile contains a list of supported ENV + options and defaults that will be used to create a new dir2cast.ini at container run + time +5. Once you add media files to the location you chose after step 2, your podcast + feed should now exist at `:/rss` + +Remote using SWAG +----------------- +1. Install SWAG and test that you can remotely access your docker server. Here's + a basic guide https://docs.linuxserver.io/general/swag +2. Create a `.subdomain.conf` file for your podcast server container as + specified in the current SWAG guide. Keep in mind the SWAG steps may have changed + since this was written +3. Set the SWAG network as the only network your dir2cast container is connected to and + restart both containers +4. Check that podcast episodes can be played/downloaded. If your feed exists and can be + subscribed to, but files aren't available, try setting `MP3_URL` env var with + https:// rather than http://. (see comment in ini file) + +Notes +----- +* If you have shared folders that are accessible from your computer, using a bind mount + (rather than a docker volume) is an easy way to enable a simple workflow for you to + drag and drop content into the podcast feed. +* If you see '.\_' prefixed junk files in your feed, that is an unfortunate side-effect + of using network shares from macOS, and not dir2cast's fault. +* 502 errors are likely SWAG configuration problems. Check container name, port mapping, etc. +* currently the only docker env vars that can be fed in at startup and set in dir2cast.ini are ITEM_COUNT, MP3_DIR, TITLE, AUTO_SAVE_COVER_ART. Copy the RUN commands in Dockerfile for any new env vars needed + +Thank you to @ctkcoding for the contribution of this guide. + UNDERSTANDING HOW THE CACHING WORKS ================================================================================ @@ -218,7 +266,7 @@ To run the unit tests: COPYRIGHT & LICENSE ================================================================================ -Copyright (c) 2008-2021, Ben XO (me@ben-xo.com). +Copyright (c) 2008-2023, Ben XO (@benxo on most platforms). The software is released under the BSD License. diff --git a/dir2cast.ini b/dir2cast.ini index fdf67db..598d43b 100755 --- a/dir2cast.ini +++ b/dir2cast.ini @@ -45,6 +45,8 @@ ; This defaults to the directory of the script. ; dir2cast can usually work this out for you, but under some circumstances ; it will fail. If your MP3 URLs are all wrong, try putting this in manually. +; If the xml/rss feed exists but podcasts won't play/download, you may need +; to set this with https i.e. "https://www.example.foo/my_mp3_folder/" ;MP3_URL = "http://www.example.foo/my_mp3_folder/" ; Uncomment this if you want to check in every sub-folder for new files as well. diff --git a/dir2cast.php b/dir2cast.php index 22be491..5f9fe61 100644 --- a/dir2cast.php +++ b/dir2cast.php @@ -1,7 +1,7 @@ > /var/www/html/dir2cast.ini +echo MP3_URL= $MP3_URL \ >> /var/www/html/dir2cast.ini +echo RECURSIVE_DIRECTORY_ITERATOR = $RECURSIVE_DIRECTORY_ITERATOR \ >> /var/www/html/dir2cast.ini +echo COPYRIGHT = $COPYRIGHT \ >> /var/www/html/dir2cast.ini +echo WEBMASTER = $WEBMASTER \ >> /var/www/html/dir2cast.ini +echo ITUNES_OWNER_NAME = $ITUNES_OWNER_NAME \ >> /var/www/html/dir2cast.ini +echo ITUNES_OWNER_EMAIL = $ITUNES_OWNER_EMAIL \ >> /var/www/html/dir2cast.ini +echo LINK = $LINK \ >> /var/www/html/dir2cast.ini +echo TITLE = $TITLE \ >> /var/www/html/dir2cast.ini +echo ITUNES_AUTHOR = $ITUNES_AUTHOR \ >> /var/www/html/dir2cast.ini +echo ITUNES_CATEGORIES = $ITUNES_CATEGORIES \ >> /var/www/html/dir2cast.ini +echo ITUNES_EXPLICIT = $ITUNES_EXPLICIT \ >> /var/www/html/dir2cast.ini +echo DESCRIPTION = $DESCRIPTION \ >> /var/www/html/dir2cast.ini +echo ITUNES_SUBTITLE = $ITUNES_SUBTITLE \ >> /var/www/html/dir2cast.ini +echo ITUNES_SUMMARY = $ITUNES_SUMMARY \ >> /var/www/html/dir2cast.ini +echo ITUNES_SUBTITLE_SUFFIX = $ITUNES_SUBTITLE_SUFFIX \ >> /var/www/html/dir2cast.ini +echo ITUNES_TYPE = $ITUNES_TYPE \ >> /var/www/html/dir2cast.ini +echo LANGUAGE = $LANGUAGE \ >> /var/www/html/dir2cast.ini +echo ITEM_COUNT= $ITEM_COUNT \ >> /var/www/html/dir2cast.ini +echo TITLE = $TITLE \ >> /var/www/html/dir2cast.ini +echo AUTO_SAVE_COVER_ART = $AUTO_SAVE_COVER_ART \ >> /var/www/html/dir2cast.ini +echo MIN_FILE_AGE = $MIN_FILE_AGE \ >> /var/www/html/dir2cast.ini +echo MIN_CACHE_TIME = $MIN_CACHE_TIME \ >> /var/www/html/dir2cast.ini +echo TTL = $TTL \ >> /var/www/html/dir2cast.ini +echo FORCE_PASSWORD = $FORCE_PASSWORD \ >> /var/www/html/dir2cast.ini +echo ATOM_TYPE = $ATOM_TYPE \ >> /var/www/html/dir2cast.ini +echo DESCRIPTION_SOURCE = $DESCRIPTION_SOURCE \ >> /var/www/html/dir2cast.ini +echo DESCRIPTION_HMTL = $DESCRIPTION_HMTL \ >> /var/www/html/dir2cast.ini + +exec "$@"