Currently in Alpha testing. Don't expect frequent updates.
PodBreaker is a Python script that:
- Parses podcast RSS feeds from sources you define.
- Re-hosts episodes (up to 512 MiB each) on free file hosts like Catbox.moe and 0x0.st (no affiliation), starting with the most recent episodes.
- Outputs one or more RSS feeds that contain re-hosted episode links.
- Strips RSS outputs of any episode links that are not re-hosted, as links from certain RSS inputs may contain personally identifying info.
- Checks if your re-hosted episodes still work over time, and reuploads them if not.
Ensure curl is installed and accessible on your system. Also install:
pip install requestsIn the script, modify the FEED_CONFIGS section:
FEED_CONFIGS = {
"Podcast Name": {
"input_urls": [
"https://domain.com/feed1.rss",
"https://domain.com/feed2.rss",
# Add more rss inputs as needed
],
"public_feed_address": "https://your-site.com/your_new_podcast_feed.rss"
},
}Podcast Name: Change as desired.input_urls: Source feeds.public_feed_address(optional): The online address where you plan to host your custom RSS feed. This is not necessarily the output directory for your RSS files; this address is written to the RSS files as an<atom>tag.
You can add multiple podcasts:
FEED_CONFIGS = {
"Podcast 1": {
"input_urls": [
"https://domain.com/feed1.rss",
"https://domain.com/feed2.rss",
# Add more rss inputs as needed
],
"public_feed_address": "https://your-site.com/podcast_1.rss"
},
"Podcast 2": {
"input_urls": [
"https://domain.com/feed3.rss",
"https://domain.com/feed4.rss",
# Add more rss inputs as needed
],
"public_feed_address": "https://your-site.com/podcast_2.rss"
},
# Add more podcast configurations as needed
}Adjust behavior with these:
OUTPUT_DIR # Directory to save output files
MAX_UPLOADS_PER_PODCAST # Max uploads per run for each podcast
GLOBAL_MAX_UPLOADS # Max uploads across all podcasts per run
# set to 0 to disable limit
UPLOAD_TIMEOUT # Timeout for each upload attempt in seconds
UPLOAD_WAIT_SECONDS # Wait time between uploads
LOGGING_LEVEL # Log verbosity: "DEBUG", "INFO", "WARNING", etc.
CONTACT_INFO # Your email, etc. (Optional).
# A best practice so hosts like 0x0.st can reach you.
# CONTACT_INFO is not printed to RSS outputs.Limit your uploads by using MAX_UPLOADS_PER_PODCAST and/or GLOBAL_MAX_UPLOADS.
When setting MAX_UPLOADS_PER_PODCAST, priority for episode uploads will be given to more recent podcast episodes.
When setting GLOBAL_MAX_UPLOADS, priority will take into account MAX_UPLOADS_PER_PODCAST, the number of podcast configurations, and the order in which podcast configurations are listed in your script, from top to bottom.
If you hit either of these limits, and additional episodes still have not been uploaded, the RSS outputs will strip any of the original episode links but still print their XML data, making them viewable but unlistenable. This is to prevent identifying information in original episode links from leaking to the RSS outputs.
For example, setting MAX_UPLOADS_PER_PODCAST to 2 and GLOBAL_MAX_UPLOADS to 0 (i.e. disabled) means that 2 episodes of each of your podcasts will be candidates for uploading, which is usually enough to keep up with new releases without going overboard.
If you run the script again with MAX_UPLOADS_PER_PODCAST still set to 2, and an output RSS file already has the 2 most recent episodes uploaded, it will consider the 2 next-most-recent episodes as upload candidates, and so on down the entire feed with each new run.
If MAX_UPLOADS_PER_PODCAST is set to 3 but GLOBAL_MAX_UPLOADS is set to 2 and you have 2 podcast configurations, only 2 episodes from your top-listed podcast configuration will be uploaded. If GLOBAL_MAX_UPLOADS is set to 5, then your top-listed podcast configuration will receive 3 uploads and your second-listed podcast configuration will only receive 2.
-
For each podcast in
FEED_CONFIGS, the script:- Tries each
input_urluntil it finds a working one. - Parses the RSS feed for metadata and episodes (based on GUID).
- Tries each
-
Uploads episodes (up to 512 MiB each) to Catbox.moe or 0x0.st (no affiliation), starting with the most recent episodes.
-
Saves the final RSS feed to your chosen
OUTPUT_DIRwith re-hosted episode links. -
On subsequent runs, detects broken or missing episode links in your RSS outputs.
-
Logs everything to
podcast_name.log.
- RSS files: e.g.,
/local/path/to/podcast_name.rss - Log files: e.g.,
/local/path/to/podcast_name.log
When PodBreaker runs, it creates the necessary output files if they don't already exist in the output directory.
If the files do exist, PodBreaker will build on those and continue to update them with rehosted audio.
KEEP YOUR OUTPUT FILES. If you remove them, PodBreaker has to start uploading all the episodes again from scratch on subsequent runs.
Run the script using:
python3 /local/path/to/podbreaker.pyIt will log its progress for each configured feed.
- Add additional file hosts to script, especially for files larger than 512 MiB.
- Add custom GUIDs or other distinct markings to output XML to force podcast apps to re-add episodes when an audio link changes.
- Incorporate existing online archives of podcasts (e.g. kemono.party) as episode sources to minimize new uploads and reduce mp3 turnover.
Please refrain from uploading too many podcast episodes in a short period of time.
The file hosters are kind enough to provide a free service, so be kind to them.
Among other things, file hosts may remove your episode uploads and/or blacklist your IP address if they consider your use of their services to be abusive. Please read their Terms of Service before using: Catbox.moe and 0x0.st.
This script is provided "as-is" without any warranties.
By using this script, you agree to all the terms and conditions stated herein, which may be updated at any time without prior notice. Continued use of this script constitutes acceptance of the most current terms.
You assume full legal responsibility for your actions using this script, including any copyright or intellectual property infringement.
Use this script ONLY for files and content for which you have legal ownership or explicit permission to upload.
The developer(s) of this script assume NO legal responsibility for how this script is used.
This script is NOT affiliated with or endorsed by any third-party services it interacts with, including but not limited to catbox.moe and 0x0.st.
Users are responsible for complying with all applicable laws and the terms of service of any third-party services used.
Uploading files to third-party services may expose your data to those services; use caution and understand the privacy implications.
The developer(s) are NOT liable for any direct, indirect, incidental, special, or consequential damages arising from use or inability to use this script.
Users should maintain their own backups; the developer(s) assume NO responsibility for data loss or corruption.
The developer(s) make NO guarantee regarding the availability, reliability, or continued operation of any third-party services utilized by this script, and functionality may break if those services change or become unavailable.
This script makes NO warranty as to the accuracy, completeness, or integrity of any modified feeds or uploaded files.
The developer(s) do NOT endorse or assume responsibility for the content of any feeds or files processed with this script.