not_title filter incorrectly excludes episodes when keyword appears later in the title
Summary
The not_title filter is excluding episodes even when the forbidden keyword
does NOT appear at the start of the title.
It behaves as if the regex were matching anywhere in the string, or as if the
filter logic itself were inverted.
In short: episodes that should be allowed are being skipped with
regexp mismatch even though they do not match the not_title pattern.
This makes it impossible to exclude only specific titles (e.g., Mass titles)
without unintentionally blocking legitimate content (e.g., homilies or sermons).
Examples
These titles should be excluded (match the regex):
- "Holy Mass — Tuesday"
- "The Holy Sacrifice of the Mass"
- "The Holy Mass (Latin)"
These should NOT be excluded, but Podsync still rejects them:
- "Homily: The Parable of the Good Samaritan"
- "Sermon — Love Your Enemies"
- "Reflection on Today’s Gospel"
Podsync version
- 2.7.1-b
- Also reproduced with 2.8.0
- Running on Linux (Raspberry Pi)
Configuration snippet
filters = { min_duration = 600, not_title = "(?i)^(holy mass|holy sacrifice|the holy)( |$)" }
I wrote a unit test to validate this and the logic appears to work correctly - titles starting with the pattern get excluded, and titles like Homily: ... or Sermon — ... are kept as expected.
This makes me think something else is skipping your episodes. Could you share your debug logs (--debug flag) and full config? Also note your config has min_duration = 600, so anything under 10 minutes gets filtered out too.
Description:
I'm trying to exclude videos that start with specific patterns using the not_title filter, but all videos are being skipped with "regexp mismatch" even though some should match the pattern and be downloaded.
Expected behavior:
Videos starting with "Santa Misa", "Santo Sacrificio", or "El Santo" should be excluded
Videos starting with "Homilia, " (even if followed by "Santo Sacrificio...") should be included
Videos longer than 600 seconds should be considered
Actual behavior: All videos are skipped with "skipping due to regexp mismatch" in the logs, resulting in "no episodes to download".
Configuration:
# TOML configuration file for Podsync.
[server]
port = 4221
hostname = "https://xxxxxxxxx.xyz"
bind_address = "192.168.0.13"
[tokens]
youtube = "xxxxxxxxxxxxxx" # YouTube API Key. See https://developers.google.com/youtube/registering_an_application
vimeo = [ # Multiple keys will be rotated.
"VIMEO_API_KEY_1", # Vimeo developer keys. See https://developer.vimeo.com/api/guides/start#generate-access-token
]
[storage]
type = "local"
[storage.local]
data_dir = "/media/xxxxx/xxxxx/audios" # Don't change if you run podsync via docker
[feeds]
[feeds.IK5] # FSSP en MEXICO - Oficial
url = "https://www.youtube.com/channel/UCM-i8QqB--VNgGERPRKX1WQ"
page_size = 15
quality = "low"
format = "custom"
custom_format = { youtube_dl_format = "worstaudio[ext=m4a]", extension = "m4a" }
opml = true
cron_schedule = "20 10,15,20 * * *"
cover_art_quality = "high"
filters = { min_duration = 600, not_title = "(?i)^(santa misa|santo sacrificio|el santo)( |$)" }
clean = { keep_last = 5 }
Log output:
INFO[2025-12-04T15:05:12-08:00] opening database "db"
INFO[2025-12-04T15:05:12-08:00] All 0 tables opened in 0s
DEBU[2025-12-04T15:05:12-08:00] creating key providers
DEBU[2025-12-04T15:05:12-08:00] creating update manager
DEBU[2025-12-04T15:05:12-08:00] using address: 192.168.0.13:192.168.0.13:4221
DEBU[2025-12-04T15:05:12-08:00] handle path: /
INFO[2025-12-04T15:05:12-08:00] running listener at 192.168.0.13:4221
DEBU[2025-12-04T15:05:12-08:00] -> IK5 (update '20 10,15,20 * * *')
INFO[2025-12-04T15:05:12-08:00] -> updating https://www.youtube.com/channel/UCM-i8QqB--VNgGERPRKX1WQ feed_id=IK5 format=custom quality=low
DEBU[2025-12-04T15:05:12-08:00] building feed
DEBU[2025-12-04T15:05:14-08:00] Expected to make 1 API calls to get the descriptions for 15 episode(s).
DEBU[2025-12-04T15:05:14-08:00] received 15 episode(s) for "FSSP en MEXICO - Oficial"
DEBU[2025-12-04T15:05:14-08:00] successfully saved updates to storage
INFO[2025-12-04T15:05:14-08:00] downloading episodes page_size=15
INFO[2025-12-04T15:05:14-08:00] skipping due to duration filter (50s) episode_id=9yei6sY5Pes filter=min_duration
INFO[2025-12-04T15:05:14-08:00] skipping due to duration filter (101s) episode_id=CLUPWvWteCU filter=min_duration
INFO[2025-12-04T15:05:14-08:00] skipping due to duration filter (98s) episode_id=E1mlt1hSfmo filter=min_duration
INFO[2025-12-04T15:05:14-08:00] skipping due to regexp mismatch episode_id=KuOMQKRHUa0 filter=not_title
INFO[2025-12-04T15:05:14-08:00] skipping due to duration filter (61s) episode_id=MY8FaCO3x3k filter=min_duration
INFO[2025-12-04T15:05:14-08:00] skipping due to regexp mismatch episode_id=OxWXyzug1vQ filter=not_title
INFO[2025-12-04T15:05:14-08:00] skipping due to regexp mismatch episode_id=U5oLlWD2Oh4 filter=not_title
INFO[2025-12-04T15:05:14-08:00] skipping due to duration filter (226s) episode_id=iVwyVdzyd2I filter=min_duration
INFO[2025-12-04T15:05:14-08:00] skipping due to regexp mismatch episode_id=mSjZ9CEY0K4 filter=not_title
INFO[2025-12-04T15:05:14-08:00] skipping due to regexp mismatch episode_id=pmqwgyCRNA4 filter=not_title
INFO[2025-12-04T15:05:14-08:00] skipping due to duration filter (43s) episode_id=qLKCSOV6oMw filter=min_duration
INFO[2025-12-04T15:05:14-08:00] skipping due to regexp mismatch episode_id=sIlJRdRtZMk filter=not_title
INFO[2025-12-04T15:05:14-08:00] skipping due to duration filter (68s) episode_id=tBrySh0NIB4 filter=min_duration
INFO[2025-12-04T15:05:14-08:00] skipping due to regexp mismatch episode_id=vmC6GC_KgbA filter=not_title
INFO[2025-12-04T15:05:14-08:00] skipping due to regexp mismatch episode_id=xsYZdWG-1PY filter=not_title
INFO[2025-12-04T15:05:14-08:00] no episodes to download
INFO[2025-12-04T15:05:14-08:00] running cleaner count=5 feed_id=IK5
DEBU[2025-12-04T15:05:14-08:00] building iTunes podcast feed
INFO[2025-12-04T15:05:14-08:00] creating file: /media/xxxxx/xxxxx/audios/IK5.xml name=IK5.xml
DEBU[2025-12-04T15:05:14-08:00] written 1561 bytes name=IK5.xml
DEBU[2025-12-04T15:05:14-08:00] building podcast OPML
INFO[2025-12-04T15:05:14-08:00] creating file: /media/pidrive/xxxxxx/xxxxxx/podsync.opml name=podsync.opml
DEBU[2025-12-04T15:05:14-08:00] written 399 bytes name=podsync.opml
INFO[2025-12-04T15:05:14-08:00] successfully updated feed in 1.34599036s
INFO[2025-12-04T15:05:14-08:00] next update of IK5: 2025-12-04 15:20:00 -0800 PST
Additional context:
Podsync version: 2.8.0
I've tried various regex patterns including:
"(?i)^(santa misa|santo sacrificio|el santo)"
"(?i)^(santa misa|santo sacrificio|el santo).*"
'^(Santa Misa|Santo Sacrificio|El Santo)' (with single quotes)
All result in the same "regexp mismatch" for every video