diff --git a/src/Jackett.Common/Definitions/catorrent.yml b/src/Jackett.Common/Definitions/catorrent.yml index 6ab6e92eb..cdba27f9e 100644 --- a/src/Jackett.Common/Definitions/catorrent.yml +++ b/src/Jackett.Common/Definitions/catorrent.yml @@ -88,8 +88,13 @@ search: poster: selector: img attribute: src - description: + genre: selector: div.short_game_genre + filters: + - name: re_replace + args: ["\\s+/\\s+", ", "] + description: + text: "{{ .Result.genre }}" date: text: now seeders: diff --git a/src/Jackett.Common/Definitions/digitalcore.yml b/src/Jackett.Common/Definitions/digitalcore.yml index c7190da1b..ff5befecf 100644 --- a/src/Jackett.Common/Definitions/digitalcore.yml +++ b/src/Jackett.Common/Definitions/digitalcore.yml @@ -177,8 +177,7 @@ search: year_desc: optional: true selector: year - genre_desc: - optional: true + genre: selector: genres _tagline_desc: optional: true @@ -222,5 +221,5 @@ search: - name: regexp args: "(.+?), $" description: - text: "{{ if .Result.title_desc }}Title: {{ .Result.title_desc }}
{{ else }}{{ end }}{{ if .Result.year_desc }}Year: {{ .Result.year_desc }}
{{ else }}{{ end }}{{ if .Result.genre_desc }}Genres: {{ .Result.genre_desc }}
{{ else }}{{ end }}{{ if .Result._tagline_desc }}Tagline: {{ .Result._tagline_desc }}
{{ else }}{{ end }}{{ if .Result._cast_desc }}Cast: {{ .Result._cast_desc }}
{{ else }}{{ end }}{{ if .Result._rating_desc }}Rating: {{ .Result._rating_desc }}
{{ else }}{{ end }}{{ if .Result._tag_desc }}Tags: {{ .Result._tag_desc }}
{{ else }}{{ end }}{{ if .Result._predate_desc }}PRE: {{ .Result._predate_desc }}
{{ else }}{{ end }}{{ if .Result._section_desc }}Section: {{ .Result._section_desc }}{{ else }}{{ end }}" + text: "{{ if .Result.title_desc }}Title: {{ .Result.title_desc }}
{{ else }}{{ end }}{{ if .Result.year_desc }}Year: {{ .Result.year_desc }}
{{ else }}{{ end }}{{ if .Result.genre }}Genres: {{ .Result.genre }}
{{ else }}{{ end }}{{ if .Result._tagline_desc }}Tagline: {{ .Result._tagline_desc }}
{{ else }}{{ end }}{{ if .Result._cast_desc }}Cast: {{ .Result._cast_desc }}
{{ else }}{{ end }}{{ if .Result._rating_desc }}Rating: {{ .Result._rating_desc }}
{{ else }}{{ end }}{{ if .Result._tag_desc }}Tags: {{ .Result._tag_desc }}
{{ else }}{{ end }}{{ if .Result._predate_desc }}PRE: {{ .Result._predate_desc }}
{{ else }}{{ end }}{{ if .Result._section_desc }}Section: {{ .Result._section_desc }}{{ else }}{{ end }}" # json rartracker api v1 diff --git a/src/Jackett.Common/Definitions/estone.yml b/src/Jackett.Common/Definitions/estone.yml index 45dfaaff8..7696febf8 100644 --- a/src/Jackett.Common/Definitions/estone.yml +++ b/src/Jackett.Common/Definitions/estone.yml @@ -36,7 +36,7 @@ caps: modes: search: [q] tv-search: [q, season, ep] - movie-search: [q] + movie-search: [q, genre] music-search: [q] book-search: [q] @@ -95,7 +95,7 @@ search: # 0 name, 1 performer, 2 director miben: 0 # genre - cimke: "" + cimke: "{{ .Query.Genre }}" # does not support imdbid search and does not return imdb link in results rows: @@ -153,9 +153,13 @@ search: case: img[src="pic/dupla_up.png"]: 2 "*": 1 + genre: + selector: div i + filters: + - name: regexp + args: "\\((.+?)\\)" description: - selector: div:nth-child(2) - remove: a + text: "{{ .Result.genre }}" minimumratio: text: 1.0 minimumseedtime: diff --git a/src/Jackett.Common/Definitions/polishsource.yml b/src/Jackett.Common/Definitions/polishsource.yml index 779208f52..562243c24 100644 --- a/src/Jackett.Common/Definitions/polishsource.yml +++ b/src/Jackett.Common/Definitions/polishsource.yml @@ -26,8 +26,8 @@ caps: modes: search: [q] tv-search: [q, season, ep, imdbid] - movie-search: [q, imdbid] - music-search: [q] + movie-search: [q, imdbid, genre] + music-search: [q, genre] book-search: [q] settings: @@ -97,8 +97,8 @@ search: scene: 0 # 0 all, 1 Polish, 2 non-Polish, 4 subtitled pl: 0 - # subcat blank=all - sub: "" + # genre blank=all + sub: "{{ .Query.Genre }}" # title, both, nfo search_in: "{{ if .Query.IMDBID }}nfo{{ else }}title{{ end }}" sort: "{{ .Config.sort }}" @@ -131,20 +131,14 @@ search: download: selector: a[href^="downloadssl.php?id="] attribute: href - _genre: - optional: true + genre: selector: td:nth-child(2) > small - filters: - - name: prepend - args: "Genre: " - - name: append - args: "\n
" _language: optional: true selector: img[src="pic/pl.png"] filters: - name: append - args: "Language: polish\n
" + args: "Language: Polish\n
" _subbed: optional: true selector: img[src="pic/napisy.png"] @@ -152,7 +146,7 @@ search: - name: append args: "Subbed\n
" description: - text: "{{ .Result._genre }}{{ .Result._language }}{{ .Result._subbed }}" + text: "Genre: {{ .Result.genre }}\n
{{ .Result._language }}{{ .Result._subbed }}" imdbid: selector: a[href*="imdb.com/title/tt"] date: diff --git a/src/Jackett.Common/Definitions/rptorrents.yml b/src/Jackett.Common/Definitions/rptorrents.yml index 114ca23a8..05f829c50 100644 --- a/src/Jackett.Common/Definitions/rptorrents.yml +++ b/src/Jackett.Common/Definitions/rptorrents.yml @@ -96,8 +96,8 @@ search: inputs: $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" search: "{{ .Keywords }}" - # 0 name & desc, 1 name, 2 desc, 3 genre - incldesc: 1 + # 0 any sub, 2 RO sub + inclrosub: 0 # 0 active, 1 incldead, 2 onlydead incldead: 1 # 0 inclfree, 1 notfree, 2 onlyfree @@ -128,6 +128,9 @@ search: download: selector: a[href^="download.php?id="] attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href size: selector: td:nth-child(4) date: @@ -152,6 +155,13 @@ search: case: img[src="images/t_extern.png"]: 0 "*": 1 + genre: + selector: td div + filters: + - name: regexp + args: "Genre: (.+?)$" + description: + text: "{{ .Result.genre }}" minimumratio: text: 1.0 # TorrentTrader-Ro 3.0 diff --git a/src/Jackett.Common/Definitions/schema.json b/src/Jackett.Common/Definitions/schema.json index e2647aec3..5edee5478 100644 --- a/src/Jackett.Common/Definitions/schema.json +++ b/src/Jackett.Common/Definitions/schema.json @@ -184,7 +184,7 @@ "uniqueItems": true, "items": { "type": "string", - "enum": ["q", "imdbid", "tmdbid", "traktid", "doubanid"] + "enum": ["q", "imdbid", "tmdbid", "traktid", "doubanid", "genre"] } }, "music-search": { @@ -192,7 +192,7 @@ "uniqueItems": true, "items": { "type": "string", - "enum": ["q", "album", "artist", "label", "track", "year"] + "enum": ["q", "album", "artist", "label", "track", "year", "genre"] } }, "book-search": { diff --git a/src/Jackett.Common/Definitions/superbits.yml b/src/Jackett.Common/Definitions/superbits.yml index 49dc30d25..7e7d2cfb7 100644 --- a/src/Jackett.Common/Definitions/superbits.yml +++ b/src/Jackett.Common/Definitions/superbits.yml @@ -178,8 +178,7 @@ search: year_desc: optional: true selector: year - genre_desc: - optional: true + genre: selector: genres _tagline_desc: optional: true @@ -263,5 +262,5 @@ search: - name: regexp args: "(.+?), $" description: - text: "{{ if .Result.title_desc }}Title: {{ .Result.title_desc }}
{{ else }}{{ end }}{{ if .Result.year_desc }}Year: {{ .Result.year_desc }}
{{ else }}{{ end }}{{ if .Result.genre_desc }}Genres: {{ .Result.genre_desc }}
{{ else }}{{ end }}{{ if .Result._tagline_desc }}Tagline: {{ .Result._tagline_desc }}
{{ else }}{{ end }}{{ if .Result._cast_desc }}Cast: {{ .Result._cast_desc }}
{{ else }}{{ end }}{{ if .Result._rating_desc }}Rating: {{ .Result._rating_desc }}
{{ else }}{{ end }}{{ if .Result._plot_desc }}Plot: {{ .Result._plot_desc }}
{{ else }}{{ end }}{{ if .Result._tag_desc }}Tags: {{ .Result._tag_desc }}
{{ else }}{{ end }}{{ if .Result._predate_desc }}PRE: {{ .Result._predate_desc }}
{{ else }}{{ end }}{{ if .Result._section_desc }}Section: {{ .Result._section_desc }}{{ else }}{{ end }}" + text: "{{ if .Result.title_desc }}Title: {{ .Result.title_desc }}
{{ else }}{{ end }}{{ if .Result.year_desc }}Year: {{ .Result.year_desc }}
{{ else }}{{ end }}{{ if .Result.genre }}Genres: {{ .Result.genre }}
{{ else }}{{ end }}{{ if .Result._tagline_desc }}Tagline: {{ .Result._tagline_desc }}
{{ else }}{{ end }}{{ if .Result._cast_desc }}Cast: {{ .Result._cast_desc }}
{{ else }}{{ end }}{{ if .Result._rating_desc }}Rating: {{ .Result._rating_desc }}
{{ else }}{{ end }}{{ if .Result._plot_desc }}Plot: {{ .Result._plot_desc }}
{{ else }}{{ end }}{{ if .Result._tag_desc }}Tags: {{ .Result._tag_desc }}
{{ else }}{{ end }}{{ if .Result._predate_desc }}PRE: {{ .Result._predate_desc }}
{{ else }}{{ end }}{{ if .Result._section_desc }}Section: {{ .Result._section_desc }}{{ else }}{{ end }}" # json rartracker api v1 diff --git a/src/Jackett.Common/Definitions/teracod.yml b/src/Jackett.Common/Definitions/teracod.yml index 598ba1986..a222df4cf 100644 --- a/src/Jackett.Common/Definitions/teracod.yml +++ b/src/Jackett.Common/Definitions/teracod.yml @@ -48,7 +48,7 @@ caps: modes: search: [q] tv-search: [q, season, ep] - movie-search: [q] + movie-search: [q, genre] music-search: [q] book-search: [q] @@ -107,7 +107,7 @@ search: # 0 active, 1 all, 2 dead, 3 recomended, 4 double, 5 free, 6 MZ releases, 7 Race torrents # note: option 4 and 5 do not actually filter. everything is returned. incldead: "{{ if .Config.freeleech }}5{{ else }}1{{ end }}" - genre: 0 + genre: "{{ .Query.Genre }}" # 0 name, 1 descr, 2 both blah: 0 sort: "{{ .Config.sort }}" @@ -171,6 +171,13 @@ search: case: "font[color=\"#2A821E\"]:contains(\"x2\")": 2 "*": 1 + genre: + selector: td.torrent:nth-child(2) + filters: + - name: regexp + args: "\\((.+?)\\)" + description: + text: "{{ .Result.genre }}" minimumratio: text: 1.0 minimumseedtime: diff --git a/src/Jackett.Common/Indexers/CardigannIndexer.cs b/src/Jackett.Common/Indexers/CardigannIndexer.cs index b6bf47cd4..4cef3dbf6 100644 --- a/src/Jackett.Common/Indexers/CardigannIndexer.cs +++ b/src/Jackett.Common/Indexers/CardigannIndexer.cs @@ -38,7 +38,7 @@ namespace Jackett.Common.Indexers set => base.configData = value; } - protected readonly string[] OptionalFields = { "imdb", "imdbid", "tmdbid", "rageid", "tvdbid", "tvmazeid", "traktid", "doubanid", "poster", "description" }; + protected readonly string[] OptionalFields = { "imdb", "imdbid", "tmdbid", "rageid", "tvdbid", "tvmazeid", "traktid", "doubanid", "poster", "genre", "description" }; private static readonly string[] _SupportedLogicFunctions = { @@ -1307,7 +1307,7 @@ namespace Jackett.Common.Indexers variables[".Query.Artist"] = query.Artist; variables[".Query.Label"] = query.Label; variables[".Query.Track"] = query.Track; - //variables[".Query.Genre"] = query.Genre ?? new List(); + variables[".Query.Genre"] = query.Genre; variables[".Query.Episode"] = query.GetEpisodeSearchString(); variables[".Query.Author"] = query.Author; variables[".Query.Title"] = query.Title; @@ -2080,8 +2080,10 @@ namespace Jackett.Common.Indexers value = release.DoubanId.ToString(); break; case "genre": + if (release.Genres == null) + release.Genres = new List(); release.Genres = release.Genres.Union(value.Split(',')).ToList(); - value = release.Genres.ToString(); + // value = release.Genres.ToString(); break; case "year": release.Year = ReleaseInfo.GetBytes(value); diff --git a/src/Jackett.Common/Models/DTO/TorznabRequest.cs b/src/Jackett.Common/Models/DTO/TorznabRequest.cs index 8e9a24522..91e20b868 100644 --- a/src/Jackett.Common/Models/DTO/TorznabRequest.cs +++ b/src/Jackett.Common/Models/DTO/TorznabRequest.cs @@ -94,7 +94,7 @@ namespace Jackett.Common.Models.DTO if (!string.IsNullOrWhiteSpace(request.year)) query.Year = int.Parse(request.year); if (!string.IsNullOrWhiteSpace(request.genre)) - query.Genre = request.genre.Split(','); + query.Genre = request.genre; if (!string.IsNullOrWhiteSpace(request.title)) query.Title = request.title; diff --git a/src/Jackett.Common/Models/TorznabCapabilities.cs b/src/Jackett.Common/Models/TorznabCapabilities.cs index 4ed168768..4251cfd87 100644 --- a/src/Jackett.Common/Models/TorznabCapabilities.cs +++ b/src/Jackett.Common/Models/TorznabCapabilities.cs @@ -25,7 +25,8 @@ namespace Jackett.Common.Models ImdbId, TmdbId, TraktId, - DoubanId + DoubanId, + Genre } public enum MusicSearchParam @@ -35,7 +36,8 @@ namespace Jackett.Common.Models Artist, Label, Track, - Year + Year, + Genre } public enum BookSearchParam @@ -72,6 +74,7 @@ namespace Jackett.Common.Models public bool MovieSearchTmdbAvailable => (MovieSearchParams.Contains(MovieSearchParam.TmdbId)); public bool MovieSearchTraktAvailable => (MovieSearchParams.Contains(MovieSearchParam.TraktId)); public bool MovieSearchDoubanAvailable => (MovieSearchParams.Contains(MovieSearchParam.DoubanId)); + public bool MovieSearchGenreAvailable => (MovieSearchParams.Contains(MovieSearchParam.Genre)); public List MusicSearchParams; public bool MusicSearchAvailable => (MusicSearchParams.Count > 0); @@ -80,6 +83,7 @@ namespace Jackett.Common.Models public bool MusicSearchLabelAvailable => (MusicSearchParams.Contains(MusicSearchParam.Label)); public bool MusicSearchTrackAvailable => (MusicSearchParams.Contains(MusicSearchParam.Track)); public bool MusicSearchYearAvailable => (MusicSearchParams.Contains(MusicSearchParam.Year)); + public bool MusicSearchGenreAvailable => (MusicSearchParams.Contains(MusicSearchParam.Genre)); public List BookSearchParams; public bool BookSearchAvailable => (BookSearchParams.Count > 0); @@ -219,6 +223,8 @@ namespace Jackett.Common.Models parameters.Add("traktid"); if (MovieSearchDoubanAvailable) parameters.Add("doubanid"); + if (MovieSearchGenreAvailable) + parameters.Add("genre"); return string.Join(",", parameters); } @@ -235,6 +241,8 @@ namespace Jackett.Common.Models parameters.Add("track"); if (MusicSearchYearAvailable) parameters.Add("year"); + if (MusicSearchGenreAvailable) + parameters.Add("genre"); return string.Join(",", parameters); } diff --git a/src/Jackett.Common/Models/TorznabQuery.cs b/src/Jackett.Common/Models/TorznabQuery.cs index acddaca97..2e68f3774 100644 --- a/src/Jackett.Common/Models/TorznabQuery.cs +++ b/src/Jackett.Common/Models/TorznabQuery.cs @@ -33,7 +33,7 @@ namespace Jackett.Common.Models public string Label { get; set; } public string Track { get; set; } public int? Year { get; set; } - public ICollection Genre { get; set; } + public string Genre { get; set; } public string Author { get; set; } public string Title { get; set; } @@ -141,6 +141,7 @@ namespace Jackett.Common.Models Artist = Artist, Label = Label, Track = Track, + Genre = Genre, Year = Year, Author = Author, Title = Title,