Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add working dockerfile and update readme #77

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions .github/workflows/publish-image.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

# GitHub recommends pinning actions to a commit SHA.
# To get a newer version, you will need to update the SHA.
# You can also reference a tag or branch, but the action may change without warning.

name: Publish Docker image

on:
workflow_dispatch:
# release:
# types: [published]

env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}

jobs:
build-and-push-image:
runs-on: ubuntu-latest
# Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job.
permissions:
contents: read
packages: write
id-token: write
#
steps:
- name: Checkout repository
uses: actions/checkout@v4
# Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here.
- name: Log in to the Container registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` "meta" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels.
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
# This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages.
# It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see [Usage](https://github.com/docker/build-push-action#usage) in the README of the `docker/build-push-action` repository.
# It uses the `tags` and `labels` parameters to tag and label the image with the output from the "meta" step.
- name: Build and push Docker image
id: push
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

2 changes: 1 addition & 1 deletion .github/workflows/testing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ jobs:
build:
strategy:
matrix:
operating-system: [ubuntu-latest, macos-11]
operating-system: [ubuntu-latest, macos-15]
php-versions: ['7.3', '7.4', '8.0', '8.1', '8.2']
runs-on: ${{ matrix.operating-system }}
steps:
Expand Down
8 changes: 8 additions & 0 deletions .htaccess
Original file line number Diff line number Diff line change
@@ -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]
46 changes: 46 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -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= \
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 \
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 ./dir2cast.ini.sample /var/www/html/dir2cast.ini
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"]
41 changes: 40 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:main Docker image


QUICK HOW TO GUIDES
================================================================================
Expand Down Expand Up @@ -98,6 +100,43 @@ 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. Review the existing docker-compose and dir2cast.ini as a baseline to start locally
2. A new container will use the defaults in the sample .ini file if no file is provided, but changes to the file made after initial container start will persist.
3. Episodes are expected at `/var/www/html/episodes` by default - so create a volume to map under `/var/www/html`, or directly bind to a location on your file system where you wish to store episodes.
4. Once you add media files to the location you chose after step 2, your podcast feed should now exist at `<docker ip>:<port>/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 `<container>.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` with https:// (see comment in source 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 related to dir2cast. Use macOS' native dot_clean command to remove these files
* 502 errors are likely SWAG configuration problems. Check container name, port mapping, etc.
* all dir2cast.ini variables should be supported as docker env vars - if you find this is not correct, look at 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
================================================================================

Expand Down Expand Up @@ -218,7 +257,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.

Expand Down
20 changes: 11 additions & 9 deletions dir2cast.ini
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
; The full filesystem path to the MP3 folder
; Set this if you *do not* want the folder to be passed in the URL.
; (This defaults to the same folder as the script)
;MP3_DIR = "/home/ben_xo/public_html/my_mp3_folder"
; MP3_DIR = "/var/www/html/episodes"

; The base to look for folders if they are specified in the URL
; Set this if you *do* want the folder passed in the URL, but the passed
Expand All @@ -45,10 +45,12 @@
; 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.
;RECURSIVE_DIRECTORY_ITERATOR = true
; RECURSIVE_DIRECTORY_ITERATOR = true



Expand Down Expand Up @@ -103,7 +105,7 @@
;
; If you don't set this, it will not appear in the feed at all, and Apple
; Podcasts may reject your feed!
;ITUNES_EXPLICIT = "no"
; ITUNES_EXPLICIT = "false"


; *** INFORMATION ABOUT YOUR PODCAST - the following can be set using text files ***
Expand Down Expand Up @@ -186,15 +188,15 @@
; the RSS standard. Apple Podcasts only supports values from the ISO 639 list
; (two-letter language codes, with some possible modifiers, such as "en-us").
; See https://www.loc.gov/standards/iso639-2/php/code_list.php
;LANGUAGE = "en-us"
; LANGUAGE = "en-us"

; Where to cache RSS feeds (this must be writable by the web server)
; This defaults to a folder called 'temp' alongside the script
;TMP_DIR = "/tmp"

; Number of items to show in the feed
; This defaults to 10
;ITEM_COUNT = 10
; ITEM_COUNT = 10000

; Format of the <title> tag for each item. If this is set to 'false',
; then <title> will be set to the 'title' field in your ID3 tag.
Expand All @@ -206,7 +208,7 @@
; can become the episode image. This will never overwrite a file that
; you uploaded manually, but if dir2cast doesn't have write permissions
; in your podcast folder then it will fail. So, then perhaps turn it off.
;AUTO_SAVE_COVER_ART = true
; AUTO_SAVE_COVER_ART = true


; *** THESE SHOULD BE LEFT AS THEY ARE - unless you have a good reason. ***
Expand All @@ -215,7 +217,7 @@
; younger than this it might indicate that they are still being uploaded.
;
; Defaults to 30 seconds
;MIN_FILE_AGE = 30
; MIN_FILE_AGE = 30

; Number of seconds for which the cache files are guaranteed valid; that is
; to say, if you generate a new feed, and then hit refresh a lot, it will
Expand All @@ -225,12 +227,12 @@
; dir2cast.php.
;
; Defaults to 5 seconds
;MIN_CACHE_TIME = 5
; MIN_CACHE_TIME = 5

; Time-to-live (Expiry time) of the feed. This appears in the <ttl> tag, and
; is used by Podcast clients to determine if it is worth refetching the feed.
; Defaults to 1 hour (60 minutes)
;TTL = 60
; TTL = 60

; The password to use on the 'force=<password>' part of the URL in order to
; force the RSS feed to be regenerated (bypassing and replacing the cached
Expand Down
Loading