Skip to content

Commit

Permalink
Refactor data fields with enum
Browse files Browse the repository at this point in the history
  • Loading branch information
timo95 committed Mar 17, 2024
1 parent 08b6075 commit 4933fea
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 56 deletions.
50 changes: 23 additions & 27 deletions src/check.ts
Original file line number Diff line number Diff line change
@@ -1,44 +1,40 @@
import {prefixSymbol} from "./tooltip/tooltip";
import {stashEndpoints} from "./settings/endpoints";
import {firstText} from "./utils";
import {CheckOptions, StashEndpoint, Target, Type} from "./dataTypes";
import {CheckOptions, DataField, StashEndpoint, Target, Type} from "./dataTypes";
import {request} from "./request";
import {booleanOptions, OptionKey} from "./settings/general";

export enum DataFields {
id = "id",
code = "code",
name = "name",
disambiguation = "disambiguation",
aliasList = "alias_list",
title = "title",
studio = "studio{name}",
favorite = "favorite",
date = "date",
birthdate = "birthdate",
height = "height_cm",
tags = "tags{id,name}",
files = "files{path,duration,video_codec,width,height,size,bit_rate}"
}
const supportedDataFields = new Map<Target, DataField[]>([
[Target.Scene, [DataField.Id, DataField.Title, DataField.Studio, DataField.Code, DataField.Date, DataField.Tags, DataField.Files]],
[Target.Performer, [DataField.Id, DataField.Name, DataField.Disambiguation, DataField.Favorite, DataField.AliasList, DataField.Birthdate, DataField.HeightCm, DataField.Tags]],
[Target.Gallery, [DataField.Id, DataField.Title, DataField.Date, DataField.Tags, DataField.Files]],
[Target.Movie, [DataField.Id, DataField.Name, DataField.Date]],
[Target.Studio,[DataField.Id, DataField.Name]],
[Target.Tag, [DataField.Id, DataField.Name]],
]);

