diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index 59f98fd..206303f 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -6,7 +6,8 @@
"version": "6.3.0",
"commands": [
"dotnet-gitversion"
- ]
+ ],
+ "rollForward": false
}
}
}
diff --git a/.fallout/build.schema.json b/.fallout/build.schema.json
new file mode 100644
index 0000000..f3393c0
--- /dev/null
+++ b/.fallout/build.schema.json
@@ -0,0 +1,113 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "definitions": {
+ "Host": {
+ "type": "string",
+ "enum": [
+ "AppVeyor",
+ "AzurePipelines",
+ "Bamboo",
+ "Bitbucket",
+ "Bitrise",
+ "GitHubActions",
+ "GitLab",
+ "Jenkins",
+ "Rider",
+ "SpaceAutomation",
+ "TeamCity",
+ "Terminal",
+ "TravisCI",
+ "VisualStudio",
+ "VSCode"
+ ]
+ },
+ "ExecutableTarget": {
+ "type": "string",
+ "enum": [
+ "Generate",
+ "Pack",
+ "Test"
+ ]
+ },
+ "Verbosity": {
+ "type": "string",
+ "description": "",
+ "enum": [
+ "Verbose",
+ "Normal",
+ "Minimal",
+ "Quiet"
+ ]
+ },
+ "FalloutBuild": {
+ "properties": {
+ "Continue": {
+ "type": "boolean",
+ "description": "Indicates to continue a previously failed build attempt"
+ },
+ "Help": {
+ "type": "boolean",
+ "description": "Shows the help text for this build assembly"
+ },
+ "Host": {
+ "description": "Host for execution. Default is 'automatic'",
+ "$ref": "#/definitions/Host"
+ },
+ "NoLogo": {
+ "type": "boolean",
+ "description": "Disables displaying the NUKE logo"
+ },
+ "Partition": {
+ "type": "string",
+ "description": "Partition to use on CI"
+ },
+ "Plan": {
+ "type": "boolean",
+ "description": "Shows the execution plan (HTML)"
+ },
+ "Profile": {
+ "type": "array",
+ "description": "Defines the profiles to load",
+ "items": {
+ "type": "string"
+ }
+ },
+ "Root": {
+ "type": "string",
+ "description": "Root directory during build execution"
+ },
+ "Skip": {
+ "type": "array",
+ "description": "List of targets to be skipped. Empty list skips all dependencies",
+ "items": {
+ "$ref": "#/definitions/ExecutableTarget"
+ }
+ },
+ "Target": {
+ "type": "array",
+ "description": "List of targets to be invoked. Default is '{default_target}'",
+ "items": {
+ "$ref": "#/definitions/ExecutableTarget"
+ }
+ },
+ "Verbosity": {
+ "description": "Logging verbosity during build execution. Default is 'Normal'",
+ "$ref": "#/definitions/Verbosity"
+ },
+ "BuildProjectFile": {
+ "type": [
+ "null",
+ "string"
+ ],
+ "description": "Path to the build project (.csproj) relative to the repository root. Defaults to 'build/_build.csproj' when unset. Read by the Fallout global tool's in-tool runner."
+ }
+ }
+ }
+ },
+ "allOf": [
+ {},
+ {
+ "$ref": "#/definitions/FalloutBuild"
+ }
+ ]
+}
diff --git a/.fallout/parameters.json b/.fallout/parameters.json
new file mode 100644
index 0000000..0f087ba
--- /dev/null
+++ b/.fallout/parameters.json
@@ -0,0 +1,3 @@
+{
+ "Solution": "TvdbApi.sln"
+}
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..066047d
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,59 @@
+# ------------------------------------------------------------------------------
+#
+#
+# This code was generated.
+#
+# - To turn off auto-generation set:
+#
+# [GitHubActions (AutoGenerate = false)]
+#
+# - To trigger manual generation invoke:
+#
+# fallout --generate-configuration GitHubActions_build --host GitHubActions
+#
+#
+# ------------------------------------------------------------------------------
+
+name: build
+
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+ branches:
+ - main
+
+jobs:
+ ubuntu-latest:
+ name: ubuntu-latest
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ fetch-depth: 0
+ - name: 'Cache: .fallout/temp, ~/.nuget/packages'
+ uses: actions/cache@v4
+ with:
+ path: |
+ .fallout/temp
+ ~/.nuget/packages
+ key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }}
+ - name: 'Setup: .NET SDK'
+ uses: actions/setup-dotnet@v4
+ with:
+ global-json-file: global.json
+ - name: 'Restore: dotnet tools'
+ run: dotnet tool restore
+ - name: 'Run: Test, Pack'
+ run: dotnet run --project build/_build.csproj -- Test Pack
+ - name: 'Publish: test-results'
+ uses: actions/upload-artifact@v5
+ with:
+ name: test-results
+ path: artifacts/test-results
+ - name: 'Publish: packages'
+ uses: actions/upload-artifact@v5
+ with:
+ name: packages
+ path: artifacts/packages
diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml
deleted file mode 100644
index 6be78c7..0000000
--- a/.github/workflows/code-coverage.yml
+++ /dev/null
@@ -1,83 +0,0 @@
-name: Code Coverage
-
-on:
- push:
- branches: [ "**" ] # Trigger on all branches
- pull_request:
- branches: [ "main", "release/**" ] # Trigger on PRs to main and release branches
-
-permissions:
- contents: read
- actions: read
- checks: write
-
-jobs:
- test:
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v4
- with:
- fetch-depth: 0 # Full history needed
-
- - name: Setup .NET
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: '9.x' # Adjust to your .NET version
-
- - name: Restore dependencies
- run: dotnet restore
-
- - name: Build
- run: dotnet build --no-restore --configuration Release
-
- - name: Run TUNIT tests with coverage
- run: |
- dotnet test --no-build --configuration Release \
- -- --report-trx --coverage \
- --results-directory ./test-results
- continue-on-error: true # Continue even if tests fail
-
- - name: Generate Code Coverage Report
- uses: danielpalme/ReportGenerator-GitHub-Action@v5
- with:
- reports: '**/*.coverage'
- targetdir: ./coverage-report
- reporttypes: Html;Cobertura;MarkdownSummaryGithub
-
- - name: Upload test results
- uses: actions/upload-artifact@v4
- if: always()
- with:
- name: test-results
- path: |
- **/*.trx
- **/*.coverage
-
- - name: Publish test results
- uses: dorny/test-reporter@v1
- if: always()
- with:
- name: Test Results
- path: '**/*.trx'
- reporter: dotnet-trx
-
- - name: Code Coverage Report
- uses: irongut/CodeCoverageSummary@v1.3.0
- with:
- filename: ./coverage-report/Cobertura.xml
- badge: true
- fail_below_min: false # Set to true if you want to fail on low coverage
- format: markdown
- hide_branch_rate: false
- hide_complexity: false
- indicators: true
- output: both
- thresholds: '60 80' # Warning at 60%, error below 80%
-
- - name: Add Coverage PR Comment
- uses: marocchino/sticky-pull-request-comment@v2
- if: github.event_name == 'pull_request'
- with:
- recreate: true
- path: code-coverage-results.md
\ No newline at end of file
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
new file mode 100644
index 0000000..469eaff
--- /dev/null
+++ b/.github/workflows/publish.yml
@@ -0,0 +1,50 @@
+# Publish to NuGet.org via Trusted Publishing (OIDC) — no stored API key.
+#
+# Requires a one-time Trusted Publisher policy on nuget.org for each package
+# (TvdbClient, TvdbClient.Models, TvdbClient.Abstractions): owner Chrison-dev,
+# repo TvdbApi, workflow publish.yml, environment nuget.org. Set the repo variable
+# NUGET_USER to your nuget.org username.
+#
+# Triggered by pushing a version tag, e.g. `git tag v4.7.11 && git push origin v4.7.11`.
+name: publish
+
+on:
+ push:
+ tags: ['v*']
+ workflow_dispatch:
+
+permissions:
+ id-token: write # required for OIDC trusted publishing
+ contents: read
+
+jobs:
+ publish:
+ runs-on: ubuntu-latest
+ environment: nuget.org
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0 # GitVersion needs full history
+
+ - uses: actions/setup-dotnet@v4
+ with:
+ global-json-file: global.json
+
+ - name: 'Restore: dotnet tools'
+ run: dotnet tool restore
+
+ - name: 'Pack'
+ run: dotnet run --project build/_build.csproj -- Pack
+
+ - name: 'NuGet: trusted-publishing login (OIDC → short-lived key)'
+ uses: NuGet/login@v1
+ id: login
+ with:
+ user: ${{ vars.NUGET_USER }}
+
+ - name: 'NuGet: push'
+ run: >
+ dotnet nuget push "artifacts/packages/*.nupkg"
+ --source https://api.nuget.org/v3/index.json
+ --api-key ${{ steps.login.outputs.NUGET_API_KEY }}
+ --skip-duplicate
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
deleted file mode 100644
index 2d38397..0000000
--- a/.github/workflows/release.yml
+++ /dev/null
@@ -1,153 +0,0 @@
-name: Release
-
-on:
- push:
- branches: [ release, release/* ] # Trigger on release branch(es)
- workflow_dispatch: # Allows manual trigger from any branch
-
-permissions:
- contents: write
- packages: write
- pull-requests: read
-
-jobs:
- build-and-test:
- runs-on: ubuntu-latest
-
- outputs:
- version: ${{ steps.gitversion.outputs.fullSemVer }}
- simple-version: ${{ steps.gitversion.outputs.semVer }}
-
- steps:
- - uses: actions/checkout@v4
- with:
- fetch-depth: 0 # Full history needed
-
- - name: Setup .NET
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: '9.x' # Adjust to your .NET version
-
- - name: Install GitVersion
- uses: gittools/actions/gitversion/setup@v4.0.1
- with:
- versionSpec: '6.3.x'
-
- - name: Determine Version
- id: gitversion
- uses: gittools/actions/gitversion/execute@v4.0.1
-
- - name: Display GitVersion outputs
- run: |
- echo "SemVer: ${{ steps.gitversion.outputs.semVer }}"
- echo "FullSemVer: ${{ steps.gitversion.outputs.fullSemVer }}"
- echo "AssemblySemVer: ${{ steps.gitversion.outputs.assemblySemVer }}"
- echo "InformationalVersion: ${{ steps.gitversion.outputs.informationalVersion }}"
-
- - name: Restore dependencies
- run: dotnet restore
-
- - name: Build
- run: dotnet build --no-restore --configuration Release
-
- - name: Run TUNIT tests
- run: dotnet test --no-build --configuration Release
-
- - name: Pack NuGet packages
- run: |
- dotnet pack --no-build --configuration Release \
- --output ./packages \
- -p:PackageVersion=${{ steps.gitversion.outputs.fullSemVer }} \
- -p:Version=${{ steps.gitversion.outputs.assemblySemVer }} \
- -p:AssemblyVersion=${{ steps.gitversion.outputs.assemblySemVer }} \
- -p:FileVersion=${{ steps.gitversion.outputs.assemblySemVer }} \
- -p:InformationalVersion=${{ steps.gitversion.outputs.informationalVersion }}
-
- - name: Upload build artifacts
- uses: actions/upload-artifact@v4
- with:
- name: nuget-packages
- path: ./packages/*.nupkg
-
- publish-nuget:
- needs: build-and-test
- runs-on: ubuntu-latest
-
- steps:
- - name: Download artifacts
- uses: actions/download-artifact@v4
- with:
- name: nuget-packages
- path: ./packages
-
- - name: Setup .NET
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: '8.x'
-
- - name: Publish to NuGet
- run: |
- dotnet nuget push "./packages/*.nupkg" \
- --api-key ${{ secrets.NUGET_API_KEY }} \
- --source https://api.nuget.org/v3/index.json \
- --skip-duplicate
-
- github-release:
- needs: [build-and-test, publish-nuget]
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v4
- with:
- fetch-depth: 0
- token: ${{ secrets.GITHUB_TOKEN }}
-
- - name: Download artifacts
- uses: actions/download-artifact@v4
- with:
- name: nuget-packages
- path: ./packages
-
- - name: Create source archive
- run: |
- # Create a clean source archive excluding build artifacts
- git archive --format=zip --output=./packages/source-v${{ needs.build-and-test.outputs.simple-version }}.zip HEAD
- git archive --format=tar.gz --output=./packages/source-v${{ needs.build-and-test.outputs.simple-version }}.tar.gz HEAD
-
- - name: Generate Release Notes
- id: release_notes
- run: |
- # Generate basic release notes from commits since last release tag
- PREVIOUS_TAG=$(git describe --tags --abbrev=0 --match="v*" 2>/dev/null || echo "")
-
- echo "## What's Changed" > release_notes.md
- if [ -n "$PREVIOUS_TAG" ]; then
- echo "" >> release_notes.md
- git log --pretty=format:"- %s (%h)" $PREVIOUS_TAG..HEAD >> release_notes.md
- else
- echo "- Initial release" >> release_notes.md
- fi
-
- echo "" >> release_notes.md
- echo "## NuGet Package" >> release_notes.md
- echo "This release is available on NuGet:" >> release_notes.md
- echo '```' >> release_notes.md
- echo "dotnet add package TvdbClient --version ${{ needs.build-and-test.outputs.version }}" >> release_notes.md
- echo '```' >> release_notes.md
-
- - name: Create GitHub Release
- uses: softprops/action-gh-release@v2
- with:
- tag_name: v${{ needs.build-and-test.outputs.simple-version }}
- name: Release v${{ needs.build-and-test.outputs.simple-version }}
- body_path: release_notes.md
- files: |
- ./packages/*.nupkg
- ./packages/*.zip
- ./packages/*.tar.gz
- draft: false
- prerelease: ${{ contains(needs.build-and-test.outputs.version, '-') }}
- generate_release_notes: true
- make_latest: true
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
\ No newline at end of file
diff --git a/Directory.Build.props b/Directory.Build.props
index df0880f..2e9f1c7 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -14,10 +14,10 @@
true
- 4.7.10
- 4.7.10.0
- 4.7.10.0
- 4.7.10
+ 4.7.11
+ 4.7.11.0
+ 4.7.11.0
+ 4.7.11
$(GitVersion_FullSemVer)
$(GitVersion_AssemblySemVer)
diff --git a/GitVersion.yml b/GitVersion.yml
index 702aa44..f55a8a1 100644
--- a/GitVersion.yml
+++ b/GitVersion.yml
@@ -1,5 +1,10 @@
mode: ContinuousDelivery
+# Versioning scheme: Major.Minor track the TheTVDB API version (currently 4.7);
+# the PATCH is our internal release counter. Releases are cut by tagging
+# `v..` (e.g. `git tag v4.7.11`) — GitVersion reads the tag
+# (tag-prefix 'v'). Untagged builds get a prerelease suffix.
+
branches:
main:
mode: ContinuousDelivery
diff --git a/README.md b/README.md
index 2e18e46..7cb69df 100644
--- a/README.md
+++ b/README.md
@@ -1,62 +1,92 @@
-# TvdbApi
-
-C# Api Client for the TVDB project
-
-## TVDB Project
-
-- [TVDB API](https://thetvdb.com)
-- [TVDB API Github](https://github.com/thetvdb/v4-api)
-- [TVDB API Documentation](https://thetvdb.github.io/v4-api)
-
-## Usage
-
-The TVDB Team recommends to maintain your own copy of their database or use a caching proxy to reduce the amount of calls being made against their API.
-It is entirely up to you as the developer to implement this. This lbirary provides a simple API client AS IS, without any of the recommended caching mechanism.
-
-### Configuration
-
-The Client library relies on config records being present in either your appsettings.json or in a standalone TvdbClientConfig.json:
-
-```json
-{
- "TvdbConfiguration": {
- "BaseUrl": "https://api4.thetvdb.com/v4",
- /* This API Key comes from the TVDB Example and obviously needs to be replaced in production */
- "ApiKey": "580c9239-d2f8-4460-a22e-6831900a97a3",
- "Pin": "IPQZOCMN"
- }
-}
-```
-
-Make sure to replace the API Key in the example with your own API Key in [TVDBs API Key Dashboard](https://www.thetvdb.com/dashboard/account/apikey).
-
-### DI Registration
-
-Register TVDB Client with your DI of choice:
-
-```csharp
- var config = builder.Configuration.AddTvdbClient().Build();
- builder.Services.AddTvdbClient(config);
-```
-
-### Using the Clients
-
-```csharp
- var client = serviceProvider.GetRequiredService();
- var series = await client.GetSeriesAsync(121361);
- Console.WriteLine(series.Data.SeriesName);
-```
-
-## Versioning
-
-I try my best to align the version of this library to the latest TVDB version on their Github repository to make it easy to see which version this client is compatible with.
-
-### Git Version
-
-This project uses [GitVersion](https://gitversion.net/docs/usage) for automatic semantic versioning.
-
-To view version information for a project, just run this command:
-
-``` bash
-dotnet-gitversion
-```
+# TvdbClient
+
+[](https://www.nuget.org/packages/TvdbClient/)
+[](https://www.nuget.org/packages/TvdbClient/)
+[](https://github.com/Chrison-dev/TvdbApi/actions/workflows/build.yml)
+[](LICENSE)
+
+A C# `HttpClient`-based API client for [TheTVDB](https://thetvdb.com) **v4 API**.
+
+- [TheTVDB API](https://thetvdb.com) · [v4-api GitHub](https://github.com/thetvdb/v4-api) · [API docs](https://thetvdb.github.io/v4-api)
+
+> This is a thin client **AS IS** — it does not implement the caching/proxying that
+> TheTVDB recommends. Add your own caching layer if you call the API at volume.
+
+## Packages
+
+The client is split into three packages so the API-versioned models can be
+regenerated independently of the generic client code:
+
+| Package | What | Versioning |
+|---|---|---|
+| **`TvdbClient`** | Client core: generated clients, auth, DI wiring. | Generic SemVer |
+| **`TvdbClient.Models`** | The generated DTOs (`Tvdb.Models`). | Tracks the TheTVDB API version (`Major.Minor`) |
+| **`TvdbClient.Abstractions`** | Generic contracts, configuration, response envelope. | Generic SemVer |
+
+Installing `TvdbClient` pulls in the other two.
+
+```sh
+dotnet add package TvdbClient
+```
+
+## Usage
+
+### Configuration
+
+Provide your TheTVDB API key (and optional subscriber PIN) via configuration —
+either `appsettings.json` or a standalone `TvdbClientConfig.json`:
+
+```json
+{
+ "TvdbConfiguration": {
+ "BaseUrl": "https://api4.thetvdb.com/v4",
+ "ApiKey": "",
+ "Pin": ""
+ }
+}
+```
+
+Get an API key from [TheTVDB's API Key dashboard](https://www.thetvdb.com/dashboard/account/apikey).
+
+### DI registration
+
+```csharp
+using Microsoft.Extensions.DependencyInjection;
+
+builder.Configuration.AddTvdbClient();
+builder.Services.AddTvdbClient(builder.Configuration);
+```
+
+### Using the clients
+
+Resolve the per-resource client you need. Login/token acquisition and the
+`Authorization` header are handled automatically by the registered handler.
+
+```csharp
+using Tvdb.Clients;
+
+var series = serviceProvider.GetRequiredService();
+var response = await series.SeriesGetAsync(121361); // ids are long
+var record = response.Data; // { data, status } envelope
+```
+
+## Regenerating the models
+
+Models + clients are generated from TheTVDB's OpenAPI spec via the
+[Fallout](https://github.com/ChrisonSimtian/Fallout) build (NSwag under the hood):
+
+```sh
+./build.ps1 Generate
+```
+
+This downloads the live v4 spec, applies a small overlay (integer-id coercion,
+inline-enum hoisting), and regenerates `TvdbClient.Models` + the clients.
+
+## Versioning
+
+`Major.Minor` track the TheTVDB API version; the patch is this library's own
+release counter. Managed with [GitVersion](https://gitversion.net) (`dotnet-gitversion`).
+
+## License
+
+[MIT](LICENSE)
diff --git a/TvdbApi.sln b/TvdbApi.sln
index 07c455c..365847a 100644
--- a/TvdbApi.sln
+++ b/TvdbApi.sln
@@ -1,56 +1,106 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.13.35617.110
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TvdbClient", "src\TvdbClient\TvdbClient.csproj", "{02CB1507-5FF6-9962-1A70-EC35D9E298ED}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TvdbClient.Tests", "tests\TvdbClient.Tests\TvdbClient.Tests.csproj", "{E72AACA8-0A10-E62A-E526-41B75B6E6348}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}"
- ProjectSection(SolutionItems) = preProject
- .gitignore = .gitignore
- Directory.Build.props = Directory.Build.props
- LICENSE = LICENSE
- .github\workflows\publish-nuget.yml = .github\workflows\publish-nuget.yml
- README.md = README.md
- .github\workflows\test-coverage.yml = .github\workflows\test-coverage.yml
- version.json = version.json
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{1570EA31-904E-4036-89EE-890A8358C7AA}"
- ProjectSection(SolutionItems) = preProject
- src\Directory.Build.props = src\Directory.Build.props
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{7849F1D9-4557-41C5-A747-241B92631187}"
- ProjectSection(SolutionItems) = preProject
- tests\Directory.Build.props = tests\Directory.Build.props
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {02CB1507-5FF6-9962-1A70-EC35D9E298ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {02CB1507-5FF6-9962-1A70-EC35D9E298ED}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {02CB1507-5FF6-9962-1A70-EC35D9E298ED}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {02CB1507-5FF6-9962-1A70-EC35D9E298ED}.Release|Any CPU.Build.0 = Release|Any CPU
- {E72AACA8-0A10-E62A-E526-41B75B6E6348}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E72AACA8-0A10-E62A-E526-41B75B6E6348}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E72AACA8-0A10-E62A-E526-41B75B6E6348}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E72AACA8-0A10-E62A-E526-41B75B6E6348}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(NestedProjects) = preSolution
- {02CB1507-5FF6-9962-1A70-EC35D9E298ED} = {1570EA31-904E-4036-89EE-890A8358C7AA}
- {E72AACA8-0A10-E62A-E526-41B75B6E6348} = {7849F1D9-4557-41C5-A747-241B92631187}
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {EBB4E090-0583-48B6-AEC2-1AB4E3B98D2A}
- EndGlobalSection
-EndGlobal
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.13.35617.110
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TvdbClient", "src\TvdbClient\TvdbClient.csproj", "{02CB1507-5FF6-9962-1A70-EC35D9E298ED}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}"
+ ProjectSection(SolutionItems) = preProject
+ .gitignore = .gitignore
+ Directory.Build.props = Directory.Build.props
+ LICENSE = LICENSE
+ .github\workflows\publish-nuget.yml = .github\workflows\publish-nuget.yml
+ README.md = README.md
+ .github\workflows\test-coverage.yml = .github\workflows\test-coverage.yml
+ version.json = version.json
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{1570EA31-904E-4036-89EE-890A8358C7AA}"
+ ProjectSection(SolutionItems) = preProject
+ src\Directory.Build.props = src\Directory.Build.props
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{7849F1D9-4557-41C5-A747-241B92631187}"
+ ProjectSection(SolutionItems) = preProject
+ tests\Directory.Build.props = tests\Directory.Build.props
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TvdbClient.Models", "src\TvdbClient.Models\TvdbClient.Models.csproj", "{1B8ECC10-3AE4-4890-B738-8AB35FA661FC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TvdbClient.Abstractions", "src\TvdbClient.Abstractions\TvdbClient.Abstractions.csproj", "{E7E64FC1-D8C1-4437-AB3E-E9C4EBAA219E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TvdbClient.Specs", "tests\TvdbClient.Specs\TvdbClient.Specs.csproj", "{5E508C09-8035-4877-A1D0-299A04EA6962}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {02CB1507-5FF6-9962-1A70-EC35D9E298ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {02CB1507-5FF6-9962-1A70-EC35D9E298ED}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {02CB1507-5FF6-9962-1A70-EC35D9E298ED}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {02CB1507-5FF6-9962-1A70-EC35D9E298ED}.Debug|x64.Build.0 = Debug|Any CPU
+ {02CB1507-5FF6-9962-1A70-EC35D9E298ED}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {02CB1507-5FF6-9962-1A70-EC35D9E298ED}.Debug|x86.Build.0 = Debug|Any CPU
+ {02CB1507-5FF6-9962-1A70-EC35D9E298ED}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {02CB1507-5FF6-9962-1A70-EC35D9E298ED}.Release|Any CPU.Build.0 = Release|Any CPU
+ {02CB1507-5FF6-9962-1A70-EC35D9E298ED}.Release|x64.ActiveCfg = Release|Any CPU
+ {02CB1507-5FF6-9962-1A70-EC35D9E298ED}.Release|x64.Build.0 = Release|Any CPU
+ {02CB1507-5FF6-9962-1A70-EC35D9E298ED}.Release|x86.ActiveCfg = Release|Any CPU
+ {02CB1507-5FF6-9962-1A70-EC35D9E298ED}.Release|x86.Build.0 = Release|Any CPU
+ {1B8ECC10-3AE4-4890-B738-8AB35FA661FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1B8ECC10-3AE4-4890-B738-8AB35FA661FC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1B8ECC10-3AE4-4890-B738-8AB35FA661FC}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1B8ECC10-3AE4-4890-B738-8AB35FA661FC}.Debug|x64.Build.0 = Debug|Any CPU
+ {1B8ECC10-3AE4-4890-B738-8AB35FA661FC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1B8ECC10-3AE4-4890-B738-8AB35FA661FC}.Debug|x86.Build.0 = Debug|Any CPU
+ {1B8ECC10-3AE4-4890-B738-8AB35FA661FC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1B8ECC10-3AE4-4890-B738-8AB35FA661FC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1B8ECC10-3AE4-4890-B738-8AB35FA661FC}.Release|x64.ActiveCfg = Release|Any CPU
+ {1B8ECC10-3AE4-4890-B738-8AB35FA661FC}.Release|x64.Build.0 = Release|Any CPU
+ {1B8ECC10-3AE4-4890-B738-8AB35FA661FC}.Release|x86.ActiveCfg = Release|Any CPU
+ {1B8ECC10-3AE4-4890-B738-8AB35FA661FC}.Release|x86.Build.0 = Release|Any CPU
+ {E7E64FC1-D8C1-4437-AB3E-E9C4EBAA219E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E7E64FC1-D8C1-4437-AB3E-E9C4EBAA219E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E7E64FC1-D8C1-4437-AB3E-E9C4EBAA219E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E7E64FC1-D8C1-4437-AB3E-E9C4EBAA219E}.Debug|x64.Build.0 = Debug|Any CPU
+ {E7E64FC1-D8C1-4437-AB3E-E9C4EBAA219E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E7E64FC1-D8C1-4437-AB3E-E9C4EBAA219E}.Debug|x86.Build.0 = Debug|Any CPU
+ {E7E64FC1-D8C1-4437-AB3E-E9C4EBAA219E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E7E64FC1-D8C1-4437-AB3E-E9C4EBAA219E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E7E64FC1-D8C1-4437-AB3E-E9C4EBAA219E}.Release|x64.ActiveCfg = Release|Any CPU
+ {E7E64FC1-D8C1-4437-AB3E-E9C4EBAA219E}.Release|x64.Build.0 = Release|Any CPU
+ {E7E64FC1-D8C1-4437-AB3E-E9C4EBAA219E}.Release|x86.ActiveCfg = Release|Any CPU
+ {E7E64FC1-D8C1-4437-AB3E-E9C4EBAA219E}.Release|x86.Build.0 = Release|Any CPU
+ {5E508C09-8035-4877-A1D0-299A04EA6962}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5E508C09-8035-4877-A1D0-299A04EA6962}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5E508C09-8035-4877-A1D0-299A04EA6962}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5E508C09-8035-4877-A1D0-299A04EA6962}.Debug|x64.Build.0 = Debug|Any CPU
+ {5E508C09-8035-4877-A1D0-299A04EA6962}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5E508C09-8035-4877-A1D0-299A04EA6962}.Debug|x86.Build.0 = Debug|Any CPU
+ {5E508C09-8035-4877-A1D0-299A04EA6962}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5E508C09-8035-4877-A1D0-299A04EA6962}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5E508C09-8035-4877-A1D0-299A04EA6962}.Release|x64.ActiveCfg = Release|Any CPU
+ {5E508C09-8035-4877-A1D0-299A04EA6962}.Release|x64.Build.0 = Release|Any CPU
+ {5E508C09-8035-4877-A1D0-299A04EA6962}.Release|x86.ActiveCfg = Release|Any CPU
+ {5E508C09-8035-4877-A1D0-299A04EA6962}.Release|x86.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {02CB1507-5FF6-9962-1A70-EC35D9E298ED} = {1570EA31-904E-4036-89EE-890A8358C7AA}
+ {1B8ECC10-3AE4-4890-B738-8AB35FA661FC} = {1570EA31-904E-4036-89EE-890A8358C7AA}
+ {E7E64FC1-D8C1-4437-AB3E-E9C4EBAA219E} = {1570EA31-904E-4036-89EE-890A8358C7AA}
+ {5E508C09-8035-4877-A1D0-299A04EA6962} = {7849F1D9-4557-41C5-A747-241B92631187}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {EBB4E090-0583-48B6-AEC2-1AB4E3B98D2A}
+ EndGlobalSection
+EndGlobal
diff --git a/build.cmd b/build.cmd
new file mode 100644
index 0000000..93f8100
--- /dev/null
+++ b/build.cmd
@@ -0,0 +1,4 @@
+@echo off
+:: Fallout build bootstrapper (Windows). Runs the build project directly.
+:: build.cmd Generate
+dotnet run --project "%~dp0build\_build.csproj" -- %*
diff --git a/build.ps1 b/build.ps1
new file mode 100755
index 0000000..a4a3e7d
--- /dev/null
+++ b/build.ps1
@@ -0,0 +1,10 @@
+#!/usr/bin/env pwsh
+# Fallout build bootstrapper. Runs the build project directly (no global tool needed).
+# ./build.ps1 Generate # regenerate the TheTVDB client from the live spec
+# ./build.ps1 # default target
+[CmdletBinding()]
+Param([Parameter(ValueFromRemainingArguments = $true)] [string[]] $BuildArguments)
+
+$ErrorActionPreference = 'Stop'
+dotnet run --project "$PSScriptRoot/build/_build.csproj" -- @BuildArguments
+exit $LASTEXITCODE
diff --git a/build/Build.cs b/build/Build.cs
new file mode 100644
index 0000000..b8dccbb
--- /dev/null
+++ b/build/Build.cs
@@ -0,0 +1,210 @@
+using System.Linq;
+using System.Threading.Tasks;
+using Fallout.Common;
+using Fallout.Common.CI.GitHubActions;
+using Fallout.Common.IO;
+using Fallout.Common.Tools.DotNet;
+using NJsonSchema;
+using NJsonSchema.CodeGeneration.CSharp;
+using NSwag;
+using NSwag.CodeGeneration;
+using NSwag.CodeGeneration.CSharp;
+using NSwag.CodeGeneration.OperationNameGenerators;
+using Serilog;
+using static Fallout.Common.Tools.DotNet.DotNetTasks;
+
+///
+/// Fallout build for the TheTVDB v4 client.
+///
+/// CI (build.yml, auto-generated from the [GitHubActions] attribute) runs Test + Pack
+/// on pushes/PRs to main. The Generate target owns codegen in-stack (NSwag's
+/// C# API — no CLI, no .nswag config, no external scripts) and is deliberately NOT in
+/// CI — run it locally via ./build.ps1 Generate. Publishing to NuGet uses
+/// trusted publishing (OIDC) via a dedicated workflow (Fallout has no built-in OIDC).
+///
+// AutoGenerate=false: the workflow was generated from this attribute, but its run
+// step is bootstrapped via `dotnet run --project build/_build.csproj` instead of the
+// `fallout` global tool (Fallout.GlobalTools isn't on nuget.org). The attribute stays
+// as the source-of-truth description of the build lane.
+[GitHubActions(
+ "build",
+ GitHubActionsImage.UbuntuLatest,
+ AutoGenerate = false,
+ FetchDepth = 0,
+ OnPushBranches = new[] { "main" },
+ OnPullRequestBranches = new[] { "main" },
+ InvokedTargets = new[] { nameof(Test), nameof(Pack) })]
+partial class Build : FalloutBuild
+{
+ public static int Main() => Execute(x => x.Pack);
+
+ static readonly string[] PackableProjects = { "TvdbClient", "TvdbClient.Models", "TvdbClient.Abstractions" };
+
+ AbsolutePath ArtifactsDirectory => RootDirectory / "artifacts";
+ AbsolutePath PackagesDirectory => ArtifactsDirectory / "packages";
+ AbsolutePath SpecsProject => RootDirectory / "tests" / "TvdbClient.Specs" / "TvdbClient.Specs.csproj";
+
+ Target Test => _ => _
+ .Description("Run the *.Specs test suite")
+ .Executes(() => DotNetTest(_ => _
+ .SetProjectFile(SpecsProject)
+ .SetConfiguration("Release")));
+
+ Target Pack => _ => _
+ .Description("Pack the three NuGet packages into artifacts/packages")
+ .DependsOn(Test)
+ .Executes(() =>
+ {
+ PackagesDirectory.CreateOrCleanDirectory();
+ foreach (var project in PackableProjects)
+ DotNetPack(_ => _
+ .SetProject(RootDirectory / "src" / project / $"{project}.csproj")
+ .SetConfiguration("Release")
+ .SetOutputDirectory(PackagesDirectory));
+ });
+
+ const string SpecUrl = "https://thetvdb.github.io/v4-api/swagger.yml";
+
+ const string ModelsNamespace = "Tvdb.Models";
+ const string ClientsNamespace = "Tvdb.Clients";
+ const string AbstractionsNamespace = "Tvdb.Abstractions";
+
+ // The generated DTOs live in the API-versioned TvdbClient.Models project;
+ // the generated clients live in the generic TvdbClient core project and
+ // import the models namespace. (Architecture enforced by NamespaceSeparationSpecs.)
+ AbsolutePath ContractsOutput => RootDirectory / "src" / "TvdbClient.Models" / "TvdbModels.cs";
+ AbsolutePath ClientsOutput => RootDirectory / "src" / "TvdbClient" / "Clients" / "TvdbClient.cs";
+
+ Target Generate => _ => _
+ .Description("Regenerate the TheTVDB v4 client from the live OpenAPI spec")
+ .Executes(async () =>
+ {
+ Log.Information("Downloading spec: {Url}", SpecUrl);
+ var document = await OpenApiYamlDocument.FromUrlAsync(SpecUrl);
+
+ var coerced = CoerceIntegerIdPathParameters(document);
+ Log.Information("Overlay: coerced {Count} id path param(s) number → int64", coerced);
+
+ var hoisted = HoistInlineParameterEnums(document);
+ Log.Information("Overlay: hoisted {Count} inline parameter enum(s) to named schemas", hoisted);
+
+ // DTOs only → Tvdb.Models (TvdbClient.Models project). No client interfaces/exception
+ // classes here — those belong with the generic client core.
+ var contracts = new CSharpClientGenerator(document,
+ CreateSettings(ModelsNamespace, dtoTypes: true, clientInterfaces: false, exceptionClasses: false))
+ .GenerateFile(ClientGeneratorOutputType.Contracts);
+
+ // Clients only → Tvdb.Clients (TvdbClient project), importing the DTOs from Tvdb.Models.
+ var clients = new CSharpClientGenerator(document,
+ CreateSettings(ClientsNamespace, dtoTypes: false, clientInterfaces: true, exceptionClasses: true,
+ additionalNamespaceUsages: new[] { ModelsNamespace, AbstractionsNamespace }))
+ .GenerateFile(ClientGeneratorOutputType.Full);
+
+ ContractsOutput.WriteAllText(contracts);
+ ClientsOutput.WriteAllText(clients);
+
+ Log.Information("Wrote {Contracts} and {Clients}", ContractsOutput, ClientsOutput);
+ });
+
+ static CSharpClientGeneratorSettings CreateSettings(
+ string @namespace, bool dtoTypes, bool clientInterfaces, bool exceptionClasses,
+ string[]? additionalNamespaceUsages = null)
+ {
+ var settings = new CSharpClientGeneratorSettings
+ {
+ ClassName = "{controller}Client",
+ ClientBaseInterface = "ITvdbClient",
+ InjectHttpClient = true,
+ DisposeHttpClient = true,
+ GenerateClientInterfaces = clientInterfaces,
+ GenerateDtoTypes = dtoTypes,
+ GenerateExceptionClasses = exceptionClasses,
+ ExceptionClass = "ApiException",
+ WrapDtoExceptions = true,
+ UseBaseUrl = false,
+ GenerateBaseUrlProperty = true,
+ GenerateSyncMethods = false,
+ GenerateOptionalParameters = true,
+ OperationNameGenerator = new MultipleClientsFromFirstTagAndPathSegmentsOperationNameGenerator(),
+ AdditionalNamespaceUsages = additionalNamespaceUsages ?? System.Array.Empty(),
+ };
+ settings.CSharpGeneratorSettings.Namespace = @namespace;
+ settings.CSharpGeneratorSettings.JsonLibrary = CSharpJsonLibrary.SystemTextJson;
+ settings.CSharpGeneratorSettings.ClassStyle = CSharpClassStyle.Poco;
+ settings.CSharpGeneratorSettings.GenerateDataAnnotations = true;
+ settings.CSharpGeneratorSettings.GenerateOptionalPropertiesAsNullable = true;
+ settings.CSharpGeneratorSettings.RequiredPropertiesMustBeDefined = true;
+ settings.CSharpGeneratorSettings.DateType = "System.DateTimeOffset";
+ settings.CSharpGeneratorSettings.DateTimeType = "System.DateTimeOffset";
+ settings.CSharpGeneratorSettings.TimeType = "System.TimeSpan";
+ settings.CSharpGeneratorSettings.TimeSpanType = "System.TimeSpan";
+ return settings;
+ }
+
+ ///
+ /// TheTVDB types integer resource ids as number, which NSwag maps to
+ /// double. Coerce the path-id parameters to integer/int64. Narrow by
+ /// design: the only other number fields are the genuinely-float
+ /// score properties, which must stay double.
+ ///
+ static int CoerceIntegerIdPathParameters(OpenApiDocument document)
+ {
+ var count = 0;
+ foreach (var pathItem in document.Paths.Values)
+ foreach (var operation in pathItem.Values)
+ foreach (var parameter in operation.Parameters
+ .Where(p => p.Kind == OpenApiParameterKind.Path))
+ {
+ var schema = parameter.Schema;
+ if (schema is { Type: JsonObjectType.Number })
+ {
+ schema.Type = JsonObjectType.Integer;
+ schema.Format = "int64";
+ count++;
+ }
+ }
+
+ return count;
+ }
+
+ ///
+ /// TheTVDB defines several query-parameter enums inline (e.g. the /updates
+ /// type/action params), which NSwag names after the raw parameter —
+ /// yielding model types like Type and Action that collide with
+ /// System.Type/System.Action. Hoist each inline enum into a named
+ /// component schema ({OperationId}{ParamName}) so it generates as a clean,
+ /// non-colliding type.
+ ///
+ static int HoistInlineParameterEnums(OpenApiDocument document)
+ {
+ var count = 0;
+ foreach (var (path, pathItem) in document.Paths)
+ foreach (var (method, operation) in pathItem)
+ foreach (var parameter in operation.Parameters)
+ {
+ var schema = parameter.Schema;
+ if (schema is null || schema.HasReference || !schema.IsEnumeration)
+ continue;
+
+ var opName = string.IsNullOrEmpty(operation.OperationId)
+ ? Pascalize(method) + Pascalize(path)
+ : Pascalize(operation.OperationId);
+ var name = opName + Pascalize(parameter.Name);
+
+ if (!document.Components.Schemas.ContainsKey(name))
+ document.Components.Schemas[name] = schema;
+
+ parameter.Schema = new NJsonSchema.JsonSchema { Reference = document.Components.Schemas[name] };
+ count++;
+ }
+
+ return count;
+ }
+
+ /// PascalCase an identifier, splitting on non-alphanumeric separators.
+ static string Pascalize(string value)
+ {
+ var parts = value.Split(new[] { '-', '_', '/', '.', '{', '}', ' ' }, System.StringSplitOptions.RemoveEmptyEntries);
+ return string.Concat(parts.Select(p => char.ToUpperInvariant(p[0]) + p.Substring(1)));
+ }
+}
diff --git a/build/Directory.Build.props b/build/Directory.Build.props
new file mode 100644
index 0000000..ad259d6
--- /dev/null
+++ b/build/Directory.Build.props
@@ -0,0 +1,5 @@
+
+
+
diff --git a/build/Directory.Build.targets b/build/Directory.Build.targets
new file mode 100644
index 0000000..5567b76
--- /dev/null
+++ b/build/Directory.Build.targets
@@ -0,0 +1,3 @@
+
+
+
diff --git a/build/_build.csproj b/build/_build.csproj
new file mode 100644
index 0000000..bd11b8e
--- /dev/null
+++ b/build/_build.csproj
@@ -0,0 +1,23 @@
+
+
+
+ Exe
+ net10.0
+ enable
+ enable
+ false
+ false
+ _build
+ $(MSBuildProjectDirectory)/..
+ CS0649;CS0169;CA1050;CS8618
+
+
+
+
+
+
+
+
+
+
+
diff --git a/global.json b/global.json
new file mode 100644
index 0000000..1e7fdfa
--- /dev/null
+++ b/global.json
@@ -0,0 +1,6 @@
+{
+ "sdk": {
+ "version": "10.0.100",
+ "rollForward": "latestMinor"
+ }
+}
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 721f1dc..5ab57fc 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -3,13 +3,17 @@
Chrison Simtian
$(CurrentYear) - $(Authors)
- https://github.com/ChrisonSimtian/TvdbApi
- https://github.com/ChrisonSimtian/TvdbApi.git
+ https://github.com/Chrison-dev/TvdbApi
+ https://github.com/Chrison-dev/TvdbApi.git
git
LICENSE
True
README.md
+
+
+
+
diff --git a/src/TvdbClient/Models/AbstractBaseRecord.cs b/src/TvdbClient.Abstractions/AbstractBaseRecord.cs
similarity index 93%
rename from src/TvdbClient/Models/AbstractBaseRecord.cs
rename to src/TvdbClient.Abstractions/AbstractBaseRecord.cs
index d2acef7..1a4c2e8 100644
--- a/src/TvdbClient/Models/AbstractBaseRecord.cs
+++ b/src/TvdbClient.Abstractions/AbstractBaseRecord.cs
@@ -1,24 +1,24 @@
-namespace Tvdb.Models;
-
-///
-/// Base Record for all TVDB Records
-///
-
-[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
-public abstract class AbstractBaseRecord
-{
- ///
- /// backing field for "/>
- ///
- private IDictionary? _additionalProperties;
-
- ///
- /// Contains additional Properties that havent been mapped yet
- ///
- [System.Text.Json.Serialization.JsonExtensionData]
- public IDictionary AdditionalProperties
- {
- get => _additionalProperties ??= new Dictionary();
- set => _additionalProperties = value;
- }
-}
+namespace Tvdb.Abstractions;
+
+///
+/// Base Record for all TVDB Records
+///
+
+[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
+public abstract class AbstractBaseRecord
+{
+ ///
+ /// backing field for "/>
+ ///
+ private IDictionary? _additionalProperties;
+
+ ///
+ /// Contains additional Properties that havent been mapped yet
+ ///
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public IDictionary AdditionalProperties
+ {
+ get => _additionalProperties ??= new Dictionary();
+ set => _additionalProperties = value;
+ }
+}
diff --git a/src/TvdbClient/Models/ApiResponseWrapper.cs b/src/TvdbClient.Abstractions/ApiResponseWrapper.cs
similarity index 95%
rename from src/TvdbClient/Models/ApiResponseWrapper.cs
rename to src/TvdbClient.Abstractions/ApiResponseWrapper.cs
index 29e3b24..5a2b5f9 100644
--- a/src/TvdbClient/Models/ApiResponseWrapper.cs
+++ b/src/TvdbClient.Abstractions/ApiResponseWrapper.cs
@@ -1,62 +1,63 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Tvdb.Models;
-
-///
-/// Wrapper for TVDB API Responses
-///
-///
-[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
-public class ApiResponseWrapper
- where TDataType : class
-{
- ///
- /// Request Status
- ///
- /// Can be success, failure
- [System.Text.Json.Serialization.JsonPropertyName("status")]
- public string Status { get; set; }
-
- ///
- /// Is Response a success?
- ///
- [System.Text.Json.Serialization.JsonIgnore]
- public bool IsSuccess => Status.Equals("success");
-
- ///
- /// Error Message in case of a Failure
- ///
- [System.Text.Json.Serialization.JsonPropertyName("message")]
- public string? ErrorMessage { get; set; }
-
- ///
- /// Contains the actual Data
- ///
- [System.Text.Json.Serialization.JsonPropertyName("data")]
- public TDataType? Data { get; set; }
-
- ///
- /// backing field for "/>
- ///
- private IDictionary? _additionalProperties;
-
- ///
- /// Contains additional Properties that havent been mapped yet
- ///
- [System.Text.Json.Serialization.JsonExtensionData]
- public IDictionary AdditionalProperties
- {
- get => _additionalProperties ??= new Dictionary();
- set => _additionalProperties = value;
- }
-
- ///
- /// O-Data Links for next, previous and current record
- ///
- [System.Text.Json.Serialization.JsonPropertyName("links")]
- public Links Links { get; set; }
-}
+using Tvdb.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tvdb.Abstractions;
+
+///
+/// Wrapper for TVDB API Responses
+///
+///
+[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
+public class ApiResponseWrapper
+ where TDataType : class
+{
+ ///
+ /// Request Status
+ ///
+ /// Can be success, failure
+ [System.Text.Json.Serialization.JsonPropertyName("status")]
+ public string Status { get; set; }
+
+ ///
+ /// Is Response a success?
+ ///
+ [System.Text.Json.Serialization.JsonIgnore]
+ public bool IsSuccess => Status.Equals("success");
+
+ ///
+ /// Error Message in case of a Failure
+ ///
+ [System.Text.Json.Serialization.JsonPropertyName("message")]
+ public string? ErrorMessage { get; set; }
+
+ ///
+ /// Contains the actual Data
+ ///
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public TDataType? Data { get; set; }
+
+ ///
+ /// backing field for "/>
+ ///
+ private IDictionary? _additionalProperties;
+
+ ///
+ /// Contains additional Properties that havent been mapped yet
+ ///
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public IDictionary AdditionalProperties
+ {
+ get => _additionalProperties ??= new Dictionary();
+ set => _additionalProperties = value;
+ }
+
+ ///
+ /// O-Data Links for next, previous and current record
+ ///
+ [System.Text.Json.Serialization.JsonPropertyName("links")]
+ public Links Links { get; set; }
+}
diff --git a/src/TvdbClient/Provider/ITokenProvider.cs b/src/TvdbClient.Abstractions/ITokenProvider.cs
similarity index 82%
rename from src/TvdbClient/Provider/ITokenProvider.cs
rename to src/TvdbClient.Abstractions/ITokenProvider.cs
index a1cb4a6..44fb6ab 100644
--- a/src/TvdbClient/Provider/ITokenProvider.cs
+++ b/src/TvdbClient.Abstractions/ITokenProvider.cs
@@ -1,25 +1,23 @@
-using Newtonsoft.Json.Linq;
-using Tvdb.Models;
-
-namespace Tvdb.Provider;
-
-///
-/// Provider for Tokens
-///
-public interface ITokenProvider
-{
- #region Properties
- ///
- /// The current
- ///
- Token Token { get; }
- #endregion
-
- #region Methods
- ///
- /// Acquire a
- ///
- ///
- public Task AcquireTokenAsync(CancellationToken cancellationToken = default);
- #endregion
+
+namespace Tvdb.Abstractions;
+
+///
+/// Provider for Tokens
+///
+public interface ITokenProvider
+{
+ #region Properties
+ ///
+ /// The current
+ ///
+ Token Token { get; }
+ #endregion
+
+ #region Methods
+ ///
+ /// Acquire a
+ ///
+ ///
+ public Task AcquireTokenAsync(CancellationToken cancellationToken = default);
+ #endregion
}
\ No newline at end of file
diff --git a/src/TvdbClient.Abstractions/ITvdbClient.cs b/src/TvdbClient.Abstractions/ITvdbClient.cs
new file mode 100644
index 0000000..cc417cf
--- /dev/null
+++ b/src/TvdbClient.Abstractions/ITvdbClient.cs
@@ -0,0 +1,9 @@
+namespace Tvdb.Abstractions;
+
+///
+/// Marker interface implemented by every generated TheTVDB client, used by the
+/// DI bootstrapper to discover and register them.
+///
+public interface ITvdbClient
+{
+}
diff --git a/src/TvdbClient/Models/LoginRequestBody.cs b/src/TvdbClient.Abstractions/LoginRequestBody.cs
similarity index 85%
rename from src/TvdbClient/Models/LoginRequestBody.cs
rename to src/TvdbClient.Abstractions/LoginRequestBody.cs
index c61c836..6e321fc 100644
--- a/src/TvdbClient/Models/LoginRequestBody.cs
+++ b/src/TvdbClient.Abstractions/LoginRequestBody.cs
@@ -1,24 +1,24 @@
-using System.ComponentModel.DataAnnotations;
-using System.Text.Json.Serialization;
-
-namespace Tvdb.Models;
-
-///
-/// Http Request for logging in and receiving a token
-///
-public class LoginRequestBody : AbstractBaseRecord
-{
- ///
- /// Api Key
- ///
- [JsonPropertyName("apikey")]
- [Required(AllowEmptyStrings = true)]
- public string Apikey { get; set; }
-
- ///
- /// Subscription Pin (optional)
- ///
- [JsonPropertyName("pin")]
- [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public string? Pin { get; set; }
+using System.ComponentModel.DataAnnotations;
+using System.Text.Json.Serialization;
+
+namespace Tvdb.Abstractions;
+
+///
+/// Http Request for logging in and receiving a token
+///
+public class LoginRequestBody : AbstractBaseRecord
+{
+ ///
+ /// Api Key
+ ///
+ [JsonPropertyName("apikey")]
+ [Required(AllowEmptyStrings = true)]
+ public string Apikey { get; set; }
+
+ ///
+ /// Subscription Pin (optional)
+ ///
+ [JsonPropertyName("pin")]
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ public string? Pin { get; set; }
}
\ No newline at end of file
diff --git a/src/TvdbClient/Models/Token.cs b/src/TvdbClient.Abstractions/Token.cs
similarity index 86%
rename from src/TvdbClient/Models/Token.cs
rename to src/TvdbClient.Abstractions/Token.cs
index 02f669b..2358f30 100644
--- a/src/TvdbClient/Models/Token.cs
+++ b/src/TvdbClient.Abstractions/Token.cs
@@ -1,40 +1,39 @@
-using Tvdb.Extensions;
-
-namespace Tvdb.Models;
-
-///
-/// Bearer Token Model
-///
-[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
-public class Token
-{
- ///
- /// Bearer Token
- ///
- [System.Text.Json.Serialization.JsonPropertyName("token")]
- public string AccessToken { get; set; }
-
- ///
- /// Timestamp of Creation
- ///
- public DateTime CreationTimestamp { get; } = DateTime.Now;
-
- ///
- /// Expiry Date
- ///
- /// TVDB says their tokens last a month
- [System.Text.Json.Serialization.JsonIgnore]
- public DateTime TokenExpiryDate => CreationTimestamp.AddMonths(1);
-
- ///
- /// Has this Token expired?
- ///
- [System.Text.Json.Serialization.JsonIgnore]
- public bool IsTokenExpired => TokenExpiryDate.IsInThePast();
-
- ///
- /// Token Type
- ///
- /// Hardcoded Bearer even though its not quite a Bearer Token but ok
- public static string TokenType => "Bearer";
+
+namespace Tvdb.Abstractions;
+
+///
+/// Bearer Token Model
+///
+[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
+public class Token
+{
+ ///
+ /// Bearer Token
+ ///
+ [System.Text.Json.Serialization.JsonPropertyName("token")]
+ public string AccessToken { get; set; }
+
+ ///
+ /// Timestamp of Creation
+ ///
+ public DateTime CreationTimestamp { get; } = DateTime.Now;
+
+ ///
+ /// Expiry Date
+ ///
+ /// TVDB says their tokens last a month
+ [System.Text.Json.Serialization.JsonIgnore]
+ public DateTime TokenExpiryDate => CreationTimestamp.AddMonths(1);
+
+ ///
+ /// Has this Token expired?
+ ///
+ [System.Text.Json.Serialization.JsonIgnore]
+ public bool IsTokenExpired => TokenExpiryDate < DateTime.Now;
+
+ ///
+ /// Token Type
+ ///
+ /// Hardcoded Bearer even though its not quite a Bearer Token but ok
+ public static string TokenType => "Bearer";
}
\ No newline at end of file
diff --git a/src/TvdbClient.Abstractions/TvdbClient.Abstractions.csproj b/src/TvdbClient.Abstractions/TvdbClient.Abstractions.csproj
new file mode 100644
index 0000000..586aca3
--- /dev/null
+++ b/src/TvdbClient.Abstractions/TvdbClient.Abstractions.csproj
@@ -0,0 +1,17 @@
+
+
+
+
+ net9.0
+ TvdbClient.Abstractions
+ TVDB Api Client — Abstractions
+ Generic contracts, configuration and response envelope for the TheTVDB v4 client.
+
+
+
+
+
+
+
diff --git a/src/TvdbClient/Configuration/TvdbConfiguration.cs b/src/TvdbClient.Abstractions/TvdbConfiguration.cs
similarity index 89%
rename from src/TvdbClient/Configuration/TvdbConfiguration.cs
rename to src/TvdbClient.Abstractions/TvdbConfiguration.cs
index 1dbcaab..71b3df4 100644
--- a/src/TvdbClient/Configuration/TvdbConfiguration.cs
+++ b/src/TvdbClient.Abstractions/TvdbConfiguration.cs
@@ -1,34 +1,34 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Tvdb.Configuration;
-
-///
-/// Configuration for the TVDB Client
-///
-public class TvdbConfiguration
-{
- ///
- /// TVDB Api Key
- ///
-
- public virtual string ApiKey { get; set; }
-
- ///
- /// Optional: TVDB Subscriber Pin
- ///
- public virtual string? Pin { get; set; }
-
- ///
- /// Base URL for the API
- ///
- public virtual string BaseUrl { get; set; }
-
- ///
- /// Url for the Token Generation
- ///
- public string TokenUrl => $"{BaseUrl}/login";
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tvdb.Abstractions;
+
+///
+/// Configuration for the TVDB Client
+///
+public class TvdbConfiguration
+{
+ ///
+ /// TVDB Api Key
+ ///
+
+ public virtual string ApiKey { get; set; }
+
+ ///
+ /// Optional: TVDB Subscriber Pin
+ ///
+ public virtual string? Pin { get; set; }
+
+ ///
+ /// Base URL for the API
+ ///
+ public virtual string BaseUrl { get; set; }
+
+ ///
+ /// Url for the Token Generation
+ ///
+ public string TokenUrl => $"{BaseUrl}/login";
}
\ No newline at end of file
diff --git a/src/TvdbClient.Models/TvdbClient.Models.csproj b/src/TvdbClient.Models/TvdbClient.Models.csproj
new file mode 100644
index 0000000..cc465e0
--- /dev/null
+++ b/src/TvdbClient.Models/TvdbClient.Models.csproj
@@ -0,0 +1,15 @@
+
+
+
+
+ net9.0
+ TvdbClient.Models
+ TVDB Api Client — Models
+ Generated data models (DTOs) for TheTVDB v4 API. Version tracks the TheTVDB API version.
+
+ $(NoWarn);CS1591;CS8618
+
+
+
diff --git a/src/TvdbClient.Models/TvdbModels.cs b/src/TvdbClient.Models/TvdbModels.cs
new file mode 100644
index 0000000..afbc461
--- /dev/null
+++ b/src/TvdbClient.Models/TvdbModels.cs
@@ -0,0 +1,4764 @@
+//----------------------
+//
+// Generated using the NSwag toolchain v14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0)) (http://NSwag.org)
+//
+//----------------------
+
+#pragma warning disable 108 // Disable "CS0108 '{derivedDto}.ToJson()' hides inherited member '{dtoBase}.ToJson()'. Use the new keyword if hiding was intended."
+#pragma warning disable 114 // Disable "CS0114 '{derivedDto}.RaisePropertyChanged(String)' hides inherited member 'dtoBase.RaisePropertyChanged(String)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword."
+#pragma warning disable 472 // Disable "CS0472 The result of the expression is always 'false' since a value of type 'Int32' is never equal to 'null' of type 'Int32?'
+#pragma warning disable 612 // Disable "CS0612 '...' is obsolete"
+#pragma warning disable 649 // Disable "CS0649 Field is never assigned to, and will always have its default value null"
+#pragma warning disable 1573 // Disable "CS1573 Parameter '...' has no matching param tag in the XML comment for ...
+#pragma warning disable 1591 // Disable "CS1591 Missing XML comment for publicly visible type or member ..."
+#pragma warning disable 8073 // Disable "CS8073 The result of the expression is always 'false' since a value of type 'T' is never equal to 'null' of type 'T?'"
+#pragma warning disable 3016 // Disable "CS3016 Arrays as attribute arguments is not CLS-compliant"
+#pragma warning disable 8603 // Disable "CS8603 Possible null reference return"
+#pragma warning disable 8604 // Disable "CS8604 Possible null reference argument for parameter"
+#pragma warning disable 8625 // Disable "CS8625 Cannot convert null literal to non-nullable reference type"
+#pragma warning disable 8765 // Disable "CS8765 Nullability of type of parameter doesn't match overridden member (possibly because of nullability attributes)."
+
+namespace Tvdb.Models
+{
+ using System = global::System;
+
+
+
+ ///
+ /// An alias model, which can be associated with a series, season, movie, person, or list.
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class Alias
+ {
+ ///
+ /// A 3-4 character string indicating the language of the alias, as defined in Language.
+ ///
+
+ [System.Text.Json.Serialization.JsonPropertyName("language")]
+ public string Language { get; set; }
+
+ ///
+ /// A string containing the alias itself.
+ ///
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// base artwork record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class ArtworkBaseRecord
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("height")]
+ public long? Height { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public int? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("image")]
+ public string Image { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("includesText")]
+ public bool? IncludesText { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("language")]
+ public string Language { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("score")]
+ public double? Score { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("thumbnail")]
+ public string Thumbnail { get; set; }
+
+ ///
+ /// The artwork type corresponds to the ids from the /artwork/types endpoint.
+ ///
+
+ [System.Text.Json.Serialization.JsonPropertyName("type")]
+ public long? Type { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("width")]
+ public long? Width { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// extended artwork record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class ArtworkExtendedRecord
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("episodeId")]
+ public int? EpisodeId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("height")]
+ public long? Height { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("image")]
+ public string Image { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("includesText")]
+ public bool? IncludesText { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("language")]
+ public string Language { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("movieId")]
+ public int? MovieId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("networkId")]
+ public int? NetworkId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("peopleId")]
+ public int? PeopleId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("score")]
+ public double? Score { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("seasonId")]
+ public int? SeasonId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("seriesId")]
+ public int? SeriesId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("seriesPeopleId")]
+ public int? SeriesPeopleId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("status")]
+ public ArtworkStatus Status { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("tagOptions")]
+ public System.Collections.Generic.ICollection TagOptions { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("thumbnail")]
+ public string Thumbnail { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("thumbnailHeight")]
+ public long? ThumbnailHeight { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("thumbnailWidth")]
+ public long? ThumbnailWidth { get; set; }
+
+ ///
+ /// The artwork type corresponds to the ids from the /artwork/types endpoint.
+ ///
+
+ [System.Text.Json.Serialization.JsonPropertyName("type")]
+ public long? Type { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("updatedAt")]
+ public long? UpdatedAt { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("width")]
+ public long? Width { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// artwork status record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class ArtworkStatus
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// artwork type record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class ArtworkType
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("height")]
+ public long? Height { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("imageFormat")]
+ public string ImageFormat { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("recordType")]
+ public string RecordType { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("slug")]
+ public string Slug { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("thumbHeight")]
+ public long? ThumbHeight { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("thumbWidth")]
+ public long? ThumbWidth { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("width")]
+ public long? Width { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// base award record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class AwardBaseRecord
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public int? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// base award category record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class AwardCategoryBaseRecord
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("allowCoNominees")]
+ public bool? AllowCoNominees { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("award")]
+ public AwardBaseRecord Award { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("forMovies")]
+ public bool? ForMovies { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("forSeries")]
+ public bool? ForSeries { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// extended award category record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class AwardCategoryExtendedRecord
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("allowCoNominees")]
+ public bool? AllowCoNominees { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("award")]
+ public AwardBaseRecord Award { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("forMovies")]
+ public bool? ForMovies { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("forSeries")]
+ public bool? ForSeries { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("nominees")]
+ public System.Collections.Generic.ICollection Nominees { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// extended award record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class AwardExtendedRecord
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("categories")]
+ public System.Collections.Generic.ICollection Categories { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public int? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("score")]
+ public long? Score { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// base award nominee record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class AwardNomineeBaseRecord
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("character")]
+ public Character Character { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("details")]
+ public string Details { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("episode")]
+ public EpisodeBaseRecord Episode { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("isWinner")]
+ public bool? IsWinner { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("movie")]
+ public MovieBaseRecord Movie { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("series")]
+ public SeriesBaseRecord Series { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("year")]
+ public string Year { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("category")]
+ public string Category { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// biography record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class Biography
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("biography")]
+ public string Biography1 { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("language")]
+ public string Language { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// character record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class Character
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("aliases")]
+ public System.Collections.Generic.ICollection Aliases { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("episode")]
+ public RecordInfo Episode { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("episodeId")]
+ public int? EpisodeId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("image")]
+ public string Image { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("isFeatured")]
+ public bool? IsFeatured { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("movieId")]
+ public int? MovieId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("movie")]
+ public RecordInfo Movie { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("nameTranslations")]
+ public System.Collections.Generic.ICollection NameTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("overviewTranslations")]
+ public System.Collections.Generic.ICollection OverviewTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("peopleId")]
+ public int? PeopleId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("personImgURL")]
+ public string PersonImgURL { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("peopleType")]
+ public string PeopleType { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("seriesId")]
+ public int? SeriesId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("series")]
+ public RecordInfo Series { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("sort")]
+ public long? Sort { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("tagOptions")]
+ public System.Collections.Generic.ICollection TagOptions { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("type")]
+ public long? Type { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("url")]
+ public string Url { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("personName")]
+ public string PersonName { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// A company record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class Company
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("activeDate")]
+ public string ActiveDate { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("aliases")]
+ public System.Collections.Generic.ICollection Aliases { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("country")]
+ public string Country { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("inactiveDate")]
+ public string InactiveDate { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("nameTranslations")]
+ public System.Collections.Generic.ICollection NameTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("overviewTranslations")]
+ public System.Collections.Generic.ICollection OverviewTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("primaryCompanyType")]
+ public long? PrimaryCompanyType { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("slug")]
+ public string Slug { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("parentCompany")]
+ public ParentCompany ParentCompany { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("tagOptions")]
+ public System.Collections.Generic.ICollection TagOptions { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// A parent company record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class ParentCompany
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public int? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("relation")]
+ public CompanyRelationShip Relation { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// A company relationship
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class CompanyRelationShip
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public int? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("typeName")]
+ public string TypeName { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// A company type record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class CompanyType
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("companyTypeId")]
+ public int? CompanyTypeId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("companyTypeName")]
+ public string CompanyTypeName { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// content rating record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class ContentRating
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("description")]
+ public string Description { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("country")]
+ public string Country { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("contentType")]
+ public string ContentType { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("order")]
+ public int? Order { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("fullName")]
+ public string FullName { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// country record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class Country
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public string Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("shortCode")]
+ public string ShortCode { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// Entity record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class Entity
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("movieId")]
+ public int? MovieId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("order")]
+ public long? Order { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("seriesId")]
+ public int? SeriesId { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// Entity Type record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class EntityType
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public int? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("hasSpecials")]
+ public bool? HasSpecials { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// entity update record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class EntityUpdate
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("entityType")]
+ public string EntityType { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("methodInt")]
+ public int? MethodInt { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("method")]
+ public string Method { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("extraInfo")]
+ public string ExtraInfo { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("userId")]
+ public int? UserId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("recordType")]
+ public string RecordType { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("recordId")]
+ public long? RecordId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("timeStamp")]
+ public long? TimeStamp { get; set; }
+
+ ///
+ /// Only present for episodes records
+ ///
+
+ [System.Text.Json.Serialization.JsonPropertyName("seriesId")]
+ public long? SeriesId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("mergeToId")]
+ public long? MergeToId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("mergeToEntityType")]
+ public string MergeToEntityType { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// base episode record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class EpisodeBaseRecord
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("absoluteNumber")]
+ public int? AbsoluteNumber { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("aired")]
+ public string Aired { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("airsAfterSeason")]
+ public int? AirsAfterSeason { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("airsBeforeEpisode")]
+ public int? AirsBeforeEpisode { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("airsBeforeSeason")]
+ public int? AirsBeforeSeason { get; set; }
+
+ ///
+ /// season, midseason, or series
+ ///
+
+ [System.Text.Json.Serialization.JsonPropertyName("finaleType")]
+ public string FinaleType { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("image")]
+ public string Image { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("imageType")]
+ public int? ImageType { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("isMovie")]
+ public long? IsMovie { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("lastUpdated")]
+ public string LastUpdated { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("linkedMovie")]
+ public int? LinkedMovie { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("nameTranslations")]
+ public System.Collections.Generic.ICollection NameTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("number")]
+ public int? Number { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("overview")]
+ public string Overview { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("overviewTranslations")]
+ public System.Collections.Generic.ICollection OverviewTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("runtime")]
+ public int? Runtime { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("seasonNumber")]
+ public int? SeasonNumber { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("seasons")]
+ public System.Collections.Generic.ICollection Seasons { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("seriesId")]
+ public long? SeriesId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("seasonName")]
+ public string SeasonName { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("year")]
+ public string Year { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// extended episode record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class EpisodeExtendedRecord
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("aired")]
+ public string Aired { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("airsAfterSeason")]
+ public int? AirsAfterSeason { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("airsBeforeEpisode")]
+ public int? AirsBeforeEpisode { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("airsBeforeSeason")]
+ public int? AirsBeforeSeason { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("awards")]
+ public System.Collections.Generic.ICollection Awards { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("characters")]
+ public System.Collections.Generic.ICollection Characters { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("companies")]
+ public System.Collections.Generic.ICollection Companies { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("contentRatings")]
+ public System.Collections.Generic.ICollection ContentRatings { get; set; }
+
+ ///
+ /// season, midseason, or series
+ ///
+
+ [System.Text.Json.Serialization.JsonPropertyName("finaleType")]
+ public string FinaleType { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("image")]
+ public string Image { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("imageType")]
+ public int? ImageType { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("isMovie")]
+ public long? IsMovie { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("lastUpdated")]
+ public string LastUpdated { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("linkedMovie")]
+ public int? LinkedMovie { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("nameTranslations")]
+ public System.Collections.Generic.ICollection NameTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("networks")]
+ public System.Collections.Generic.ICollection Networks { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("nominations")]
+ public System.Collections.Generic.ICollection Nominations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("number")]
+ public int? Number { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("overview")]
+ public string Overview { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("overviewTranslations")]
+ public System.Collections.Generic.ICollection OverviewTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("productionCode")]
+ public string ProductionCode { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("remoteIds")]
+ public System.Collections.Generic.ICollection RemoteIds { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("runtime")]
+ public int? Runtime { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("seasonNumber")]
+ public int? SeasonNumber { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("seasons")]
+ public System.Collections.Generic.ICollection Seasons { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("seriesId")]
+ public long? SeriesId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("studios")]
+ public System.Collections.Generic.ICollection Studios { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("tagOptions")]
+ public System.Collections.Generic.ICollection TagOptions { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("trailers")]
+ public System.Collections.Generic.ICollection Trailers { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("translations")]
+ public TranslationExtended Translations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("year")]
+ public string Year { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// User favorites record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class Favorites
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("series")]
+ public System.Collections.Generic.ICollection Series { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("movies")]
+ public System.Collections.Generic.ICollection Movies { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("episodes")]
+ public System.Collections.Generic.ICollection Episodes { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("artwork")]
+ public System.Collections.Generic.ICollection Artwork { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("people")]
+ public System.Collections.Generic.ICollection People { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("lists")]
+ public System.Collections.Generic.ICollection Lists { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// Favorites record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class FavoriteRecord
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("series")]
+ public int? Series { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("movie")]
+ public int? Movie { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("episode")]
+ public int? Episode { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("artwork")]
+ public int? Artwork { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("people")]
+ public int? People { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("list")]
+ public int? List { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// gender record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class Gender
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// base genre record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class GenreBaseRecord
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("slug")]
+ public string Slug { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// language record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class Language
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public string Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("nativeName")]
+ public string NativeName { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("shortCode")]
+ public string ShortCode { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// base list record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class ListBaseRecord
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("aliases")]
+ public System.Collections.Generic.ICollection Aliases { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("image")]
+ public string Image { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("imageIsFallback")]
+ public bool? ImageIsFallback { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("isOfficial")]
+ public bool? IsOfficial { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("nameTranslations")]
+ public System.Collections.Generic.ICollection NameTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("overview")]
+ public string Overview { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("overviewTranslations")]
+ public System.Collections.Generic.ICollection OverviewTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("remoteIds")]
+ public System.Collections.Generic.ICollection RemoteIds { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("tags")]
+ public System.Collections.Generic.ICollection Tags { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("score")]
+ public int? Score { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("url")]
+ public string Url { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// extended list record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class ListExtendedRecord
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("aliases")]
+ public System.Collections.Generic.ICollection Aliases { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("entities")]
+ public System.Collections.Generic.ICollection Entities { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("image")]
+ public string Image { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("imageIsFallback")]
+ public bool? ImageIsFallback { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("isOfficial")]
+ public bool? IsOfficial { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("nameTranslations")]
+ public System.Collections.Generic.ICollection NameTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("overview")]
+ public string Overview { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("overviewTranslations")]
+ public System.Collections.Generic.ICollection OverviewTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("score")]
+ public long? Score { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("url")]
+ public string Url { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// base movie record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class MovieBaseRecord
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("aliases")]
+ public System.Collections.Generic.ICollection Aliases { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("image")]
+ public string Image { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("lastUpdated")]
+ public string LastUpdated { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("nameTranslations")]
+ public System.Collections.Generic.ICollection NameTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("overviewTranslations")]
+ public System.Collections.Generic.ICollection OverviewTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("score")]
+ public double? Score { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("slug")]
+ public string Slug { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("status")]
+ public Status Status { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("runtime")]
+ public int? Runtime { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("year")]
+ public string Year { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// extended movie record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class MovieExtendedRecord
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("aliases")]
+ public System.Collections.Generic.ICollection Aliases { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("artworks")]
+ public System.Collections.Generic.ICollection Artworks { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("audioLanguages")]
+ public System.Collections.Generic.ICollection AudioLanguages { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("awards")]
+ public System.Collections.Generic.ICollection Awards { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("boxOffice")]
+ public string BoxOffice { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("boxOfficeUS")]
+ public string BoxOfficeUS { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("budget")]
+ public string Budget { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("characters")]
+ public System.Collections.Generic.ICollection Characters { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("companies")]
+ public Companies Companies { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("contentRatings")]
+ public System.Collections.Generic.ICollection ContentRatings { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("first_release")]
+ public Release First_release { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("genres")]
+ public System.Collections.Generic.ICollection Genres { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("image")]
+ public string Image { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("inspirations")]
+ public System.Collections.Generic.ICollection Inspirations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("lastUpdated")]
+ public string LastUpdated { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("lists")]
+ public System.Collections.Generic.ICollection Lists { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("nameTranslations")]
+ public System.Collections.Generic.ICollection NameTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("originalCountry")]
+ public string OriginalCountry { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("originalLanguage")]
+ public string OriginalLanguage { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("overviewTranslations")]
+ public System.Collections.Generic.ICollection OverviewTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("production_countries")]
+ public System.Collections.Generic.ICollection Production_countries { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("releases")]
+ public System.Collections.Generic.ICollection Releases { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("remoteIds")]
+ public System.Collections.Generic.ICollection RemoteIds { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("runtime")]
+ public int? Runtime { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("score")]
+ public double? Score { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("slug")]
+ public string Slug { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("spoken_languages")]
+ public System.Collections.Generic.ICollection Spoken_languages { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("status")]
+ public Status Status { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("studios")]
+ public System.Collections.Generic.ICollection Studios { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("subtitleLanguages")]
+ public System.Collections.Generic.ICollection SubtitleLanguages { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("tagOptions")]
+ public System.Collections.Generic.ICollection TagOptions { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("trailers")]
+ public System.Collections.Generic.ICollection Trailers { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("translations")]
+ public TranslationExtended Translations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("year")]
+ public string Year { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// base people record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class PeopleBaseRecord
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("aliases")]
+ public System.Collections.Generic.ICollection Aliases { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("image")]
+ public string Image { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("lastUpdated")]
+ public string LastUpdated { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("nameTranslations")]
+ public System.Collections.Generic.ICollection NameTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("overviewTranslations")]
+ public System.Collections.Generic.ICollection OverviewTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("score")]
+ public long? Score { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// extended people record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class PeopleExtendedRecord
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("aliases")]
+ public System.Collections.Generic.ICollection Aliases { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("awards")]
+ public System.Collections.Generic.ICollection Awards { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("biographies")]
+ public System.Collections.Generic.ICollection Biographies { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("birth")]
+ public string Birth { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("birthPlace")]
+ public string BirthPlace { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("characters")]
+ public System.Collections.Generic.ICollection Characters { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("death")]
+ public string Death { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("gender")]
+ public int? Gender { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("image")]
+ public string Image { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("lastUpdated")]
+ public string LastUpdated { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("nameTranslations")]
+ public System.Collections.Generic.ICollection NameTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("overviewTranslations")]
+ public System.Collections.Generic.ICollection OverviewTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("races")]
+ public System.Collections.Generic.ICollection Races { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("remoteIds")]
+ public System.Collections.Generic.ICollection RemoteIds { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("score")]
+ public long? Score { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("slug")]
+ public string Slug { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("tagOptions")]
+ public System.Collections.Generic.ICollection TagOptions { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("translations")]
+ public TranslationExtended Translations { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// people type record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class PeopleType
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// race record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class Race
+ {
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// base record info
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class RecordInfo
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("image")]
+ public string Image { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("year")]
+ public string Year { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// release record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class Release
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("country")]
+ public string Country { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("date")]
+ public string Date { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("detail")]
+ public string Detail { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// remote id record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class RemoteID
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public string Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("type")]
+ public long? Type { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("sourceName")]
+ public string SourceName { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// search result
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class SearchResult
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("aliases")]
+ public System.Collections.Generic.ICollection Aliases { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("companies")]
+ public System.Collections.Generic.ICollection Companies { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("companyType")]
+ public string CompanyType { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("country")]
+ public string Country { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("director")]
+ public string Director { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("first_air_time")]
+ public string First_air_time { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("genres")]
+ public System.Collections.Generic.ICollection Genres { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public string Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("image_url")]
+ public string Image_url { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("is_official")]
+ public bool? Is_official { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name_translated")]
+ public string Name_translated { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("network")]
+ public string Network { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("objectID")]
+ public string ObjectID { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("officialList")]
+ public string OfficialList { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("overview")]
+ public string Overview { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("overviews")]
+ public TranslationSimple Overviews { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("overview_translated")]
+ public System.Collections.Generic.ICollection Overview_translated { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("poster")]
+ public string Poster { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("posters")]
+ public System.Collections.Generic.ICollection Posters { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("primary_language")]
+ public string Primary_language { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("remote_ids")]
+ public System.Collections.Generic.ICollection Remote_ids { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("status")]
+ public string Status { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("slug")]
+ public string Slug { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("studios")]
+ public System.Collections.Generic.ICollection Studios { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("title")]
+ public string Title { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("thumbnail")]
+ public string Thumbnail { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("translations")]
+ public TranslationSimple Translations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("translationsWithLang")]
+ public System.Collections.Generic.ICollection TranslationsWithLang { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("tvdb_id")]
+ public string Tvdb_id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("type")]
+ public string Type { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("year")]
+ public string Year { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// search by remote reuslt is a base record for a movie, series, people, season or company search result
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class SearchByRemoteIdResult
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("series")]
+ public SeriesBaseRecord Series { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("people")]
+ public PeopleBaseRecord People { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("movie")]
+ public MovieBaseRecord Movie { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("episode")]
+ public EpisodeBaseRecord Episode { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("company")]
+ public Company Company { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// season genre record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class SeasonBaseRecord
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public int? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("image")]
+ public string Image { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("imageType")]
+ public int? ImageType { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("lastUpdated")]
+ public string LastUpdated { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("nameTranslations")]
+ public System.Collections.Generic.ICollection NameTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("number")]
+ public long? Number { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("overviewTranslations")]
+ public System.Collections.Generic.ICollection OverviewTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("companies")]
+ public Companies Companies { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("seriesId")]
+ public long? SeriesId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("type")]
+ public SeasonType Type { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("year")]
+ public string Year { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// extended season record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class SeasonExtendedRecord
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("artwork")]
+ public System.Collections.Generic.ICollection Artwork { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("companies")]
+ public Companies Companies { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("episodes")]
+ public System.Collections.Generic.ICollection Episodes { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public int? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("image")]
+ public string Image { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("imageType")]
+ public int? ImageType { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("lastUpdated")]
+ public string LastUpdated { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("nameTranslations")]
+ public System.Collections.Generic.ICollection NameTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("number")]
+ public long? Number { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("overviewTranslations")]
+ public System.Collections.Generic.ICollection OverviewTranslations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("seriesId")]
+ public long? SeriesId { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("trailers")]
+ public System.Collections.Generic.ICollection Trailers { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("type")]
+ public SeasonType Type { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("tagOptions")]
+ public System.Collections.Generic.ICollection TagOptions { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("translations")]
+ public System.Collections.Generic.ICollection Translations { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("year")]
+ public string Year { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// season type record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class SeasonType
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("alternateName")]
+ public string AlternateName { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public long? Id { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("type")]
+ public string Type { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///
+ /// A series airs day record
+ ///
+ [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.2.0.0 (NJsonSchema v11.1.0.0 (Newtonsoft.Json v13.0.0.0))")]
+ public partial class SeriesAirsDays
+ {
+
+ [System.Text.Json.Serialization.JsonPropertyName("friday")]
+ public bool? Friday { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("monday")]
+ public bool? Monday { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("saturday")]
+ public bool? Saturday { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("sunday")]
+ public bool? Sunday { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("thursday")]
+ public bool? Thursday { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("tuesday")]
+ public bool? Tuesday { get; set; }
+
+ [System.Text.Json.Serialization.JsonPropertyName("wednesday")]
+ public bool? Wednesday { get; set; }
+
+ private System.Collections.Generic.IDictionary _additionalProperties;
+
+ [System.Text.Json.Serialization.JsonExtensionData]
+ public System.Collections.Generic.IDictionary AdditionalProperties
+ {
+ get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
+ set { _additionalProperties = value; }
+ }
+
+ }
+
+ ///