core: enable genre queries (#13394)

Co-authored-by: garfield69 <garfieldsixtynine@gmail.com>
Co-authored-by: garfield69 <garfield69@outlook.com>
This commit is contained in:
ilike2burnthing 2022-07-24 10:19:43 +01:00 committed by GitHub
parent 507f2f22f7
commit 75ae674998
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 66 additions and 37 deletions

View File

@ -88,8 +88,13 @@ search:
poster: poster:
selector: img selector: img
attribute: src attribute: src
description: genre:
selector: div.short_game_genre selector: div.short_game_genre
filters:
- name: re_replace
args: ["\\s+/\\s+", ", "]
description:
text: "{{ .Result.genre }}"
date: date:
text: now text: now
seeders: seeders:

View File

@ -177,8 +177,7 @@ search:
year_desc: year_desc:
optional: true optional: true
selector: year selector: year
genre_desc: genre:
optional: true
selector: genres selector: genres
_tagline_desc: _tagline_desc:
optional: true optional: true
@ -222,5 +221,5 @@ search:
- name: regexp - name: regexp
args: "(.+?), $" args: "(.+?), $"
description: description:
text: "{{ if .Result.title_desc }}Title: {{ .Result.title_desc }}</br>{{ else }}{{ end }}{{ if .Result.year_desc }}Year: {{ .Result.year_desc }}</br>{{ else }}{{ end }}{{ if .Result.genre_desc }}Genres: {{ .Result.genre_desc }}</br>{{ else }}{{ end }}{{ if .Result._tagline_desc }}Tagline: {{ .Result._tagline_desc }}</br>{{ else }}{{ end }}{{ if .Result._cast_desc }}Cast: {{ .Result._cast_desc }}</br>{{ else }}{{ end }}{{ if .Result._rating_desc }}Rating: {{ .Result._rating_desc }}</br>{{ else }}{{ end }}{{ if .Result._tag_desc }}Tags: {{ .Result._tag_desc }}</br>{{ else }}{{ end }}{{ if .Result._predate_desc }}PRE: {{ .Result._predate_desc }}</br>{{ else }}{{ end }}{{ if .Result._section_desc }}Section: {{ .Result._section_desc }}{{ else }}{{ end }}" text: "{{ if .Result.title_desc }}Title: {{ .Result.title_desc }}</br>{{ else }}{{ end }}{{ if .Result.year_desc }}Year: {{ .Result.year_desc }}</br>{{ else }}{{ end }}{{ if .Result.genre }}Genres: {{ .Result.genre }}</br>{{ else }}{{ end }}{{ if .Result._tagline_desc }}Tagline: {{ .Result._tagline_desc }}</br>{{ else }}{{ end }}{{ if .Result._cast_desc }}Cast: {{ .Result._cast_desc }}</br>{{ else }}{{ end }}{{ if .Result._rating_desc }}Rating: {{ .Result._rating_desc }}</br>{{ else }}{{ end }}{{ if .Result._tag_desc }}Tags: {{ .Result._tag_desc }}</br>{{ else }}{{ end }}{{ if .Result._predate_desc }}PRE: {{ .Result._predate_desc }}</br>{{ else }}{{ end }}{{ if .Result._section_desc }}Section: {{ .Result._section_desc }}{{ else }}{{ end }}"
# json rartracker api v1 # json rartracker api v1

View File

@ -36,7 +36,7 @@ caps:
modes: modes:
search: [q] search: [q]
tv-search: [q, season, ep] tv-search: [q, season, ep]
movie-search: [q] movie-search: [q, genre]
music-search: [q] music-search: [q]
book-search: [q] book-search: [q]
@ -95,7 +95,7 @@ search:
# 0 name, 1 performer, 2 director # 0 name, 1 performer, 2 director
miben: 0 miben: 0
# genre # genre
cimke: "" cimke: "{{ .Query.Genre }}"
# does not support imdbid search and does not return imdb link in results # does not support imdbid search and does not return imdb link in results
rows: rows:
@ -153,9 +153,13 @@ search:
case: case:
img[src="pic/dupla_up.png"]: 2 img[src="pic/dupla_up.png"]: 2
"*": 1 "*": 1
genre:
selector: div i
filters:
- name: regexp
args: "\\((.+?)\\)"
description: description:
selector: div:nth-child(2) text: "{{ .Result.genre }}"
remove: a
minimumratio: minimumratio:
text: 1.0 text: 1.0
minimumseedtime: minimumseedtime:

View File

@ -26,8 +26,8 @@ caps:
modes: modes:
search: [q] search: [q]
tv-search: [q, season, ep, imdbid] tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid] movie-search: [q, imdbid, genre]
music-search: [q] music-search: [q, genre]
book-search: [q] book-search: [q]
settings: settings:
@ -97,8 +97,8 @@ search:
scene: 0 scene: 0
# 0 all, 1 Polish, 2 non-Polish, 4 subtitled # 0 all, 1 Polish, 2 non-Polish, 4 subtitled
pl: 0 pl: 0
# subcat blank=all # genre blank=all
sub: "" sub: "{{ .Query.Genre }}"
# title, both, nfo # title, both, nfo
search_in: "{{ if .Query.IMDBID }}nfo{{ else }}title{{ end }}" search_in: "{{ if .Query.IMDBID }}nfo{{ else }}title{{ end }}"
sort: "{{ .Config.sort }}" sort: "{{ .Config.sort }}"
@ -131,20 +131,14 @@ search:
download: download:
selector: a[href^="downloadssl.php?id="] selector: a[href^="downloadssl.php?id="]
attribute: href attribute: href
_genre: genre:
optional: true
selector: td:nth-child(2) > small selector: td:nth-child(2) > small
filters:
- name: prepend
args: "Genre: "
- name: append
args: "\n<br>"
_language: _language:
optional: true optional: true
selector: img[src="pic/pl.png"] selector: img[src="pic/pl.png"]
filters: filters:
- name: append - name: append
args: "Language: polish\n<br>" args: "Language: Polish\n<br>"
_subbed: _subbed:
optional: true optional: true
selector: img[src="pic/napisy.png"] selector: img[src="pic/napisy.png"]
@ -152,7 +146,7 @@ search:
- name: append - name: append
args: "Subbed\n<br>" args: "Subbed\n<br>"
description: description:
text: "{{ .Result._genre }}{{ .Result._language }}{{ .Result._subbed }}" text: "Genre: {{ .Result.genre }}\n<br>{{ .Result._language }}{{ .Result._subbed }}"
imdbid: imdbid:
selector: a[href*="imdb.com/title/tt"] selector: a[href*="imdb.com/title/tt"]
date: date:

View File

@ -96,8 +96,8 @@ search:
inputs: inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}" $raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}" search: "{{ .Keywords }}"
# 0 name & desc, 1 name, 2 desc, 3 genre # 0 any sub, 2 RO sub
incldesc: 1 inclrosub: 0
# 0 active, 1 incldead, 2 onlydead # 0 active, 1 incldead, 2 onlydead
incldead: 1 incldead: 1
# 0 inclfree, 1 notfree, 2 onlyfree # 0 inclfree, 1 notfree, 2 onlyfree
@ -128,6 +128,9 @@ search:
download: download:
selector: a[href^="download.php?id="] selector: a[href^="download.php?id="]
attribute: href attribute: href
imdbid:
selector: a[href*="imdb.com/title/tt"]
attribute: href
size: size:
selector: td:nth-child(4) selector: td:nth-child(4)
date: date:
@ -152,6 +155,13 @@ search:
case: case:
img[src="images/t_extern.png"]: 0 img[src="images/t_extern.png"]: 0
"*": 1 "*": 1
genre:
selector: td div
filters:
- name: regexp
args: "Genre: (.+?)$"
description:
text: "{{ .Result.genre }}"
minimumratio: minimumratio:
text: 1.0 text: 1.0
# TorrentTrader-Ro 3.0 # TorrentTrader-Ro 3.0