let supportedDataFields = new Map<Target, DataFields[]>([
[Target.Scene, [DataFields.id, DataFields.title, DataFields.code, DataFields.studio, DataFields.date, DataFields.tags, DataFields.files]],
[Target.Performer, [DataFields.id, DataFields.name, DataFields.disambiguation, DataFields.aliasList, DataFields.favorite, DataFields.birthdate, DataFields.height, DataFields.tags]],
[Target.Gallery, [DataFields.id, DataFields.title, DataFields.date, DataFields.tags, DataFields.files]],
[Target.Movie, [DataFields.id, DataFields.name, DataFields.date]],
[Target.Studio,[DataFields.id, DataFields.name]],
[Target.Tag, [DataFields.id, DataFields.name]],
const supportedSubDataFields = new Map<DataField, DataField[]>([
[DataField.Studio, [DataField.Name]],
[DataField.Tags, [DataField.Id, DataField.Name]],
[DataField.Files, [DataField.Path, DataField.VideoCodec, DataField.Width, DataField.Height, DataField.Size, DataField.BitRate, DataField.Duration]],
]);

function getDataFields(target: Target): string {
let supported = new Set(supportedDataFields.get(target)!)
let supported = new Set(supportedDataFields.get(target) ?? [])
if (!booleanOptions.get(OptionKey.showTags)) {
supported.delete(DataFields.tags)
supported.delete(DataField.Tags)
}
if (!booleanOptions.get(OptionKey.showFiles)) {
supported.delete(DataFields.files)
supported.delete(DataField.Files)
}
return new Array(...supported).join(",")
return Array.from(supported).map(field => field + getSubDataFields(field)).join(",")
}

function getSubDataFields(field: DataField): string {
let supported = supportedSubDataFields.get(field) ?? []
let string = supported.join(",")
return string === "" ? "" : `{${string}}`
}

async function queryStash(
Expand Down
26 changes: 26 additions & 0 deletions src/dataTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,32 @@ export interface GraphQlQuery {
reject?: (message?: string) => void
}

/**
* Possible fields of the returned data object
*/
export enum DataField {
Id = "id",
Code = "code",
Name = "name",
Disambiguation = "disambiguation",
AliasList = "alias_list",
Title = "title",
Studio = "studio",
Favorite = "favorite",
Date = "date",
Birthdate = "birthdate",
HeightCm = "height_cm",
Tags = "tags",
Files = "files",
Path = "path",
Duration = "duration",
VideoCodec = "video_codec",
Width = "width",
Height = "height",
Size = "size",
BitRate = "bit_rate",
}

/**
* Entry types in Stash
*/
Expand Down
58 changes: 29 additions & 29 deletions src/tooltip/tooltip.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import {StashEndpoint, StashEntry, Target, Type} from "../dataTypes";
import {DataField, StashEndpoint, StashEntry, Target, Type} from "../dataTypes";
import {bytesToReadable, firstTextChild, secondsToReadable, typeToString} from "../utils";
import {booleanOptions, OptionKey, stringOptions} from "../settings/general";
import {StashQuery, StashQueryClass} from "./stashQuery";
import {mouseoutListener, mouseoverListener} from "./tooltipElement";
import {DataFields} from "../check";

/**
* find existing symbol span recursively, undefined if none available
Expand All @@ -22,13 +21,13 @@ function getExistingSymbol(element: Element): HTMLSpanElement | undefined {

function formatFileData(files: any[]): string {
let propertyStrings: [string, (v: any) => string][] = [
["path", (path: any) => `Path: ${path}`],
["video_codec", (video_codec: any) => `<br>Codec: ${video_codec}`],
["width", (width: any) => ` (${width}`],
["height", (height: any) => `x${height})`],
["size", (size: any) => `&nbsp;&nbsp;&nbsp;&nbsp;Size: ${bytesToReadable(size)}`],
["bit_rate", (bit_rate: any) => `&nbsp;&nbsp;&nbsp;&nbsp;Bitrate: ${(bit_rate / 1000000).toFixed(2)}Mbit/s`],
["duration", (duration: any) => `&nbsp;&nbsp;&nbsp;&nbsp;Duration: ${secondsToReadable(duration)}`],
[DataField.Path, (path: any) => `Path: ${path}`],
[DataField.VideoCodec, (video_codec: any) => `<br>Codec: ${video_codec}`],
[DataField.Width, (width: any) => ` (${width}`],
[DataField.Height, (height: any) => `x${height})`],
[DataField.Size, (size: any) => `&nbsp;&nbsp;&nbsp;&nbsp;Size: ${bytesToReadable(size)}`],
[DataField.BitRate, (bit_rate: any) => `&nbsp;&nbsp;&nbsp;&nbsp;Bitrate: ${(bit_rate / 1000000).toFixed(2)}Mbit/s`],
[DataField.Duration, (duration: any) => `&nbsp;&nbsp;&nbsp;&nbsp;Duration: ${secondsToReadable(duration)}`],
];
return files.map((file: any) => "<div class='stashChecker file'>" + propertyStrings
.filter(e => file[e[0]])
Expand All @@ -45,27 +44,28 @@ function formatQueries(queries: StashQuery[], target: Target, id: string, numQue
return queries.map(query => new StashQueryClass(query).toHtml(target, id, numQueries)).join("<br>");
}

const propertyStrings: Map<string, (datum: any, queries: StashQuery[], target: Target, numQueries: number) => string> = new Map([
[DataField.Id, (id: any, queries: StashQuery[], target: Target, numQueries: number) => `<br>${formatQueries(queries, target, id, numQueries)}`],
[DataField.Title, (title: any) => `<br>Title: ${title}`],
[DataField.Name, (name: any) => `<br>Name: ${name}`],
[DataField.Favorite, () => "&emsp;&#10084;&#65039;"],
[DataField.Disambiguation, (disambiguation: any) => ` <span style="color: grey">(${disambiguation})</span>`],
[DataField.AliasList, (alias_list: any) => alias_list.length === 0 ? "" : `<br>Aliases: ${alias_list.join(", <wbr>")}`],
[DataField.Studio, (studio: any) => `<br>Studio: ${studio.name}`],
[DataField.Code, (code: any) => `<br>Code: ${code}`],
[DataField.Date, (date: any) => `<br>Date: ${date}`],
[DataField.Birthdate, (birthdate: any) => `<br>Birthdate: ${birthdate}`],
[DataField.HeightCm, (height: any) => `<br>Height: ${height} cm`],
[DataField.Tags, (tags: any) => tags.length === 0 ? "" : `<br>Tags: ${tags.map(formatTagPill).join("<wbr>")}`],
[DataField.Files, (files: any) => `${formatFileData(files)}`],
]);

function formatEntryData(target: Target, data: StashEntry[], numQueries: number): string {
let propertyStrings: [string, (v: any, queries: StashQuery[]) => string][] = [
[DataFields.id, (id: any, queries: StashQuery[]) => `<br>${formatQueries(queries, target, id, numQueries)}`],
[DataFields.title, (title: any) => `<br>Title: ${title}`],
[DataFields.name, (name: any) => `<br>Name: ${name}`],
[DataFields.favorite, () => "&emsp;&#10084;&#65039;"],
[DataFields.disambiguation, (disambiguation: any) => ` <span style="color: grey">(${disambiguation})</span>`],
[DataFields.aliasList, (alias_list: any) => alias_list.length === 0 ? "" : `<br>Aliases: ${alias_list.join(", <wbr>")}`],
[DataFields.studio, (studio: any) => `<br>Studio: ${studio.name}`],
[DataFields.code, (code: any) => `<br>Code: ${code}`],
[DataFields.date, (date: any) => `<br>Date: ${date}`],
[DataFields.birthdate, (birthdate: any) => `<br>Birthdate: ${birthdate}`],
[DataFields.height, (height: any) => `<br>Height: ${height} cm`],
[DataFields.tags, (tags: any) => tags.length === 0 ? "" : `<br>Tags: ${tags.map(formatTagPill).join("<wbr>")}`],
[DataFields.files, (files: any) => `${formatFileData(files)}`],
];
return data.map((entry: any) => "<hr>" + propertyStrings
.filter((e) => entry[e[0]])
.map((e) => e[1](entry[e[0]], entry.queries))
.join("")
).join("");
return data.map((entry: StashEntry) => "<hr>" + Object.entries(entry)
.map(([key, value]: [string, any]) => value ? propertyStrings.get(key)?.(value, entry.queries, target, numQueries) : undefined)
.filter(s => s)
.join(""))
.join("");
}

/**
Expand Down

0 comments on commit 4933fea

Please sign in to comment.