extend resolutions (#1036)

* extend resolutions
 - Simplifies logic
 - Adds more options including 540p, 1440p, and resolutions common to VR such as 1920p
 - Supports vertical/portrait videos and images
* implement new resolution filters
This commit is contained in:
SpedNSFW
2021-01-07 16:10:59 +11:00
committed by GitHub
parent 1882b44951
commit 03a9d65cfe
11 changed files with 220 additions and 29 deletions

View File

@@ -12,11 +12,19 @@ input FindFilterType {
} }
enum ResolutionEnum { enum ResolutionEnum {
"144p", VERY_LOW
"240p", LOW "240p", LOW
"360p", R360P
"480p", STANDARD "480p", STANDARD
"540p", WEB_HD
"720p", STANDARD_HD "720p", STANDARD_HD
"1080p", FULL_HD "1080p", FULL_HD
"1440p", QUAD_HD
"1920p", VR_HD
"4k", FOUR_K "4k", FOUR_K
"5k", FIVE_K
"6k", SIX_K
"8k", EIGHT_K
} }
input PerformerFilterType { input PerformerFilterType {

View File

@@ -313,30 +313,54 @@ func (qb *GalleryQueryBuilder) handleAverageResolutionFilter(query *queryBuilder
var high int var high int
switch resolution { switch resolution {
case "VERY_LOW":
high = 240
case "LOW": case "LOW":
low = 240
high = 360
case "R360P":
low = 360
high = 480 high = 480
case "STANDARD": case "STANDARD":
low = 480 low = 480
high = 540
case "WEB_HD":
low = 540
high = 720 high = 720
case "STANDARD_HD": case "STANDARD_HD":
low = 720 low = 720
high = 1080 high = 1080
case "FULL_HD": case "FULL_HD":
low = 1080 low = 1080
high = 1440
case "QUAD_HD":
low = 1440
high = 1920
case "VR_HD":
low = 1920
high = 2160 high = 2160
case "FOUR_K": case "FOUR_K":
low = 2160 low = 2160
high = 2880
case "FIVE_K":
low = 2880
high = 3384
case "SIX_K":
low = 3384
high = 4320
case "EIGHT_K":
low = 4320
} }
havingClause := "" havingClause := ""
if low != 0 { if low != 0 {
havingClause = "avg(images.height) >= " + strconv.Itoa(low) havingClause = "avg(MIN(images.width, images.height)) >= " + strconv.Itoa(low)
} }
if high != 0 { if high != 0 {
if havingClause != "" { if havingClause != "" {
havingClause += " AND " havingClause += " AND "
} }
havingClause += "avg(images.height) < " + strconv.Itoa(high) havingClause += "avg(MIN(images.width, images.height)) < " + strconv.Itoa(high)
} }
if havingClause != "" { if havingClause != "" {

View File

@@ -322,16 +322,32 @@ func (qb *ImageQueryBuilder) Query(imageFilter *ImageFilterType, findFilter *Fin
if resolutionFilter := imageFilter.Resolution; resolutionFilter != nil { if resolutionFilter := imageFilter.Resolution; resolutionFilter != nil {
if resolution := resolutionFilter.String(); resolutionFilter.IsValid() { if resolution := resolutionFilter.String(); resolutionFilter.IsValid() {
switch resolution { switch resolution {
case "VERY_LOW":
query.addWhere("MIN(images.height, images.width) < 240")
case "LOW": case "LOW":
query.addWhere("images.height < 480") query.addWhere("(MIN(images.height, images.width) >= 240 AND MIN(images.height, images.width) < 360)")
case "R360P":
query.addWhere("(MIN(images.height, images.width) >= 360 AND MIN(images.height, images.width) < 480)")
case "STANDARD": case "STANDARD":
query.addWhere("(images.height >= 480 AND images.height < 720)") query.addWhere("(MIN(images.height, images.width) >= 480 AND MIN(images.height, images.width) < 540)")
case "WEB_HD":
query.addWhere("(MIN(images.height, images.width) >= 540 AND MIN(images.height, images.width) < 720)")
case "STANDARD_HD": case "STANDARD_HD":
query.addWhere("(images.height >= 720 AND images.height < 1080)") query.addWhere("(MIN(images.height, images.width) >= 720 AND MIN(images.height, images.width) < 1080)")
case "FULL_HD": case "FULL_HD":
query.addWhere("(images.height >= 1080 AND images.height < 2160)") query.addWhere("(MIN(images.height, images.width) >= 1080 AND MIN(images.height, images.width) < 1440)")
case "QUAD_HD":
query.addWhere("(MIN(images.height, images.width) >= 1440 AND MIN(images.height, images.width) < 1920)")
case "VR_HD":
query.addWhere("(MIN(images.height, images.width) >= 1920 AND MIN(images.height, images.width) < 2160)")
case "FOUR_K": case "FOUR_K":
query.addWhere("images.height >= 2160") query.addWhere("(MIN(images.height, images.width) >= 2160 AND MIN(images.height, images.width) < 2880)")
case "FIVE_K":
query.addWhere("(MIN(images.height, images.width) >= 2880 AND MIN(images.height, images.width) < 3384)")
case "SIX_K":
query.addWhere("(MIN(images.height, images.width) >= 3384 AND MIN(images.height, images.width) < 4320)")
case "EIGHT_K":
query.addWhere("(MIN(images.height, images.width) >= 4320")
} }
} }
} }

View File

@@ -344,16 +344,32 @@ func (qb *SceneQueryBuilder) Query(sceneFilter *SceneFilterType, findFilter *Fin
if resolutionFilter := sceneFilter.Resolution; resolutionFilter != nil { if resolutionFilter := sceneFilter.Resolution; resolutionFilter != nil {
if resolution := resolutionFilter.String(); resolutionFilter.IsValid() { if resolution := resolutionFilter.String(); resolutionFilter.IsValid() {
switch resolution { switch resolution {
case "VERY_LOW":
query.addWhere("MIN(scenes.height, scenes.width) < 240")
case "LOW": case "LOW":
query.addWhere("scenes.height < 480") query.addWhere("(MIN(scenes.height, scenes.width) >= 240 AND MIN(scenes.height, scenes.width) < 360)")
case "R360P":
query.addWhere("(MIN(scenes.height, scenes.width) >= 360 AND MIN(scenes.height, scenes.width) < 480)")
case "STANDARD": case "STANDARD":
query.addWhere("(scenes.height >= 480 AND scenes.height < 720)") query.addWhere("(MIN(scenes.height, scenes.width) >= 480 AND MIN(scenes.height, scenes.width) < 540)")
case "WEB_HD":
query.addWhere("(MIN(scenes.height, scenes.width) >= 540 AND MIN(scenes.height, scenes.width) < 720)")
case "STANDARD_HD": case "STANDARD_HD":
query.addWhere("(scenes.height >= 720 AND scenes.height < 1080)") query.addWhere("(MIN(scenes.height, scenes.width) >= 720 AND MIN(scenes.height, scenes.width) < 1080)")
case "FULL_HD": case "FULL_HD":
query.addWhere("(scenes.height >= 1080 AND scenes.height < 2160)") query.addWhere("(MIN(scenes.height, scenes.width) >= 1080 AND MIN(scenes.height, scenes.width) < 1440)")
case "QUAD_HD":
query.addWhere("(MIN(scenes.height, scenes.width) >= 1440 AND MIN(scenes.height, scenes.width) < 1920)")
case "VR_HD":
query.addWhere("(MIN(scenes.height, scenes.width) >= 1920 AND MIN(scenes.height, scenes.width) < 2160)")
case "FOUR_K": case "FOUR_K":
query.addWhere("scenes.height >= 2160") query.addWhere("(MIN(scenes.height, scenes.width) >= 2160 AND MIN(scenes.height, scenes.width) < 2880)")
case "FIVE_K":
query.addWhere("(MIN(scenes.height, scenes.width) >= 2880 AND MIN(scenes.height, scenes.width) < 3384)")
case "SIX_K":
query.addWhere("(MIN(scenes.height, scenes.width) >= 3384 AND MIN(scenes.height, scenes.width) < 4320)")
case "EIGHT_K":
query.addWhere("(MIN(scenes.height, scenes.width) >= 4320")
} }
} }
} }

View File

@@ -6,6 +6,7 @@
* Allow configuration of visible navbar items. * Allow configuration of visible navbar items.
### 🎨 Improvements ### 🎨 Improvements
* Add more video/image resolution tags.
* Add option to strip file extension from scene title when populating from scanning task. * Add option to strip file extension from scene title when populating from scanning task.
* Pagination support and general improvements for image lightbox. * Pagination support and general improvements for image lightbox.
* Add mouse click support for CDP scrapers. * Add mouse click support for CDP scrapers.
@@ -19,6 +20,7 @@
* Support configurable number of threads for scanning and generation. * Support configurable number of threads for scanning and generation.
### 🐛 Bug fixes ### 🐛 Bug fixes
* Fixed resolution tags and querying for portrait videos and images.
* Corrected file sizes on 32bit platforms * Corrected file sizes on 32bit platforms
* Fixed login redirect to remember the current page. * Fixed login redirect to remember the current page.
* Fixed scene tagger config saving * Fixed scene tagger config saving

View File

@@ -78,8 +78,14 @@ export const ImageDetailPanel: React.FC<IImageDetailProps> = (props) => {
"" ""
)} )}
{renderGalleries()} {renderGalleries()}
{props.image.file.height ? ( {props.image.file.width && props.image.file.height ? (
<h6>Resolution: {TextUtils.resolution(props.image.file.height)}</h6> <h6>
Resolution:{" "}
{TextUtils.resolution(
props.image.file.width,
props.image.file.height
)}
</h6>
) : ( ) : (
"" ""
)} )}

View File

@@ -102,10 +102,13 @@ export const SceneCard: React.FC<ISceneCardProps> = (
function maybeRenderSceneSpecsOverlay() { function maybeRenderSceneSpecsOverlay() {
return ( return (
<div className="scene-specs-overlay"> <div className="scene-specs-overlay">
{props.scene.file.height ? ( {props.scene.file.width && props.scene.file.height ? (
<span className="overlay-resolution"> <span className="overlay-resolution">
{" "} {" "}
{TextUtils.resolution(props.scene.file.height)} {TextUtils.resolution(
props.scene.file.width,
props.scene.file.height
)}
</span> </span>
) : ( ) : (
"" ""

View File

@@ -88,8 +88,14 @@ export const SceneDetailPanel: React.FC<ISceneDetailProps> = (props) => {
) : ( ) : (
"" ""
)} )}
{props.scene.file.height && ( {props.scene.file.width && props.scene.file.height && (
<h6>Resolution: {TextUtils.resolution(props.scene.file.height)}</h6> <h6>
Resolution:{" "}
{TextUtils.resolution(
props.scene.file.width,
props.scene.file.height
)}
</h6>
)} )}
</div> </div>
{props.scene.studio && ( {props.scene.studio && (

View File

@@ -6,7 +6,20 @@ export class ResolutionCriterion extends Criterion {
public parameterName: string = "resolution"; public parameterName: string = "resolution";
public modifier = CriterionModifier.Equals; public modifier = CriterionModifier.Equals;
public modifierOptions = []; public modifierOptions = [];
public options: string[] = ["240p", "480p", "720p", "1080p", "4k"]; public options: string[] = [
"144p",
"240p",
"360p",
"480p",
"540p",
"720p",
"1080p",
"1440p",
"4k",
"5k",
"6k",
"8k",
];
public value: string = ""; public value: string = "";
} }

View File

@@ -462,21 +462,45 @@ export class ListFilterModel {
} }
case "resolution": { case "resolution": {
switch ((criterion as ResolutionCriterion).value) { switch ((criterion as ResolutionCriterion).value) {
case "144p":
result.resolution = ResolutionEnum.VeryLow;
break;
case "240p": case "240p":
result.resolution = ResolutionEnum.Low; result.resolution = ResolutionEnum.Low;
break; break;
case "360p":
result.resolution = ResolutionEnum.R360P;
break;
case "480p": case "480p":
result.resolution = ResolutionEnum.Standard; result.resolution = ResolutionEnum.Standard;
break; break;
case "540p":
result.resolution = ResolutionEnum.WebHd;
break;
case "720p": case "720p":
result.resolution = ResolutionEnum.StandardHd; result.resolution = ResolutionEnum.StandardHd;
break; break;
case "1080p": case "1080p":
result.resolution = ResolutionEnum.FullHd; result.resolution = ResolutionEnum.FullHd;
break; break;
case "1440p":
result.resolution = ResolutionEnum.QuadHd;
break;
case "1920p":
result.resolution = ResolutionEnum.VrHd;
break;
case "4k": case "4k":
result.resolution = ResolutionEnum.FourK; result.resolution = ResolutionEnum.FourK;
break; break;
case "5k":
result.resolution = ResolutionEnum.FiveK;
break;
case "6k":
result.resolution = ResolutionEnum.SixK;
break;
case "8k":
result.resolution = ResolutionEnum.EightK;
break;
// no default // no default
} }
break; break;
@@ -700,21 +724,45 @@ export class ListFilterModel {
} }
case "resolution": { case "resolution": {
switch ((criterion as ResolutionCriterion).value) { switch ((criterion as ResolutionCriterion).value) {
case "144p":
result.resolution = ResolutionEnum.VeryLow;
break;
case "240p": case "240p":
result.resolution = ResolutionEnum.Low; result.resolution = ResolutionEnum.Low;
break; break;
case "360p":
result.resolution = ResolutionEnum.R360P;
break;
case "480p": case "480p":
result.resolution = ResolutionEnum.Standard; result.resolution = ResolutionEnum.Standard;
break; break;
case "540p":
result.resolution = ResolutionEnum.WebHd;
break;
case "720p": case "720p":
result.resolution = ResolutionEnum.StandardHd; result.resolution = ResolutionEnum.StandardHd;
break; break;
case "1080p": case "1080p":
result.resolution = ResolutionEnum.FullHd; result.resolution = ResolutionEnum.FullHd;
break; break;
case "1440p":
result.resolution = ResolutionEnum.QuadHd;
break;
case "1920p":
result.resolution = ResolutionEnum.VrHd;
break;
case "4k": case "4k":
result.resolution = ResolutionEnum.FourK; result.resolution = ResolutionEnum.FourK;
break; break;
case "5k":
result.resolution = ResolutionEnum.FiveK;
break;
case "6k":
result.resolution = ResolutionEnum.SixK;
break;
case "8k":
result.resolution = ResolutionEnum.EightK;
break;
// no default // no default
} }
break; break;
@@ -827,21 +875,45 @@ export class ListFilterModel {
} }
case "average_resolution": { case "average_resolution": {
switch ((criterion as AverageResolutionCriterion).value) { switch ((criterion as AverageResolutionCriterion).value) {
case "144p":
result.average_resolution = ResolutionEnum.VeryLow;
break;
case "240p": case "240p":
result.average_resolution = ResolutionEnum.Low; result.average_resolution = ResolutionEnum.Low;
break; break;
case "360p":
result.average_resolution = ResolutionEnum.R360P;
break;
case "480p": case "480p":
result.average_resolution = ResolutionEnum.Standard; result.average_resolution = ResolutionEnum.Standard;
break; break;
case "540p":
result.average_resolution = ResolutionEnum.WebHd;
break;
case "720p": case "720p":
result.average_resolution = ResolutionEnum.StandardHd; result.average_resolution = ResolutionEnum.StandardHd;
break; break;
case "1080p": case "1080p":
result.average_resolution = ResolutionEnum.FullHd; result.average_resolution = ResolutionEnum.FullHd;
break; break;
case "1440p":
result.average_resolution = ResolutionEnum.QuadHd;
break;
case "1920p":
result.average_resolution = ResolutionEnum.VrHd;
break;
case "4k": case "4k":
result.average_resolution = ResolutionEnum.FourK; result.average_resolution = ResolutionEnum.FourK;
break; break;
case "5k":
result.average_resolution = ResolutionEnum.FiveK;
break;
case "6k":
result.average_resolution = ResolutionEnum.SixK;
break;
case "8k":
result.average_resolution = ResolutionEnum.EightK;
break;
// no default // no default
} }
break; break;

View File

@@ -82,21 +82,46 @@ const bitRate = (bitrate: number) => {
return `${megabits.toFixed(2)} megabits per second`; return `${megabits.toFixed(2)} megabits per second`;
}; };
const resolution = (height: number) => { const resolution = (width: number, height: number) => {
if (height >= 240 && height < 480) { const number = width > height ? height : width;
return "240p"; if (number >= 4320) {
return "8K";
} }
if (height >= 480 && height < 720) { if (number >= 3384) {
return "480p"; return "6K";
} }
if (height >= 720 && height < 1080) { if (number >= 2880) {
return "720p"; return "5K";
} }
if (height >= 1080 && height < 2160) { if (number >= 2160) {
return "4K";
}
if (number >= 1920) {
return "1920p";
}
if (number >= 1440) {
return "1440p";
}
if (number >= 1080) {
return "1080p"; return "1080p";
} }
if (height >= 2160) { if (number >= 720) {
return "4K"; return "720p";
}
if (number >= 540) {
return "540p";
}
if (number >= 480) {
return "480p";
}
if (number >= 360) {
return "360p";
}
if (number >= 240) {
return "240p";
}
if (number >= 144) {
return "144p";
} }
}; };