mirror of
https://github.com/claunia/marechai.git
synced 2026-07-08 17:57:08 +00:00
Adds a new console project that maps IGDB's catalog (platforms, game
types, companies, games, involved companies) to existing local
Company/Software/SoftwarePlatform records, without any enrichment or
record creation. This establishes the cross-reference table a future
IGDB enrichment phase will consume, the same way Marechai.MobyGames
already does for MobyGames.
Database (Marechai.Database):
- New mirror+mapping tables: IgdbPlatform, IgdbGameType, IgdbCompany,
IgdbGame, IgdbInvolvedCompany. Each stores only the IGDB id, name,
and the few relationship fields needed for matching/disambiguation
(no descriptive fields) plus a nullable FK to the local entity and
an IgdbMatchStatus (Pending/Matched/NoMatch/NeedsReview/Skipped/
Error). No columns were added to Company/Software/SoftwarePlatform,
consistent with the existing per-source mapping convention used by
MobyGamesImportState/WwpcSoftware/OldDosSoftware.
- IgdbGame.GameTypeId is a nullable FK into the new IgdbGameType
lookup table rather than a baked-in enum: IGDB's game_type is
itself a dynamic lookup entity (game.category is deprecated in
favor of it).
- An initial design mirrored IGDB's external_games/external_game_
sources to bridge straight into the existing MobyGames->Software
mapping. Verified directly against the live API that IGDB does not
track MobyGames as an external source at all, so that table/service
and the matcher's bridge step were removed again (see the two
paired migrations).
- Migrations: AddIgdbMirrorAndMappingTables, RemoveIgdbExternalGames.
Shared helpers promoted to Marechai.Data/Helpers (pure, no EF Core
dependency, usable from a console exe without pulling in the Blazor
Marechai project or duplicating logic):
- Marechai/Helpers/JaroWinkler.cs -> Marechai.Data/Helpers/JaroWinkler.cs
- Marechai.MobyGames/Services/SoundexHelper.cs -> Marechai.Data/Helpers/SoundexHelper.cs
All consumers (Marechai's Razor pages, Marechai.MobyGames's matchers)
updated to the new namespace.
Marechai.Igdb console project:
- IgdbAuthService: Twitch OAuth2 client-credentials flow with a
cached, auto-refreshed access token.
- IgdbHttpClient: Apicalypse requests rate-limited to the configured
requests/second with bounded concurrency and retry-with-backoff on
HTTP 429.
- ApicalypseQueryBuilder: small fluent query builder.
- Mirror services (platforms, game types, companies, games, involved
companies): each run mirrors exactly one batch of up to
--batch-size rows (clamped to IGDB's 500-row page limit) and stops,
matching the one-batch-per-invocation convention already used by
Marechai.MobyGames's import command. Pass --batch-size 0 to instead
loop until the whole remaining catalog is mirrored in one
invocation. Resumption is fully automatic: each run re-derives its
own cursor from the database (MAX(IgdbId) already mirrored, or
row count for the small offset-paginated lookups) - no manual
bookkeeping - and the --batch-size 0 loop tracks its cursor in
memory so --dry-run never gets stuck reading the same unchanged
page forever.
- PlatformMatcher: exact -> normalized -> substring -> Jaro-Winkler
matching against SoftwarePlatform. Local platform names follow
MobyGames-style short/compound conventions ("Jaguar", "DOS, Windows
and Windows 3.x") while IGDB uses one full canonical name per
platform, so each local platform is expanded into name variants
(the compound parts) before matching, plus a whole-word substring
pass to bridge short-vs-full names ("Jaguar" <-> "Atari Jaguar").
- CompanyMatcher: exact name -> exact legal name -> suffix-stripped
exact (ported from Marechai.MobyGames's CompanyMatcher) -> Soundex
bucket confirmed by Jaro-Winkler -> full Jaro-Winkler sweep. Unlike
the MobyGames matcher, ambiguity never prompts or auto-creates: it
is recorded as NeedsReview (with candidates) or NoMatch, since this
pass only establishes mapping and is meant to run unattended across
the full catalog. Soundex-bucket candidates are filtered to a 0.90
Jaro-Winkler floor before being considered at all - an early version
without this floor surfaced 29,906 NeedsReview rows out of 71,210
mirrored companies because a shared 4-character Soundex code alone
is weak evidence and collides constantly between unrelated short
names; with the floor and tightened accept thresholds the same
catalog produces 2,602 matched / 139 needs-review / 68,469 no-match.
- GameMatcher: maps IGDB games to local Software (the umbrella title;
per-platform SoftwareRelease mapping is left for a future enrichment
phase). Edition/bundle/remaster/port-type games inherit their
parent's SoftwareId directly instead of being matched or created
independently, reflecting that Marechai models these as
SoftwareRelease rows under one Software while IGDB models them as
separate game rows linked via parent_game/version_parent. Exact name
matches are disambiguated by platform overlap; fuzzy matches require
platform corroboration when the candidate already has releases.
Verified on a 1,000-game sample that this correctly avoids merging
sequels into their base title (Quake/Quake II, DOOM II/Doom 3,
Metal Gear/Metal Gear Solid V, etc. all left as NeedsReview rather
than falsely matched).
- MatchStatsService / AmbiguousReviewService: stats command and an
optional, non-blocking interactive triage command for NeedsReview
rows.
- CLI: mirror-platforms, mirror-game-types, mirror-companies,
mirror-games, mirror-involved-companies, match-platforms,
match-companies, match-games, stats, review-ambiguous, reset.
All mirror/match commands support --dry-run.
.gitignore: added Marechai.Igdb/state/ (OAuth token cache), mirroring
the existing Marechai.MobyGames/state/ entry.
1386 lines
47 KiB
C#
1386 lines
47 KiB
C#
/******************************************************************************
|
|
// MARECHAI: Master repository of computing history artifacts information
|
|
// ----------------------------------------------------------------------------
|
|
//
|
|
// Author(s) : Natalia Portillo <claunia@claunia.com>
|
|
//
|
|
// --[ License ] --------------------------------------------------------------
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as
|
|
// published by the Free Software Foundation, either version 3 of the
|
|
// License, or (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
//
|
|
// ----------------------------------------------------------------------------
|
|
// Copyright © 2003-2026 Natalia Portillo
|
|
*******************************************************************************/
|
|
|
|
using System.ComponentModel;
|
|
using System.ComponentModel.DataAnnotations;
|
|
|
|
// ReSharper disable UnusedMember.Global
|
|
// ReSharper disable InconsistentNaming
|
|
|
|
namespace Marechai.Data;
|
|
|
|
public enum NewsType
|
|
{
|
|
NewComputerInDb = 1,
|
|
NewConsoleInDb = 2,
|
|
NewComputerInCollection = 3,
|
|
NewConsoleInCollection = 4,
|
|
UpdatedComputerInDb = 5,
|
|
UpdatedConsoleInDb = 6,
|
|
UpdatedComputerInCollection = 7,
|
|
UpdatedConsoleInCollection = 8,
|
|
NewMoneyDonation = 9,
|
|
NewBookInDb = 10,
|
|
UpdatedBookInDb = 11,
|
|
NewDocumentInDb = 12,
|
|
UpdatedDocumentInDb = 13,
|
|
NewMagazineInDb = 14,
|
|
UpdatedMagazineInDb = 15,
|
|
NewPersonInDb = 16,
|
|
UpdatedPersonInDb = 17,
|
|
NewSoftwareInDb = 18,
|
|
UpdatedSoftwareInDb = 19,
|
|
NewSoftwareVersionInDb = 20,
|
|
UpdatedSoftwareVersionInDb = 21,
|
|
NewSoftwareReleaseInDb = 22,
|
|
UpdatedSoftwareReleaseInDb = 23,
|
|
NewGpuInDb = 24,
|
|
UpdatedGpuInDb = 25,
|
|
NewSoundSynthInDb = 26,
|
|
UpdatedSoundSynthInDb = 27,
|
|
NewProcessorInDb = 28,
|
|
UpdatedProcessorInDb = 29,
|
|
NewSmartphoneInDb = 30,
|
|
UpdatedSmartphoneInDb = 31,
|
|
NewSmartphoneInCollection = 32,
|
|
UpdatedSmartphoneInCollection = 33,
|
|
NewMagazineIssueInDb = 34,
|
|
UpdatedMagazineIssueInDb = 35
|
|
}
|
|
|
|
public enum StatusType
|
|
{
|
|
[Display(Name = "Unknown")]
|
|
Unknown = 0,
|
|
[Display(Name = "Tested good")]
|
|
TestedGood = 1,
|
|
[Display(Name = "Not tested")]
|
|
NotTested = 2,
|
|
[Display(Name = "Tested bad")]
|
|
TestedBad = 3
|
|
}
|
|
|
|
public enum CompanyStatus
|
|
{
|
|
/// <summary>Status is unknown or not set</summary>
|
|
Unknown = 0,
|
|
/// <summary>Company is still existing</summary>
|
|
Active = 1,
|
|
/// <summary>Company was sold, totally or partially</summary>
|
|
Sold = 2,
|
|
/// <summary>Company merged with another company to make yet another company</summary>
|
|
Merged = 3,
|
|
/// <summary>Company filled for bankruptcy</summary>
|
|
Bankrupt = 4,
|
|
/// <summary>Company ceased operations for reasons different to bankruptcy</summary>
|
|
Defunct = 5,
|
|
/// <summary>Company renamed possibly with a change of intentions</summary>
|
|
Renamed = 6
|
|
}
|
|
|
|
public enum MachineType
|
|
{
|
|
/// <summary>Unknown machine type, should not happen</summary>
|
|
Unknown = 0,
|
|
/// <summary>Computer</summary>
|
|
Computer = 1,
|
|
/// <summary>Videogame console</summary>
|
|
Console = 2,
|
|
/// <summary>Smartphone</summary>
|
|
Smartphone = 3,
|
|
/// <summary>Personal digital assistant.</summary>
|
|
[Description("PDA")]
|
|
Pda = 4,
|
|
/// <summary>Tablet computer</summary>
|
|
Tablet = 5
|
|
}
|
|
|
|
public enum SoftwareKind
|
|
{
|
|
/// <summary>Generic software</summary>
|
|
[Description("Generic software")]
|
|
Software = 0,
|
|
/// <summary>Operating system</summary>
|
|
[Description("Operating system")]
|
|
OperatingSystem = 1,
|
|
/// <summary>Videogame</summary>
|
|
[Description("Videogame")]
|
|
Game = 2,
|
|
/// <summary>DLC / Addon</summary>
|
|
[Description("DLC / Addon")]
|
|
Dlc = 3,
|
|
/// <summary>System software (drivers, system utilities, shells)</summary>
|
|
[Description("System software")]
|
|
SystemSoftware = 4,
|
|
/// <summary>End-user application (productivity, multimedia, etc.)</summary>
|
|
[Description("Application")]
|
|
Application = 5,
|
|
/// <summary>Development software (compilers, IDEs, SDKs)</summary>
|
|
[Description("Development software")]
|
|
DevelopmentSoftware = 6,
|
|
/// <summary>Server software (web/database/file/mail servers)</summary>
|
|
[Description("Server software")]
|
|
ServerSoftware = 7,
|
|
/// <summary>Middleware (frameworks, runtimes, integration layers)</summary>
|
|
[Description("Middleware")]
|
|
Middleware = 8,
|
|
/// <summary>Firmware (low-level device-resident software)</summary>
|
|
[Description("Firmware")]
|
|
Firmware = 9,
|
|
/// <summary>Embedded software (device-specific application software)</summary>
|
|
[Description("Embedded software")]
|
|
EmbeddedSoftware = 10
|
|
}
|
|
|
|
/// <summary>
|
|
/// Classifies why a Software row appears on the /admin/software/orphan-addons page.
|
|
/// Set on <see cref="Marechai.Data.Dtos.SoftwareAddonDto"/> by the controller projection.
|
|
/// </summary>
|
|
public enum AddonOrphanReason : byte
|
|
{
|
|
/// <summary>DLC is correctly linked — appears only when the page is showing all add-ons (not just orphans).</summary>
|
|
[Description("Linked")]
|
|
Linked = 0,
|
|
/// <summary>DLC has no base software set.</summary>
|
|
[Description("No base")]
|
|
NoBase = 1,
|
|
/// <summary>DLC's BaseSoftwareId points to itself.</summary>
|
|
[Description("Self reference")]
|
|
SelfReference = 2,
|
|
/// <summary>DLC's BaseSoftwareId points to a row that no longer exists.</summary>
|
|
[Description("Dangling base")]
|
|
DanglingFk = 3,
|
|
/// <summary>DLC's base software is itself a DLC (forbidden chain).</summary>
|
|
[Description("Chained DLC")]
|
|
ChainedDlc = 4,
|
|
/// <summary>DLC's normalized base software name doesn't match the DLC's own normalized name.</summary>
|
|
[Description("Name mismatch")]
|
|
NameMismatch = 5,
|
|
/// <summary>Row is classified as Kind=Game but carries a "DLC / add-on" genre — misclassified at import time.</summary>
|
|
[Description("Misclassified as Game")]
|
|
MisclassifiedAsGame = 6
|
|
}
|
|
|
|
public enum MemoryType
|
|
{
|
|
/// <summary>Unknown memory type</summary>
|
|
Unknown = 0,
|
|
/// <summary>Dynamic RAM</summary>
|
|
DRAM = 1,
|
|
/// <summary>Fast page mode DRAM</summary>
|
|
FPM = 2,
|
|
/// <summary>Extended data out DRAM</summary>
|
|
EDO = 3,
|
|
/// <summary>Dual-ported video DRAM</summary>
|
|
VRAM = 4,
|
|
/// <summary>Synchronous DRAM</summary>
|
|
SDRAM = 5,
|
|
/// <summary>Double data rate SDRAM</summary>
|
|
DDR = 6,
|
|
/// <summary>Double data rate SDRAM v2</summary>
|
|
DDR2 = 7,
|
|
/// <summary>Double data rate SDRAM v3</summary>
|
|
DDR3 = 8,
|
|
/// <summary>Double data rate SDRAM v4</summary>
|
|
DDR4 = 9,
|
|
/// <summary>Rambus DRAM</summary>
|
|
RDRAM = 10,
|
|
/// <summary>Synchronous graphics RAM</summary>
|
|
SGRAM = 11,
|
|
/// <summary>Pseudostatic RAM</summary>
|
|
PSRAM = 12,
|
|
/// <summary>Static RAM</summary>
|
|
SRAM = 13,
|
|
/// <summary>Read-only memory</summary>
|
|
ROM = 14,
|
|
/// <summary>Programmable ROM</summary>
|
|
PROM = 15,
|
|
/// <summary>Erasable programmable ROM</summary>
|
|
EPROM = 16,
|
|
/// <summary>Electronically-erasable programmable ROM</summary>
|
|
EEPROM = 17,
|
|
/// <summary>NAND flash</summary>
|
|
NAND = 18,
|
|
/// <summary>NOR flash</summary>
|
|
NOR = 19,
|
|
/// <summary>Resistive RAM</summary>
|
|
ReRAM = 20,
|
|
/// <summary>Conductive-bridging RAM</summary>
|
|
CBRAM = 21,
|
|
/// <summary>Domain-wall memory</summary>
|
|
DWM = 22,
|
|
/// <summary>Nano-RAM</summary>
|
|
NanoRAM = 23,
|
|
/// <summary>Millipede memory</summary>
|
|
Millipede = 24,
|
|
/// <summary>Floating Junction Gate RAM</summary>
|
|
FJG = 25,
|
|
/// <summary>Punched paper</summary>
|
|
PunchedPaper = 26,
|
|
/// <summary>Drum memory</summary>
|
|
DrumMemory = 27,
|
|
/// <summary>Magnetic-core</summary>
|
|
MagneticCore = 28,
|
|
/// <summary>Plated wire memory</summary>
|
|
PlatedWire = 29,
|
|
/// <summary>Core rope memory</summary>
|
|
CoreRope = 30,
|
|
/// <summary>Thin-film memory</summary>
|
|
ThinFilm = 31,
|
|
/// <summary>Twistor memory</summary>
|
|
Twistor = 32,
|
|
/// <summary>Bubble memory</summary>
|
|
Bubble = 33
|
|
}
|
|
|
|
public enum MemoryUsage
|
|
{
|
|
/// <summary>Unknown usage</summary>
|
|
Unknown = 0,
|
|
/// <summary>
|
|
/// Contains a boot loader (usually read-only) whose only function is to load the next memory (firmware or
|
|
/// cartridge)
|
|
/// </summary>
|
|
Bootloader = 1,
|
|
/// <summary>
|
|
/// Contains hardware initializing, some (or many) low level calls and code to load software from secondary
|
|
/// storage
|
|
/// </summary>
|
|
Firmware = 2,
|
|
/// <summary>Memory used by software running on the machine</summary>
|
|
Work = 3,
|
|
/// <summary>Memory used by the graphics processing units</summary>
|
|
Video = 4,
|
|
/// <summary>Memory used by the sound synthesizers</summary>
|
|
Sound = 5,
|
|
/// <summary>Memory used to store wave tables</summary>
|
|
Wavetable = 6,
|
|
/// <summary>Memory used as a buffer from secondary storage</summary>
|
|
StorageBuffer = 7,
|
|
/// <summary>Memory used to save arbitrary data and possible also configuration</summary>
|
|
Save = 8,
|
|
/// <summary>Memory used to save only configuration</summary>
|
|
Configuration = 9,
|
|
/// <summary>
|
|
/// Memory accessible directly to any of the processors in the machine, including graphics processors and sound
|
|
/// synthesizers
|
|
/// </summary>
|
|
Unified = 10
|
|
}
|
|
|
|
public enum StorageType
|
|
{
|
|
/// <summary>Contains an empty interface for user connection</summary>
|
|
Empty = -1,
|
|
/// <summary>Unknown</summary>
|
|
Unknown = 0,
|
|
/// <summary>Unknown magneto-optical</summary>
|
|
MagnetoOptical = 1,
|
|
/// <summary>Generic hard disk</summary>
|
|
HardDisk = 2,
|
|
/// <summary>Microdrive type hard disk</summary>
|
|
Microdrive = 3,
|
|
/// <summary>Zoned hard disk</summary>
|
|
ZonedHardDisk = 4,
|
|
/// <summary>USB flash drives</summary>
|
|
FlashDrive = 5,
|
|
/// <summary>CompactDisc</summary>
|
|
CompactDisc = 6,
|
|
/// <summary>Double-Density CompactDisc (Purple Book)</summary>
|
|
DDCD = 7,
|
|
/// <summary>120mm, Phase-Change, 1298496 sectors, 512 bytes/sector, PD650, ECMA-240, ISO 15485</summary>
|
|
PD650 = 8,
|
|
/// <summary>DVD</summary>
|
|
Dvd = 9,
|
|
/// <summary>DVD-RAM (cartridge only)</summary>
|
|
DVDRAM = 10,
|
|
/// <summary>HD DVD</summary>
|
|
HDDVDROM = 11,
|
|
/// <summary>Blu-ray Disc</summary>
|
|
Bluray = 12,
|
|
/// <summary>Enhanced Versatile Disc</summary>
|
|
EVD = 13,
|
|
/// <summary>Forward Versatile Disc</summary>
|
|
FVD = 14,
|
|
/// <summary>Holographic Versatile Disc</summary>
|
|
HVD = 15,
|
|
/// <summary>China Blue High Definition</summary>
|
|
CBHD = 16,
|
|
/// <summary>High Definition Versatile Multilayer Disc</summary>
|
|
HDVMD = 17,
|
|
/// <summary>Versatile Compact Disc High Density</summary>
|
|
VCDHD = 18,
|
|
/// <summary>Stacked Volumetric Optical Disc</summary>
|
|
SVOD = 19,
|
|
/// <summary>Five Dimensional disc</summary>
|
|
FDDVD = 20,
|
|
/// <summary>Pioneer LaserDisc</summary>
|
|
LD = 21,
|
|
/// <summary>Pioneer LaserDisc data</summary>
|
|
LDROM = 22,
|
|
LDROM2 = 23,
|
|
LVROM = 24,
|
|
MegaLD = 254,
|
|
/// <summary>Sony Hi-MD</summary>
|
|
HiMD = 26,
|
|
/// <summary>Sony MiniDisc</summary>
|
|
MD = 27,
|
|
MDData = 28,
|
|
MDData2 = 29,
|
|
/// <summary>5.25", Phase-Change, 1834348 sectors, 8192 bytes/sector, Ultra Density Optical, ECMA-350, ISO 17345</summary>
|
|
UDO = 30,
|
|
/// <summary>5.25", Phase-Change, 3669724 sectors, 8192 bytes/sector, Ultra Density Optical 2, ECMA-380, ISO 11976</summary>
|
|
UDO2 = 31,
|
|
PlayStationMemoryCard = 32,
|
|
PlayStationMemoryCard2 = 33,
|
|
/// <summary>Sony PlayStation game CD</summary>
|
|
PS1CD = 34,
|
|
/// <summary>Sony PlayStation 2 game CD</summary>
|
|
PS2CD = 35,
|
|
/// <summary>Sony PlayStation 2 game DVD</summary>
|
|
PS2DVD = 36,
|
|
/// <summary>Sony PlayStation 3 game DVD</summary>
|
|
PS3DVD = 37,
|
|
/// <summary>Sony PlayStation 3 game Blu-ray</summary>
|
|
PS3BD = 38,
|
|
/// <summary>Sony PlayStation 4 game Blu-ray</summary>
|
|
PS4BD = 39,
|
|
/// <summary>Sony PlayStation Portable Universal Media Disc (ECMA-365)</summary>
|
|
UMD = 40,
|
|
/// <summary>Microsoft X-box Game Disc</summary>
|
|
XGD = 41,
|
|
/// <summary>Microsoft X-box 360 Game Disc</summary>
|
|
XGD2 = 42,
|
|
/// <summary>Microsoft X-box 360 Game Disc</summary>
|
|
XGD3 = 43,
|
|
/// <summary>Microsoft X-box One Game Disc</summary>
|
|
XGD4 = 44,
|
|
/// <summary>Sega MegaCD</summary>
|
|
MEGACD = 45,
|
|
/// <summary>Sega Saturn disc</summary>
|
|
SATURNCD = 46,
|
|
/// <summary>Sega/Yamaha Gigabyte Disc</summary>
|
|
GDROM = 47,
|
|
SegaCard = 48,
|
|
/// <summary>PC-Engine / TurboGrafx cartridge</summary>
|
|
HuCard = 49,
|
|
/// <summary>PC-Engine / TurboGrafx CD</summary>
|
|
SuperCDROM2 = 50,
|
|
/// <summary>Atari Jaguar CD</summary>
|
|
JaguarCD = 51,
|
|
/// <summary>3DO CD</summary>
|
|
ThreeDO = 52,
|
|
/// <summary>NEC PC-FX</summary>
|
|
PCFX = 53,
|
|
/// <summary>NEO-GEO CD</summary>
|
|
NeoGeoCD = 54,
|
|
/// <summary>8" floppy</summary>
|
|
Floppy = 55,
|
|
/// <summary>5.25" floppy</summary>
|
|
Minifloppy = 56,
|
|
/// <summary>3.5" floppy</summary>
|
|
Microfloppy = 57,
|
|
/// <summary>5.25", DS, ?D, ?? tracks, ?? spt, 512 bytes/sector, GCR, opposite side heads, aka Twiggy</summary>
|
|
AppleFileWare = 58,
|
|
Bernoulli = 59,
|
|
Bernoulli2 = 60,
|
|
Ditto = 61,
|
|
DittoMax = 62,
|
|
Jaz = 63,
|
|
Jaz2 = 64,
|
|
PocketZip = 65,
|
|
REV120 = 66,
|
|
REV35 = 67,
|
|
REV70 = 68,
|
|
ZIP100 = 69,
|
|
ZIP250 = 70,
|
|
ZIP750 = 71,
|
|
CompactCassette = 72,
|
|
Data8 = 73,
|
|
MiniDV = 74,
|
|
CFast = 75,
|
|
CompactFlash = 76,
|
|
CompactFlashType2 = 77,
|
|
EZ135 = 78,
|
|
EZ230 = 79,
|
|
Quest = 80,
|
|
SparQ = 81,
|
|
SQ100 = 82,
|
|
SQ200 = 83,
|
|
SQ300 = 84,
|
|
SQ310 = 85,
|
|
SQ327 = 86,
|
|
SQ400 = 87,
|
|
SQ800 = 88,
|
|
SQ1500 = 89,
|
|
SQ2000 = 90,
|
|
SyJet = 91,
|
|
FamicomGamePak = 92,
|
|
GameBoyAdvanceGamePak = 93,
|
|
GameBoyGamePak = 94,
|
|
GOD = 95,
|
|
N64DD = 96,
|
|
N64GamePak = 97,
|
|
NESGamePak = 98,
|
|
Nintendo3DSGameCard = 99,
|
|
NintendoDiskCard = 100,
|
|
NintendoDSGameCard = 101,
|
|
NintendoDSiGameCard = 102,
|
|
SNESGamePak = 103,
|
|
SNESGamePakUS = 104,
|
|
WOD = 105,
|
|
WUOD = 106,
|
|
SwitchGameCard = 107,
|
|
MemoryStick = 108,
|
|
MemoryStickDuo = 109,
|
|
MemoryStickMicro = 110,
|
|
MemoryStickPro = 111,
|
|
MemoryStickProDuo = 112,
|
|
microSD = 113,
|
|
miniSD = 114,
|
|
SecureDigital = 115,
|
|
MMC = 116,
|
|
MMCmicro = 117,
|
|
RSMMC = 118,
|
|
MMCplus = 149,
|
|
MMCmobile = 119,
|
|
eMMC = 120,
|
|
MO120 = 121,
|
|
MO90 = 122,
|
|
MO300 = 123,
|
|
MO356 = 124,
|
|
CompactFloppy = 125,
|
|
DemiDiskette = 126,
|
|
/// <summary>3.5", 652 tracks, 2 sides, 512 bytes/sector, Floptical, ECMA-207, ISO 14169</summary>
|
|
Floptical = 127,
|
|
HiFD = 128,
|
|
QuickDisk = 129,
|
|
UHD144 = 130,
|
|
VideoFloppy = 131,
|
|
Wafer = 132,
|
|
ZXMicrodrive = 133,
|
|
BeeCard = 134,
|
|
Borsu = 135,
|
|
DataStore = 136,
|
|
MiniCard = 137,
|
|
Orb = 138,
|
|
Orb5 = 139,
|
|
SmartMedia = 140,
|
|
xD = 141,
|
|
XQD = 142,
|
|
DataPlay = 143,
|
|
LS120 = 144,
|
|
LS240 = 145,
|
|
FD32MB = 146,
|
|
RDX = 147,
|
|
PunchedCard = 148
|
|
}
|
|
|
|
public enum StorageInterface
|
|
{
|
|
Unknown = 0,
|
|
ACSI = 1,
|
|
ATA = 2,
|
|
XTA = 3,
|
|
ESDI = 4,
|
|
SCSI = 5,
|
|
USB = 6,
|
|
FireWire = 7,
|
|
SASI = 8,
|
|
ST506 = 9,
|
|
IPI = 10,
|
|
SMD = 11,
|
|
SATA = 12,
|
|
SSA = 13,
|
|
DSSI = 14,
|
|
HIPPI = 15,
|
|
SAS = 16,
|
|
FC = 17,
|
|
PCIe = 18,
|
|
M2 = 19,
|
|
SataExpress = 20
|
|
}
|
|
|
|
public enum ColorSpace : ushort
|
|
{
|
|
[Display(Name = "sRGB")]
|
|
Srgb = 1,
|
|
[Display(Name = "Adobe RGB")]
|
|
AdobeRgb = 2,
|
|
[Display(Name = "Wide Gamut RGB")]
|
|
WideGamutRgb = 4093,
|
|
[Display(Name = "ICC Profile")]
|
|
IccProfile = 65534,
|
|
[Display(Name = "Uncalibrated")]
|
|
Uncalibrated = 65535
|
|
}
|
|
|
|
public enum Contrast : ushort
|
|
{
|
|
Normal = 0,
|
|
Low = 1,
|
|
High = 2
|
|
}
|
|
|
|
public enum ExposureMode : ushort
|
|
{
|
|
Auto = 0,
|
|
Manual = 1,
|
|
[Display(Name = "Auto bracket")]
|
|
AutoBracket = 2
|
|
}
|
|
|
|
public enum ExposureProgram : ushort
|
|
{
|
|
[Display(Name = "Not Defined")]
|
|
Undefined = 0,
|
|
[Display(Name = "Manual")]
|
|
Manual = 1,
|
|
[Display(Name = "Program AE")]
|
|
ProgramAe = 2,
|
|
[Display(Name = "Aperture-priority AE")]
|
|
ApAe = 3,
|
|
[Display(Name = "Shutter speed priority AE")]
|
|
ShutterAe = 4,
|
|
[Display(Name = "Creative (Slow speed)")]
|
|
Creative = 5,
|
|
[Display(Name = "Action (High speed)")]
|
|
Action = 6,
|
|
[Display(Name = "Portrait")]
|
|
Portrait = 7,
|
|
[Display(Name = "Landscape")]
|
|
Landscape = 8,
|
|
[Display(Name = "Bulb")]
|
|
Bulb = 9
|
|
}
|
|
|
|
public enum Flash : ushort
|
|
{
|
|
[Display(Name = "No Flash")]
|
|
None = 0,
|
|
[Display(Name = "Fired")]
|
|
Fired = 1,
|
|
[Display(Name = "Fired, Return not detected")]
|
|
FiredNoReturn = 5,
|
|
[Display(Name = "Fired, Return detected")]
|
|
FiredReturn = 7,
|
|
[Display(Name = "On, Did not fire")]
|
|
OnDidNotFire = 8,
|
|
[Display(Name = "On, Fired")]
|
|
OnFired = 9,
|
|
[Display(Name = "On, Return not detected")]
|
|
OnNoReturn = 13,
|
|
[Display(Name = "On, Return detected")]
|
|
OnReturn = 15,
|
|
[Display(Name = "Off, Did not fire")]
|
|
OffDidNotFire = 16,
|
|
[Display(Name = "Off, Did not fire, Return not detected")]
|
|
OffDidNotFireNoReturn = 20,
|
|
[Display(Name = "Auto, Did not fire")]
|
|
AutoDidNotFire = 24,
|
|
[Display(Name = "Auto, Fired")]
|
|
AutoFired = 25,
|
|
[Display(Name = "Auto, Fired, Return not detected")]
|
|
AutoFiredNoReturn = 29,
|
|
[Display(Name = "Auto, Fired, Return detected")]
|
|
AutoFiredReturn = 31,
|
|
[Display(Name = "No flash function")]
|
|
NoFlash = 32,
|
|
[Display(Name = "Off, No flash function")]
|
|
OffNoFlash = 48,
|
|
[Display(Name = "Fired, Red-eye reduction")]
|
|
FiredRedEye = 65,
|
|
[Display(Name = "Fired, Red-eye reduction, Return not detected")]
|
|
FiredRedEyeNoReturn = 69,
|
|
[Display(Name = "Fired, Red-eye reduction, Return detected")]
|
|
FiredRedEyeReturn = 71,
|
|
[Display(Name = "On, Red-eye reduction")]
|
|
OnRedEye = 73,
|
|
[Display(Name = "On, Red-eye reduction, Return not detected")]
|
|
OnRedEyeNoReturn = 77,
|
|
[Display(Name = "On, Red-eye reduction, Return detected")]
|
|
OnRedEyeReturn = 79,
|
|
[Display(Name = "Off, Red-eye reduction")]
|
|
OffRedEye = 80,
|
|
[Display(Name = "Auto, Did not fire, Red-eye reduction")]
|
|
AutoNotFireRedEye = 88,
|
|
[Display(Name = "Auto, Fired, Red-eye reduction")]
|
|
AutoFiredRedEye = 89,
|
|
[Display(Name = "Auto, Fired, Red-eye reduction, Return not detected")]
|
|
AutoFiredRedEyeNoReturn = 93,
|
|
[Display(Name = "Auto, Fired, Red-eye reduction, Return detected")]
|
|
AutoFiredRedEyeReturn = 95
|
|
}
|
|
|
|
public enum LightSource : ushort
|
|
{
|
|
[Display(Name = "Unknown")]
|
|
Unknown = 0,
|
|
[Display(Name = "Daylight")]
|
|
Daylight = 1,
|
|
[Display(Name = "Fluorescent")]
|
|
Fluorescent = 2,
|
|
[Display(Name = "Tungsten (Incandescent)")]
|
|
Incandescent = 3,
|
|
[Display(Name = "Flash")]
|
|
Flash = 4,
|
|
[Display(Name = "Fine Weather")]
|
|
FineWeather = 9,
|
|
[Display(Name = "Cloudy")]
|
|
Cloudy = 10,
|
|
[Display(Name = "Shade")]
|
|
Shade = 11,
|
|
[Display(Name = "Daylight Fluorescent")]
|
|
DaylightFluorescent = 12,
|
|
[Display(Name = "Day White Fluorescent")]
|
|
DayWhiteFluorescent = 13,
|
|
[Display(Name = "Cool White Fluorescent")]
|
|
CoolWhiteFluorescent = 14,
|
|
[Display(Name = "White Fluorescent")]
|
|
WhiteFluorescent = 15,
|
|
[Display(Name = "Warm White Fluorescent")]
|
|
WarmWhiteFluorescent = 16,
|
|
[Display(Name = "Standard Light A")]
|
|
StandardLightA = 17,
|
|
[Display(Name = "Standard Light B")]
|
|
StandardLightB = 18,
|
|
[Display(Name = "Standard Light C")]
|
|
StandardLightC = 19,
|
|
[Display(Name = "D55")]
|
|
D55 = 20,
|
|
[Display(Name = "D65")]
|
|
D65 = 21,
|
|
[Display(Name = "D75")]
|
|
D75 = 22,
|
|
[Display(Name = "D50")]
|
|
D50 = 23,
|
|
[Display(Name = "ISO Studio Tungsten")]
|
|
ISOStudioTungsten = 24,
|
|
[Display(Name = "Other")]
|
|
Other = 255
|
|
}
|
|
|
|
public enum MeteringMode : ushort
|
|
{
|
|
[Display(Name = "Unknown")]
|
|
Unknown = 0,
|
|
[Display(Name = "Average")]
|
|
Average = 1,
|
|
[Display(Name = "Center-weighted average")]
|
|
CenterWeightedAverage = 2,
|
|
[Display(Name = "Spot")]
|
|
Spot = 3,
|
|
[Display(Name = "Multi-spot")]
|
|
MultiSpot = 4,
|
|
[Display(Name = "Multi-segment")]
|
|
MultiSegment = 5,
|
|
[Display(Name = "Partial")]
|
|
Partial = 6,
|
|
[Display(Name = "Other")]
|
|
Other = 255
|
|
}
|
|
|
|
public enum Orientation : ushort
|
|
{
|
|
[Display(Name = "Horizontal (normal)")]
|
|
Horizontal = 1,
|
|
[Display(Name = "Mirror horizontal")]
|
|
MirrorHorizontal = 2,
|
|
[Display(Name = "Rotate 180")]
|
|
Rotate180 = 3,
|
|
[Display(Name = "Mirror vertical")]
|
|
MirrorVertical = 4,
|
|
[Display(Name = "Mirror horizontal and rotate 270 CW")]
|
|
MirrorHorizontalAndRotate270CW = 5,
|
|
[Display(Name = "Rotate 90 CW")]
|
|
Rotate90CW = 6,
|
|
[Display(Name = "Mirror horizontal and rotate 90 CW")]
|
|
MirrorHorizontalAndRotate90CW = 7,
|
|
[Display(Name = "Rotate 270 CW")]
|
|
Rotate270CW = 8
|
|
}
|
|
|
|
public enum ResolutionUnit : ushort
|
|
{
|
|
None = 1,
|
|
Inches = 2,
|
|
Centimeters = 3
|
|
}
|
|
|
|
public enum Saturation : ushort
|
|
{
|
|
Normal = 0,
|
|
Low = 1,
|
|
High = 2
|
|
}
|
|
|
|
public enum SceneCaptureType : ushort
|
|
{
|
|
Standard = 0,
|
|
Landscape = 1,
|
|
Portrait = 2,
|
|
Night = 3
|
|
}
|
|
|
|
public enum SensingMethod : ushort
|
|
{
|
|
[Display(Name = "Unknown")]
|
|
Unknown = 0,
|
|
[Display(Name = "Not defined")]
|
|
Undefined = 1,
|
|
[Display(Name = "One-chip color area")]
|
|
OneChipColorArea = 2,
|
|
[Display(Name = "Two-chip color area")]
|
|
TwoChipColorArea = 3,
|
|
[Display(Name = "Three-chip color area")]
|
|
ThreeChipColorArea = 4,
|
|
[Display(Name = "Color sequential area")]
|
|
ColorSequentialArea = 5,
|
|
[Display(Name = "Trilinear")]
|
|
Trilinear = 7,
|
|
[Display(Name = "Color sequential linear")]
|
|
ColorSequentialLinear = 8
|
|
}
|
|
|
|
public enum SubjectDistanceRange : ushort
|
|
{
|
|
Unknown = 0,
|
|
Macro = 1,
|
|
Close = 2,
|
|
Distant = 3
|
|
}
|
|
|
|
public enum WhiteBalance : ushort
|
|
{
|
|
Auto = 0,
|
|
Manual = 1
|
|
}
|
|
|
|
public enum Sharpness : ushort
|
|
{
|
|
Normal = 0,
|
|
Low = 1,
|
|
High = 2
|
|
}
|
|
|
|
public enum AuditType : byte
|
|
{
|
|
None = 0,
|
|
Created = 1,
|
|
Updated = 2,
|
|
Deleted = 3
|
|
}
|
|
|
|
[Flags]
|
|
public enum DumpStatus : ulong
|
|
{
|
|
Unknown = 0,
|
|
Cracked = 1 << 0,
|
|
Fixed = 1 << 1,
|
|
Hacked = 1 << 2,
|
|
Modified = 1 << 3,
|
|
Pirated = 1 << 4,
|
|
Trained = 1 << 5,
|
|
Translated = 1 << 6,
|
|
Overdumped = 1 << 7,
|
|
Underdumped = 1 << 8,
|
|
Infected = 1 << 9,
|
|
Damaged = 1 << 10,
|
|
Verified = 1 << 11,
|
|
MissingData = 1 << 12,
|
|
MissingNonRequiredData = 1 << 13,
|
|
MissingEssentialData = 1 << 14,
|
|
DamagedSubchannel = 1 << 15
|
|
}
|
|
|
|
[Flags]
|
|
public enum SubchannelStatus : byte
|
|
{
|
|
None = 0,
|
|
P = 1 << 0,
|
|
Q = 1 << 1,
|
|
R = 1 << 2,
|
|
S = 1 << 3,
|
|
T = 1 << 4,
|
|
U = 1 << 5,
|
|
V = 1 << 6,
|
|
W = 1 << 7
|
|
}
|
|
|
|
public enum DistributionMode : uint
|
|
{
|
|
Unknown = 0,
|
|
Retail = 1,
|
|
Bundle = 2,
|
|
Oem = 3
|
|
}
|
|
|
|
public enum MasteringTextType : byte
|
|
{
|
|
Unknown = 0,
|
|
LotNumber = 1,
|
|
MasteringSid = 2,
|
|
MouldSid = 3,
|
|
MasteringCode = 4,
|
|
Barcode = 5,
|
|
Toolstamp = 6
|
|
}
|
|
|
|
public enum SoftwareRequirementType : byte
|
|
{
|
|
None = 0,
|
|
Run = 1,
|
|
Install = 2,
|
|
ExpansionOf = 3
|
|
}
|
|
|
|
public enum ProductCodeIssuer : byte
|
|
{
|
|
Microsoft = 0,
|
|
Nintendo = 1,
|
|
Sony = 2,
|
|
Activision = 3,
|
|
[Display(Name = "Electronic Arts")]
|
|
ElectronicArts = 4,
|
|
Ubisoft = 5,
|
|
Bethesda = 6,
|
|
Sega = 7,
|
|
Amazon = 8,
|
|
[Display(Name = "PlayStation Network")]
|
|
PSN = 9,
|
|
eBay = 10,
|
|
Other = 255
|
|
}
|
|
|
|
public enum BarcodeType : byte
|
|
{
|
|
Unknown = 0,
|
|
[Display(Name = "UPC-A")]
|
|
UPC_A = 1,
|
|
[Display(Name = "UPC-E")]
|
|
UPC_E = 2,
|
|
[Display(Name = "EAN-13")]
|
|
EAN_13 = 3,
|
|
[Display(Name = "EAN-8")]
|
|
EAN_8 = 4,
|
|
[Display(Name = "ISBN-10")]
|
|
ISBN_10 = 5,
|
|
[Display(Name = "ISBN-13")]
|
|
ISBN_13 = 6,
|
|
[Display(Name = "ISSN")]
|
|
ISSN = 7,
|
|
[Display(Name = "Code 39")]
|
|
Code39 = 8,
|
|
[Display(Name = "Code 128")]
|
|
Code128 = 9,
|
|
[Display(Name = "QR Code")]
|
|
QRCode = 10
|
|
}
|
|
|
|
public enum SoundSynthType
|
|
{
|
|
[Display(Name = "DAC")]
|
|
DAC = 0,
|
|
[Display(Name = "PSG")]
|
|
PSG = 1,
|
|
[Display(Name = "FM")]
|
|
FM = 2,
|
|
[Display(Name = "Wavetable")]
|
|
Wavetable = 3,
|
|
[Display(Name = "PCM / Sample-based")]
|
|
PCM = 4,
|
|
[Display(Name = "Subtractive")]
|
|
Subtractive = 5,
|
|
[Display(Name = "Additive")]
|
|
Additive = 6,
|
|
[Display(Name = "Physical modeling")]
|
|
PhysicalModeling = 7,
|
|
[Display(Name = "Hybrid")]
|
|
Hybrid = 8
|
|
}
|
|
|
|
public enum DatePrecision : byte
|
|
{
|
|
[Display(Name = "Full date")]
|
|
Full = 0,
|
|
[Display(Name = "Month and year only")]
|
|
MonthYear = 1,
|
|
[Display(Name = "Year only")]
|
|
YearOnly = 2
|
|
}
|
|
|
|
public enum UnM49Type : byte
|
|
{
|
|
[Display(Name = "World")]
|
|
World = 0,
|
|
[Display(Name = "Continent")]
|
|
Continent = 1,
|
|
[Display(Name = "Sub-region")]
|
|
SubRegion = 2,
|
|
[Display(Name = "Country")]
|
|
Country = 3
|
|
}
|
|
|
|
public enum SoftwareGenreType : byte
|
|
{
|
|
[Display(Name = "Genre")]
|
|
Genre = 0,
|
|
[Display(Name = "Perspective")]
|
|
Perspective = 1,
|
|
[Display(Name = "Gameplay")]
|
|
Gameplay = 2,
|
|
[Display(Name = "Setting")]
|
|
Setting = 3,
|
|
[Display(Name = "Category")]
|
|
Category = 4
|
|
}
|
|
|
|
public enum MobyGamesImportStatus : byte
|
|
{
|
|
Pending = 0,
|
|
Imported = 1,
|
|
Rejected = 2,
|
|
Failed = 3
|
|
}
|
|
|
|
public enum MobyGamesRejectionReview : byte
|
|
{
|
|
Pending = 0,
|
|
Confirmed = 1,
|
|
Overridden = 2
|
|
}
|
|
|
|
public enum IgdbMatchStatus : byte
|
|
{
|
|
Pending = 0,
|
|
Matched = 1,
|
|
NoMatch = 2,
|
|
NeedsReview = 3,
|
|
Skipped = 4,
|
|
Error = 5
|
|
}
|
|
|
|
public enum SoftwareCoverType : byte
|
|
{
|
|
[Display(Name = "Front Cover")]
|
|
Front = 0,
|
|
[Display(Name = "Back Cover")]
|
|
Back = 1,
|
|
[Display(Name = "Inside Cover (Front)")]
|
|
InsideFront = 2,
|
|
[Display(Name = "Inside Cover (Back)")]
|
|
InsideBack = 3,
|
|
[Display(Name = "Media")]
|
|
Media = 4,
|
|
[Display(Name = "Spine")]
|
|
Spine = 5,
|
|
[Display(Name = "Manual")]
|
|
Manual = 6,
|
|
[Display(Name = "Other")]
|
|
Other = 7
|
|
}
|
|
|
|
public enum MobyGamesCoverDownloadStatus : byte
|
|
{
|
|
Pending = 0,
|
|
Downloaded = 1,
|
|
Failed = 2,
|
|
Skipped = 3,
|
|
NoRelease = 4
|
|
}
|
|
|
|
public enum MobyGamesReviewImportStatus : byte
|
|
{
|
|
Pending = 0,
|
|
Imported = 1,
|
|
Failed = 2,
|
|
Skipped = 3,
|
|
NoReviews = 4
|
|
}
|
|
|
|
public enum SuggestionEntityType : byte
|
|
{
|
|
Company = 1,
|
|
Machine = 2,
|
|
MachineFamily = 3,
|
|
Processor = 4,
|
|
Gpu = 5,
|
|
SoundSynth = 6,
|
|
Software = 7,
|
|
SoftwareFamily = 8,
|
|
SoftwareRelease = 9,
|
|
SoftwareVersion = 10,
|
|
Book = 11,
|
|
Document = 12,
|
|
Magazine = 13,
|
|
MagazineIssue = 14,
|
|
Person = 15,
|
|
Screen = 16,
|
|
/// <summary>
|
|
/// A markdown description of a Company, scoped per language. The Subkey on the
|
|
/// Suggestion row holds the ISO-639-3 language code (e.g. "eng", "spa").
|
|
/// </summary>
|
|
CompanyDescription = 17,
|
|
/// <summary>
|
|
/// A markdown description of a Machine, scoped per language. The Subkey on the
|
|
/// Suggestion row holds the ISO-639-3 language code (e.g. "eng", "spa").
|
|
/// </summary>
|
|
MachineDescription = 18,
|
|
/// <summary>
|
|
/// A markdown synopsis of a Book, scoped per language. The Subkey on the
|
|
/// Suggestion row holds the ISO-639-3 language code (e.g. "eng", "spa").
|
|
/// </summary>
|
|
BookSynopsis = 19,
|
|
/// <summary>
|
|
/// A markdown synopsis of a Document, scoped per language. The Subkey on the
|
|
/// Suggestion row holds the ISO-639-3 language code (e.g. "eng", "spa").
|
|
/// </summary>
|
|
DocumentSynopsis = 20,
|
|
/// <summary>
|
|
/// A markdown synopsis of a Magazine, scoped per language. The Subkey on the
|
|
/// Suggestion row holds the ISO-639-3 language code (e.g. "eng", "spa").
|
|
/// </summary>
|
|
MagazineSynopsis = 21,
|
|
/// <summary>
|
|
/// A markdown description of a GPU, scoped per language. The Subkey on the
|
|
/// Suggestion row holds the ISO-639-3 language code (e.g. "eng", "spa").
|
|
/// </summary>
|
|
GpuDescription = 22,
|
|
/// <summary>
|
|
/// A markdown description of a Processor, scoped per language. The Subkey on the
|
|
/// Suggestion row holds the ISO-639-3 language code (e.g. "eng", "spa").
|
|
/// </summary>
|
|
ProcessorDescription = 23,
|
|
/// <summary>
|
|
/// A markdown description of a sound synthesizer, scoped per language. The Subkey on
|
|
/// the Suggestion row holds the ISO-639-3 language code (e.g. "eng", "spa").
|
|
/// </summary>
|
|
SoundSynthDescription = 24,
|
|
/// <summary>
|
|
/// A markdown biography of a Person, scoped per language. The Subkey on the
|
|
/// Suggestion row holds the ISO-639-3 language code (e.g. "eng", "spa").
|
|
/// </summary>
|
|
PersonDescription = 25,
|
|
/// <summary>
|
|
/// A markdown description of a Software, scoped per language. The Subkey on the
|
|
/// Suggestion row holds the ISO-639-3 language code (e.g. "eng", "spa").
|
|
/// </summary>
|
|
SoftwareDescription = 26,
|
|
/// <summary>
|
|
/// A batch of one or more pending GPU photos uploaded by a collaborator for review by an
|
|
/// admin. The EntityId on the Suggestion row holds the parent Gpu Id. The SuggestedValues
|
|
/// JSON carries one suggestion-level <c>license_id</c> + <c>source_url</c> applied to all
|
|
/// photos in the batch and a <c>photos</c> array (max 15 entries) of pending image
|
|
/// descriptors (<c>guid</c>, <c>extension</c>, per-photo <c>comment</c>). Per-photo
|
|
/// accept/reject is signalled by including/omitting the field-name key
|
|
/// <c>photo.{guid}</c> in <c>AppliedFields</c>.
|
|
/// </summary>
|
|
GpuPhoto = 27,
|
|
/// <summary>
|
|
/// A batch of one or more pending Processor photos uploaded by a collaborator for review
|
|
/// by an admin. The EntityId on the Suggestion row holds the parent Processor Id. The
|
|
/// SuggestedValues JSON carries one suggestion-level <c>license_id</c> + <c>source_url</c>
|
|
/// applied to all photos in the batch and a <c>photos</c> array (max 15 entries) of pending
|
|
/// image descriptors (<c>guid</c>, <c>extension</c>, per-photo <c>comment</c>). Per-photo
|
|
/// accept/reject is signalled by including/omitting the field-name key
|
|
/// <c>photo.{guid}</c> in <c>AppliedFields</c>.
|
|
/// </summary>
|
|
ProcessorPhoto = 28,
|
|
/// <summary>
|
|
/// A batch of one or more pending SoundSynth photos uploaded by a collaborator for review
|
|
/// by an admin. The EntityId on the Suggestion row holds the parent SoundSynth Id. The
|
|
/// SuggestedValues JSON carries one suggestion-level <c>license_id</c> + <c>source_url</c>
|
|
/// applied to all photos in the batch and a <c>photos</c> array (max 15 entries) of pending
|
|
/// image descriptors (<c>guid</c>, <c>extension</c>, per-photo <c>comment</c>). Per-photo
|
|
/// accept/reject is signalled by including/omitting the field-name key
|
|
/// <c>photo.{guid}</c> in <c>AppliedFields</c>.
|
|
/// </summary>
|
|
SoundSynthPhoto = 29,
|
|
/// <summary>
|
|
/// A batch of one or more pending Machine photos (Computer / Console / Smartphone)
|
|
/// uploaded by a collaborator for review by an admin. The EntityId on the Suggestion
|
|
/// row holds the parent Machine Id. The SuggestedValues JSON carries one
|
|
/// suggestion-level <c>license_id</c> + <c>source_url</c> applied to all photos in
|
|
/// the batch and a <c>photos</c> array (max 30 entries) of pending image descriptors
|
|
/// (<c>guid</c>, <c>extension</c>, per-photo <c>comment</c>). Per-photo accept/reject
|
|
/// is signalled by including/omitting the field-name key <c>photo.{guid}</c> in
|
|
/// <c>AppliedFields</c>. The same enum value covers all three Machine kinds because
|
|
/// they share the underlying <see cref="MachineType" />-discriminated table.
|
|
/// </summary>
|
|
MachinePhoto = 30,
|
|
/// <summary>
|
|
/// A batch of one or more pending Software promo art images uploaded by a collaborator
|
|
/// for review by an admin. The EntityId on the Suggestion row holds the parent
|
|
/// Software Id. The SuggestedValues JSON carries one suggestion-level
|
|
/// <c>group_name</c> (max 256 chars; the server does get-or-create on
|
|
/// <see cref="Marechai.Database.Models.SoftwarePromoArtGroup" /> on accept) and a
|
|
/// <c>photos</c> array (max 30 entries) of pending image descriptors
|
|
/// (<c>guid</c>, <c>extension</c>, per-photo <c>caption</c>). Per-photo accept/reject
|
|
/// is signalled by including/omitting the field-name key <c>promo.{guid}</c> in
|
|
/// <c>AppliedFields</c>. The pending Guid becomes the new SoftwarePromoArt row Id
|
|
/// directly. Unlike other batch-photo entity types this one carries NO
|
|
/// <c>license_id</c> and NO <c>source_url</c> because the underlying
|
|
/// <see cref="Marechai.Database.Models.SoftwarePromoArt" /> table has no such columns.
|
|
/// </summary>
|
|
SoftwarePromoArt = 31,
|
|
/// <summary>
|
|
/// A batch of one or more pending Software cover scans (front, back, manual, media,
|
|
/// spine, etc.) uploaded by a collaborator for review by an admin. The EntityId on
|
|
/// the Suggestion row holds the parent <see cref="Marechai.Database.Models.SoftwareRelease" />
|
|
/// Id (covers are release-scoped, not software-scoped). The SuggestedValues JSON
|
|
/// carries ONLY a <c>photos</c> array (max 30 entries) of per-cover descriptors
|
|
/// (<c>guid</c>, <c>extension</c>, mandatory per-cover <c>type</c> referencing
|
|
/// <see cref="SoftwareCoverType" />, optional per-cover <c>caption</c>); there are NO
|
|
/// suggestion-level fields. Per-cover accept/reject is signalled by including/omitting
|
|
/// the field-name key <c>cover.{guid}</c> in <c>AppliedFields</c>. The pending Guid
|
|
/// becomes the new <see cref="Marechai.Database.Models.SoftwareCover" /> row Id
|
|
/// directly (matching the admin upload convention where <c>model.Id</c> IS the
|
|
/// <c>originals/{guid}{ext}</c> basename).
|
|
/// </summary>
|
|
SoftwareCover = 32,
|
|
/// <summary>
|
|
/// A batch of one or more pending Software screenshot images uploaded by a
|
|
/// collaborator for review by an admin. The EntityId on the Suggestion row holds the
|
|
/// parent <see cref="Marechai.Database.Models.Software" /> Id. The SuggestedValues
|
|
/// JSON carries one mandatory suggestion-level <c>platform_id</c> (FK to
|
|
/// <see cref="Marechai.Database.Models.SoftwarePlatform" />; applied to every accepted
|
|
/// screenshot uniformly) and a <c>photos</c> array (max 50 entries) of pending image
|
|
/// descriptors (<c>guid</c>, <c>extension</c>, optional per-image <c>caption</c>).
|
|
/// Per-image accept/reject is signalled by including/omitting the field-name key
|
|
/// <c>screenshot.{guid}</c> in <c>AppliedFields</c>. The pending Guid becomes the new
|
|
/// <see cref="Marechai.Database.Models.SoftwareScreenshot" /> row Id directly. Allowed
|
|
/// extensions are jpg/jpeg/png/webp ONLY (narrower than the admin upload allow-set).
|
|
/// <c>SoftwareVersionId</c> is left null on every accepted row — the collaborative
|
|
/// path intentionally simplifies vs the admin upload flow which allows it.
|
|
/// </summary>
|
|
SoftwareScreenshot = 33,
|
|
/// <summary>
|
|
/// A batch of one or more pending Machine promo art images uploaded by a
|
|
/// collaborator for review by an admin. The EntityId on the Suggestion row holds
|
|
/// the parent Machine Id. The SuggestedValues JSON carries one suggestion-level
|
|
/// <c>group_name</c> (max 256 chars; the server does get-or-create on
|
|
/// <see cref="Marechai.Database.Models.SoftwarePromoArtGroup" /> on accept) and a
|
|
/// <c>photos</c> array (max 30 entries) of pending image descriptors
|
|
/// (<c>guid</c>, <c>extension</c>, per-image <c>caption</c>). Per-image
|
|
/// accept/reject is signalled by including/omitting the field-name key
|
|
/// <c>promo.{guid}</c> in <c>AppliedFields</c>. The pending Guid becomes the new
|
|
/// <see cref="Marechai.Database.Models.MachinePromoArt" /> row Id directly.
|
|
/// </summary>
|
|
/// <summary>
|
|
/// A single brand-new YouTube video link suggested by a collaborator for an existing
|
|
/// <see cref="Marechai.Database.Models.Gpu" />. The EntityId on the Suggestion row
|
|
/// holds the parent Gpu Id. The SuggestedValues JSON carries a single
|
|
/// <c>video_url</c> (the URL or 11-character YouTube video ID typed by the user) plus
|
|
/// a <c>title</c> populated server-side at submission time from YouTube's oEmbed
|
|
/// endpoint (the canonical YouTube video title). The whole suggestion is accepted or
|
|
/// rejected as a unit — there are no per-item dynamic accept-keys. The Subkey is
|
|
/// populated with the extracted YouTube video ID so the per-(user, gpu, video)
|
|
/// Pending dedupe gates resubmission of the same video while a previous suggestion
|
|
/// is still pending. Acceptance creates a new
|
|
/// <see cref="Marechai.Database.Models.GpuVideo" /> row with
|
|
/// Provider=<c>"YouTube"</c>. Only YouTube URLs are supported.
|
|
/// </summary>
|
|
GpuVideo = 34,
|
|
/// <summary>
|
|
/// A single brand-new YouTube video link suggested by a collaborator for an existing
|
|
/// <see cref="Marechai.Database.Models.Processor" />. The EntityId on the Suggestion
|
|
/// row holds the parent Processor Id. The SuggestedValues JSON carries a single
|
|
/// <c>video_url</c> (the URL or 11-character YouTube video ID typed by the user) plus
|
|
/// a <c>title</c> populated server-side at submission time from YouTube's oEmbed
|
|
/// endpoint (the canonical YouTube video title). The whole suggestion is accepted or
|
|
/// rejected as a unit — there are no per-item dynamic accept-keys. The Subkey is
|
|
/// populated with the extracted YouTube video ID so the per-(user, processor, video)
|
|
/// Pending dedupe gates resubmission of the same video while a previous suggestion
|
|
/// is still pending. Acceptance creates a new
|
|
/// <see cref="Marechai.Database.Models.ProcessorVideo" /> row with
|
|
/// Provider=<c>"YouTube"</c>. Only YouTube URLs are supported.
|
|
/// </summary>
|
|
ProcessorVideo = 35,
|
|
/// <summary>
|
|
/// A single brand-new YouTube video link suggested by a collaborator for an existing
|
|
/// <see cref="Marechai.Database.Models.SoundSynth" />. The EntityId on the Suggestion
|
|
/// row holds the parent SoundSynth Id. The SuggestedValues JSON carries a single
|
|
/// <c>video_url</c> (the URL or 11-character YouTube video ID typed by the user) plus
|
|
/// a <c>title</c> populated server-side at submission time from YouTube's oEmbed
|
|
/// endpoint (the canonical YouTube video title). The whole suggestion is accepted or
|
|
/// rejected as a unit — there are no per-item dynamic accept-keys. The Subkey is
|
|
/// populated with the extracted YouTube video ID so the per-(user, sound synth, video)
|
|
/// Pending dedupe gates resubmission of the same video while a previous suggestion
|
|
/// is still pending. Acceptance creates a new
|
|
/// <see cref="Marechai.Database.Models.SoundSynthVideo" /> row with
|
|
/// Provider=<c>"YouTube"</c>. Only YouTube URLs are supported.
|
|
/// </summary>
|
|
SoundSynthVideo = 36,
|
|
/// <summary>
|
|
/// A single brand-new YouTube video link suggested by a collaborator for an existing
|
|
/// <see cref="Marechai.Database.Models.Software" />. The EntityId on the Suggestion
|
|
/// row holds the parent Software Id. The SuggestedValues JSON carries a single
|
|
/// <c>video_url</c> (the URL or 11-character YouTube video ID typed by the user) plus
|
|
/// a <c>title</c> populated server-side at submission time from YouTube's oEmbed
|
|
/// endpoint (the canonical YouTube video title). The whole suggestion is accepted or
|
|
/// rejected as a unit — there are no per-item dynamic accept-keys. The Subkey is
|
|
/// populated with the extracted YouTube video ID so the per-(user, software, video)
|
|
/// Pending dedupe gates resubmission of the same video while a previous suggestion
|
|
/// is still pending. Acceptance creates a new
|
|
/// <see cref="Marechai.Database.Models.SoftwareVideo" /> row with
|
|
/// Provider=<c>"YouTube"</c>. Only YouTube URLs are supported.
|
|
/// </summary>
|
|
SoftwareVideo = 37,
|
|
/// <summary>
|
|
/// A single brand-new YouTube video link suggested by a collaborator for an existing
|
|
/// <see cref="Marechai.Database.Models.Machine" /> (computer, console, or smartphone
|
|
/// — they all share the Machine table). The EntityId on the Suggestion row holds the
|
|
/// parent Machine Id. The SuggestedValues JSON carries a single <c>video_url</c>
|
|
/// (the URL or 11-character YouTube video ID typed by the user) plus a <c>title</c>
|
|
/// populated server-side at submission time from YouTube's oEmbed endpoint (the
|
|
/// canonical YouTube video title). The whole suggestion is accepted or rejected as a
|
|
/// unit — there are no per-item dynamic accept-keys. The Subkey is populated with
|
|
/// the extracted YouTube video ID so the per-(user, machine, video) Pending dedupe
|
|
/// gates resubmission of the same video while a previous suggestion is still
|
|
/// pending. Acceptance creates a new
|
|
/// <see cref="Marechai.Database.Models.MachineVideo" /> row with
|
|
/// Provider=<c>"YouTube"</c>. Only YouTube URLs are supported.
|
|
/// </summary>
|
|
MachineVideo = 38,
|
|
/// <summary>
|
|
/// A batch of one or more pending Machine promo art images uploaded by a
|
|
/// collaborator for review by an admin. The EntityId on the Suggestion row holds
|
|
/// the parent Machine Id. The SuggestedValues JSON carries one suggestion-level
|
|
/// <c>group_name</c> (max 256 chars; the server does get-or-create on
|
|
/// <see cref="Marechai.Database.Models.SoftwarePromoArtGroup" /> on accept) and a
|
|
/// <c>photos</c> array (max 30 entries) of pending image descriptors
|
|
/// (<c>guid</c>, <c>extension</c>, per-image <c>caption</c>). Per-image
|
|
/// accept/reject is signalled by including/omitting the field-name key
|
|
/// <c>promo.{guid}</c> in <c>AppliedFields</c>. The pending Guid becomes the new
|
|
/// <see cref="Marechai.Database.Models.MachinePromoArt" /> row Id directly.
|
|
/// </summary>
|
|
MachinePromoArt = 39
|
|
}
|
|
|
|
public enum SuggestionStatus : byte
|
|
{
|
|
[Display(Name = "Pending")]
|
|
Pending = 0,
|
|
[Display(Name = "Accepted")]
|
|
Accepted = 1,
|
|
[Display(Name = "Partially accepted")]
|
|
PartiallyAccepted = 2,
|
|
[Display(Name = "Rejected")]
|
|
Rejected = 3,
|
|
[Display(Name = "Stale")]
|
|
Stale = 4,
|
|
[Display(Name = "Withdrawn")]
|
|
Withdrawn = 5
|
|
|
|
}
|
|
|
|
public enum OldDosSoftwareStatus : byte
|
|
{
|
|
[Display(Name = "Crawled")]
|
|
Crawled = 0,
|
|
[Display(Name = "Translated")]
|
|
Translated = 1,
|
|
[Display(Name = "Described")]
|
|
Described = 2,
|
|
[Display(Name = "Categorized")]
|
|
Categorized = 3,
|
|
[Display(Name = "Ready for review")]
|
|
ReadyForReview = 4,
|
|
[Display(Name = "Accepted")]
|
|
Accepted = 5,
|
|
[Display(Name = "Skipped")]
|
|
Skipped = 6,
|
|
[Display(Name = "Discarded")]
|
|
Discarded = 7
|
|
}
|
|
|
|
public enum OldDosAcceptMode : byte
|
|
{
|
|
[Display(Name = "Create new")]
|
|
CreateNew = 0,
|
|
[Display(Name = "Merge into existing")]
|
|
MergeIntoExisting = 1
|
|
}
|
|
|
|
public enum OldDosNameMatchKind : byte
|
|
{
|
|
[Display(Name = "Exact normalized")]
|
|
ExactNormalized = 0,
|
|
[Display(Name = "Fuzzy")]
|
|
Fuzzy = 1
|
|
}
|
|
|
|
public enum WwpcSoftwareStatus : byte
|
|
{
|
|
[Display(Name = "Crawled")]
|
|
Crawled = 0,
|
|
[Display(Name = "Described")]
|
|
Described = 1,
|
|
[Display(Name = "Categorized")]
|
|
Categorized = 2,
|
|
[Display(Name = "Ready for review")]
|
|
ReadyForReview = 3,
|
|
[Display(Name = "Accepted")]
|
|
Accepted = 4,
|
|
[Display(Name = "Skipped")]
|
|
Skipped = 5,
|
|
[Display(Name = "Discarded")]
|
|
Discarded = 6
|
|
}
|
|
|
|
public enum WwpcProductType : byte
|
|
{
|
|
[Display(Name = "Application")]
|
|
Application = 1,
|
|
[Display(Name = "Development tool")]
|
|
DevTool = 2,
|
|
[Display(Name = "System tool")]
|
|
System = 3
|
|
}
|
|
|
|
public enum WwpcAcceptMode : byte
|
|
{
|
|
[Display(Name = "Create new")]
|
|
CreateNew = 0,
|
|
[Display(Name = "Merge into existing")]
|
|
MergeIntoExisting = 1
|
|
}
|
|
|
|
public enum WwpcNameMatchKind : byte
|
|
{
|
|
[Display(Name = "Exact normalized")]
|
|
ExactNormalized = 0,
|
|
[Display(Name = "Fuzzy")]
|
|
Fuzzy = 1
|
|
}
|
|
|
|
public enum WwpcCompanyMatchKind : byte
|
|
{
|
|
[Display(Name = "Exact normalized")]
|
|
ExactNormalized = 0,
|
|
[Display(Name = "Fuzzy")]
|
|
Fuzzy = 1
|
|
}
|