feat: RSS sync worker
ci / web (pull_request) Successful in 25s
e2e / e2e (pull_request) Successful in 55s
ci / rust (pull_request) Successful in 2m12s

One empty-query Torznab call per indexer every ten minutes, matched
against the whole wanted list locally (DESIGN.md §6.2). Matching is
conservative: a TMDB id the tracker supplied wins outright, a title needs
its year, and an ambiguity is not a match.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Miguel Palhas
2026-08-23 00:55:39 +01:00
co-authored by Claude Opus 5
parent e01505bd53
commit fd4d409c8d
11 changed files with 1285 additions and 146 deletions
@@ -0,0 +1,20 @@
{
"db_name": "SQLite",
"query": "SELECT original_language FROM movies WHERE id = ?",
"describe": {
"columns": [
{
"name": "original_language",
"ordinal": 0,
"type_info": "Text"
}
],
"parameters": {
"Right": 1
},
"nullable": [
true
]
},
"hash": "7fa29678b941e5eb680db2dcb11ed1912b950a84d1ce7eaa406339b024aac82d"
}
@@ -0,0 +1,38 @@
{
"db_name": "SQLite",
"query": "\n SELECT m.id AS \"id!: i64\",\n m.tmdb_id AS \"tmdb_id!: i64\",\n m.title AS \"title!: String\",\n m.year\n FROM movies m\n WHERE m.wanted = 1\n AND NOT EXISTS (\n SELECT 1 FROM media_files f\n WHERE f.owner_kind = 'movie' AND f.owner_id = m.id\n )\n AND NOT EXISTS (\n SELECT 1 FROM grabs g\n WHERE g.target_kind = 'movie' AND g.target_id = m.id\n AND g.state IN ('sent', 'downloaded', 'imported')\n )\n ORDER BY m.id\n ",
"describe": {
"columns": [
{
"name": "id!: i64",
"ordinal": 0,
"type_info": "Integer"
},
{
"name": "tmdb_id!: i64",
"ordinal": 1,
"type_info": "Integer"
},
{
"name": "title!: String",
"ordinal": 2,
"type_info": "Text"
},
{
"name": "year",
"ordinal": 3,
"type_info": "Integer"
}
],
"parameters": {
"Right": 0
},
"nullable": [
false,
false,
false,
true
]
},
"hash": "d318af0005db414990095d0d86e312f26fd0e57018ba6a4667d53b590080d4a7"
}