View File

@ -184,7 +184,7 @@
"uniqueItems": true, "uniqueItems": true,
"items": { "items": {
"type": "string", "type": "string",
"enum": ["q", "imdbid", "tmdbid", "traktid", "doubanid"] "enum": ["q", "imdbid", "tmdbid", "traktid", "doubanid", "genre"]
} }
}, },
"music-search": { "music-search": {
@ -192,7 +192,7 @@
"uniqueItems": true, "uniqueItems": true,
"items": { "items": {
"type": "string", "type": "string",
"enum": ["q", "album", "artist", "label", "track", "year"] "enum": ["q", "album", "artist", "label", "track", "year", "genre"]
} }
}, },
"book-search": { "book-search": {

View File

@ -178,8 +178,7 @@ search:
year_desc: year_desc:
optional: true optional: true
selector: year selector: year
genre_desc: genre:
optional: true
selector: genres selector: genres
_tagline_desc: _tagline_desc:
optional: true optional: true
@ -263,5 +262,5 @@ search:
- name: regexp - name: regexp
args: "(.+?), $" args: "(.+?), $"
description: description:
text: "{{ if .Result.title_desc }}Title: {{ .Result.title_desc }}</br>{{ else }}{{ end }}{{ if .Result.year_desc }}Year: {{ .Result.year_desc }}</br>{{ else }}{{ end }}{{ if .Result.genre_desc }}Genres: {{ .Result.genre_desc }}</br>{{ else }}{{ end }}{{ if .Result._tagline_desc }}Tagline: {{ .Result._tagline_desc }}</br>{{ else }}{{ end }}{{ if .Result._cast_desc }}Cast: {{ .Result._cast_desc }}</br>{{ else }}{{ end }}{{ if .Result._rating_desc }}Rating: {{ .Result._rating_desc }}</br>{{ else }}{{ end }}{{ if .Result._plot_desc }}Plot: {{ .Result._plot_desc }}</br>{{ else }}{{ end }}{{ if .Result._tag_desc }}Tags: {{ .Result._tag_desc }}</br>{{ else }}{{ end }}{{ if .Result._predate_desc }}PRE: {{ .Result._predate_desc }}</br>{{ else }}{{ end }}{{ if .Result._section_desc }}Section: {{ .Result._section_desc }}{{ else }}{{ end }}" text: "{{ if .Result.title_desc }}Title: {{ .Result.title_desc }}</br>{{ else }}{{ end }}{{ if .Result.year_desc }}Year: {{ .Result.year_desc }}</br>{{ else }}{{ end }}{{ if .Result.genre }}Genres: {{ .Result.genre }}</br>{{ else }}{{ end }}{{ if .Result._tagline_desc }}Tagline: {{ .Result._tagline_desc }}</br>{{ else }}{{ end }}{{ if .Result._cast_desc }}Cast: {{ .Result._cast_desc }}</br>{{ else }}{{ end }}{{ if .Result._rating_desc }}Rating: {{ .Result._rating_desc }}</br>{{ else }}{{ end }}{{ if .Result._plot_desc }}Plot: {{ .Result._plot_desc }}</br>{{ else }}{{ end }}{{ if .Result._tag_desc }}Tags: {{ .Result._tag_desc }}</br>{{ else }}{{ end }}{{ if .Result._predate_desc }}PRE: {{ .Result._predate_desc }}</br>{{ else }}{{ end }}{{ if .Result._section_desc }}Section: {{ .Result._section_desc }}{{ else }}{{ end }}"
# json rartracker api v1 # json rartracker api v1

View File

@ -48,7 +48,7 @@ caps:
modes: modes:
search: [q] search: [q]
tv-search: [q, season, ep] tv-search: [q, season, ep]
movie-search: [q] movie-search: [q, genre]
music-search: [q] music-search: [q]
book-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 # 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. # note: option 4 and 5 do not actually filter. everything is returned.
incldead: "{{ if .Config.freeleech }}5{{ else }}1{{ end }}" incldead: "{{ if .Config.freeleech }}5{{ else }}1{{ end }}"
genre: 0 genre: "{{ .Query.Genre }}"
# 0 name, 1 descr, 2 both # 0 name, 1 descr, 2 both
blah: 0 blah: 0
sort: "{{ .Config.sort }}" sort: "{{ .Config.sort }}"
@ -171,6 +171,13 @@ search:
case: case:
"font[color=\"#2A821E\"]:contains(\"x2\")": 2 "font[color=\"#2A821E\"]:contains(\"x2\")": 2
"*": 1 "*": 1
genre:
selector: td.torrent:nth-child(2)
filters:
- name: regexp
args: "\\((.+?)\\)"
description:
text: "{{ .Result.genre }}"
minimumratio: minimumratio:
text: 1.0 text: 1.0
minimumseedtime: minimumseedtime:

View File

@ -38,7 +38,7 @@ namespace Jackett.Common.Indexers
set => base.configData = value; 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 = private static readonly string[] _SupportedLogicFunctions =
{ {
@ -1307,7 +1307,7 @@ namespace Jackett.Common.Indexers
variables[".Query.Artist"] = query.Artist; variables[".Query.Artist"] = query.Artist;
variables[".Query.Label"] = query.Label; variables[".Query.Label"] = query.Label;
variables[".Query.Track"] = query.Track; variables[".Query.Track"] = query.Track;
//variables[".Query.Genre"] = query.Genre ?? new List<string>(); variables[".Query.Genre"] = query.Genre;
variables[".Query.Episode"] = query.GetEpisodeSearchString(); variables[".Query.Episode"] = query.GetEpisodeSearchString();
variables[".Query.Author"] = query.Author; variables[".Query.Author"] = query.Author;
variables[".Query.Title"] = query.Title; variables[".Query.Title"] = query.Title;
@ -2080,8 +2080,10 @@ namespace Jackett.Common.Indexers
value = release.DoubanId.ToString(); value = release.DoubanId.ToString();
break; break;
case "genre": case "genre":
if (release.Genres == null)
release.Genres = new List<string>();
release.Genres = release.Genres.Union(value.Split(',')).ToList(); release.Genres = release.Genres.Union(value.Split(',')).ToList();
value = release.Genres.ToString(); // value = release.Genres.ToString();
break; break;
case "year": case "year":
release.Year = ReleaseInfo.GetBytes(value); release.Year = ReleaseInfo.GetBytes(value);

View File

@ -94,7 +94,7 @@ namespace Jackett.Common.Models.DTO
if (!string.IsNullOrWhiteSpace(request.year)) if (!string.IsNullOrWhiteSpace(request.year))
query.Year = int.Parse(request.year); query.Year = int.Parse(request.year);
if (!string.IsNullOrWhiteSpace(request.genre)) if (!string.IsNullOrWhiteSpace(request.genre))
query.Genre = request.genre.Split(','); query.Genre = request.genre;
if (!string.IsNullOrWhiteSpace(request.title)) if (!string.IsNullOrWhiteSpace(request.title))
query.Title = request.title; query.Title = request.title;

View File

@ -25,7 +25,8 @@ namespace Jackett.Common.Models
ImdbId, ImdbId,
TmdbId, TmdbId,
TraktId, TraktId,
DoubanId DoubanId,
Genre
} }
public enum MusicSearchParam public enum MusicSearchParam
@ -35,7 +36,8 @@ namespace Jackett.Common.Models
Artist, Artist,
Label, Label,
Track, Track,
Year Year,
Genre
} }
public enum BookSearchParam public enum BookSearchParam
@ -72,6 +74,7 @@ namespace Jackett.Common.Models
public bool MovieSearchTmdbAvailable => (MovieSearchParams.Contains(MovieSearchParam.TmdbId)); public bool MovieSearchTmdbAvailable => (MovieSearchParams.Contains(MovieSearchParam.TmdbId));
public bool MovieSearchTraktAvailable => (MovieSearchParams.Contains(MovieSearchParam.TraktId)); public bool MovieSearchTraktAvailable => (MovieSearchParams.Contains(MovieSearchParam.TraktId));
public bool MovieSearchDoubanAvailable => (MovieSearchParams.Contains(MovieSearchParam.DoubanId)); public bool MovieSearchDoubanAvailable => (MovieSearchParams.Contains(MovieSearchParam.DoubanId));
public bool MovieSearchGenreAvailable => (MovieSearchParams.Contains(MovieSearchParam.Genre));
public List<MusicSearchParam> MusicSearchParams; public List<MusicSearchParam> MusicSearchParams;
public bool MusicSearchAvailable => (MusicSearchParams.Count > 0); public bool MusicSearchAvailable => (MusicSearchParams.Count > 0);
@ -80,6 +83,7 @@ namespace Jackett.Common.Models
public bool MusicSearchLabelAvailable => (MusicSearchParams.Contains(MusicSearchParam.Label)); public bool MusicSearchLabelAvailable => (MusicSearchParams.Contains(MusicSearchParam.Label));
public bool MusicSearchTrackAvailable => (MusicSearchParams.Contains(MusicSearchParam.Track)); public bool MusicSearchTrackAvailable => (MusicSearchParams.Contains(MusicSearchParam.Track));
public bool MusicSearchYearAvailable => (MusicSearchParams.Contains(MusicSearchParam.Year)); public bool MusicSearchYearAvailable => (MusicSearchParams.Contains(MusicSearchParam.Year));
public bool MusicSearchGenreAvailable => (MusicSearchParams.Contains(MusicSearchParam.Genre));
public List<BookSearchParam> BookSearchParams; public List<BookSearchParam> BookSearchParams;
public bool BookSearchAvailable => (BookSearchParams.Count > 0); public bool BookSearchAvailable => (BookSearchParams.Count > 0);
@ -219,6 +223,8 @@ namespace Jackett.Common.Models
parameters.Add("traktid"); parameters.Add("traktid");
if (MovieSearchDoubanAvailable) if (MovieSearchDoubanAvailable)
parameters.Add("doubanid"); parameters.Add("doubanid");
if (MovieSearchGenreAvailable)
parameters.Add("genre");
return string.Join(",", parameters); return string.Join(",", parameters);
} }
@ -235,6 +241,8 @@ namespace Jackett.Common.Models
parameters.Add("track"); parameters.Add("track");
if (MusicSearchYearAvailable) if (MusicSearchYearAvailable)
parameters.Add("year"); parameters.Add("year");
if (MusicSearchGenreAvailable)
parameters.Add("genre");
return string.Join(",", parameters); return string.Join(",", parameters);
} }

View File

@ -33,7 +33,7 @@ namespace Jackett.Common.Models
public string Label { get; set; } public string Label { get; set; }
public string Track { get; set; } public string Track { get; set; }
public int? Year { get; set; } public int? Year { get; set; }
public ICollection<string> Genre { get; set; } public string Genre { get; set; }
public string Author { get; set; } public string Author { get; set; }
public string Title { get; set; } public string Title { get; set; }
@ -141,6 +141,7 @@ namespace Jackett.Common.Models
Artist = Artist, Artist = Artist,
Label = Label, Label = Label,
Track = Track, Track = Track,
Genre = Genre,
Year = Year, Year = Year,
Author = Author, Author = Author,
Title = Title, Title = Title,