As mentioned in previous posts, the free podcast feeds site offered by comrade @[email protected] at https://jumble.top/ has been pretty unreliable in the past weeks, and Jumble has been unreachable for a while now. In the throngs of slop withdrawal syndrome, during the days the site was down, I hacked together a replacement for that site:
https://piratefeeds.net/
For now this is simply meant as a backup, since it will take a while to collect as many feeds and build the same features that Jumble offers (I can’t proxy media files for the time being, sorry to comrades in the PRC or other countries that block Patreon). With time though, I hope this can become a viable alternative. I’m at least going to try to be online here regularly and keep downtimes to a minimum. I’m also happy to involve other contributors if anyone is down to help. To be clear, both Jumble's site and mine are basically exploiting a vulnerability in how Patreon private feeds work, there is no guarantee that they will not patch this exploit in the future.
I'm adding a technical description of the project below for the nerds who are interested. Contributions and feed donations are more than welcome! For now, out of concern for my anonymity, I'm only accepting cash donations in Monero (the wallet address is on the site). If anybody has suggestions for other way to accept donations anonymously I'm all ears.
Feel free to PM me for any of the following:
- feed donations
- cash donations
- technical suggestions to improve feed anonymization, site accessibility, security, reliability, etc.
@[email protected] if/when you come back online please reach out! I'd love to ask you for tips about your experience hosting jumble.top and possibly to collaborate on a single replacement, if you're still willing to work on this.
nerd stuff
The whole project is extremely basic and just consists of two components: a script that downloads and caches feed XML files, and a file server to serve them.
This is the script:
import csv
import sys
import xml.etree.ElementTree as ElementTree
import requests
if __name__ == "__main__":
feeds_file = sys.argv[1]
output_dir = sys.argv[2]
print("\n#### Fetching feeds...")
with open(feeds_file, newline='') as file:
feeds = csv.reader(file)
print("Loaded feeds file")
for (name, url, description) in feeds:
print(f"## Processing {name}...")
try:
headers = {'User-Agent': 'AntennaPod/3.7.0'}
response = requests.get(url, headers=headers)
print(f"Fetched {name}")
except Exception as e:
print(f"Failed to fetch feed {name}:", e)
try:
root = ElementTree.fromstring(response.content)
# Replace the description since it often contains PII
root[0].find('description').text = description
ElementTree.ElementTree(root).write(f"{output_dir}/{name}.xml")
print(f"Processed and saved {name}")
except Exception as e:
print(f"Failed to process feed {name}:", e)
I then use Caddy as a static file server to publish an index page and the feed files. I'm hosting it on a small VPS on Njalla, registered anonymously and paid in Monero, with the CloudFlare free plan on top for caching and basic protection.