Code Monkey home page Code Monkey logo

jellyfin-plugin-tvdb's Introduction

Jellyfin TheTVDB Plugin

Part of the Jellyfin Project

Plugin Banner

GitHub Workflow Status GPLv3 License Current Release

About

This plugin adds the metadata provider for TVDB.

Installation

See the official documentation for install instructions.

Build

  1. To build this plugin you will need .Net 8.x.

  2. Build plugin with following command

dotnet publish --configuration Release --output bin
  1. Place the dll-file in the plugins/tvdb folder (you might need to create the folders) of your JF install

Releasing

To release the plugin we recommend JPRM that will build and package the plugin. For additional context and for how to add the packaged plugin zip to a plugin manifest see the JPRM documentation for more info.

Contributing

We welcome all contributions and pull requests! If you have a larger feature in mind please open an issue so we can discuss the implementation before you start. In general refer to our contributing guidelines for further information.

Licence

This plugins code and packages are distributed under the GPLv3 License. See LICENSE for more information.

jellyfin-plugin-tvdb's People

Contributors

bobsilent avatar crobibero avatar cvium avatar dependabot[bot] avatar h1dden-da3m0n avatar hayajiro avatar idisposable avatar jellyfin-bot avatar jpvenson avatar larvitar avatar methbkts avatar oddstr13 avatar renovate[bot] avatar rlauuzo avatar scampower3 avatar shadowghost avatar spacetech avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

jellyfin-plugin-tvdb's Issues

The given series ID does not exist; No results for your query: map[DVD_episodenumber:14 DVD_season:2]

Describe the bug
Specifically trying to scan "The Melancholy of Haruhi Suzumiya" (tvdbid 79414) in DVD order does not work and produces the mentioned error.

System (please complete the following information):

  • OS: Ubuntu
  • Virtualization: Docker
  • Clients: Browser
  • Browser: Chrome 87
  • Jellyfin Version: 10.6.4
  • Installed Plugins: Anime, Trakt

To Reproduce
Not sure if empty files work with jellyfin but these commands would replicated the correct folder/file structure on
a linux system

mkdir -p "The Melancholy of Haruhi Suzumiya (2006)/Season 1"
mkdir -p "The Melancholy of Haruhi Suzumiya (2006)/Season 2"

touch "The Melancholy of Haruhi Suzumiya (2006)/Season 1/The Melancholy of Haruhi Suzumiya (2006) S01E"{01..14}".mkv"
touch "The Melancholy of Haruhi Suzumiya (2006)/Season 2/The Melancholy of Haruhi Suzumiya (2006) S02E"{02..14}".mkv"

After that, simply scan it to the library.
At this point Aired Order is what is used and therefore "Season 2" is not properly scanned.
On the Series itself:

  • Edit Metadata
  • Change "Display order" to "DvD"
  • Refresh Metadata
    • Replace all metadata
    • Replace existing images
  • The error below occurs

Expected behavior

Logs
Attached because to big for pastebin :)
jellyfin.log

TheTVDB metadata agent ignores the "All languages" option when editing images

When editing images of an item, you can choose whether you want to see only images of your own language or from all the languages:

image

That option works perfectly for TMDB, but not for TVDB.

Steps to reproduce

  • Go to a TV Show based item (Show, Season, Episo, etc) and go to the "Edit image" option. Check if there are images available online from TMDB by choosing it in the "Source" dropdown.
  • Change the library that contains that item to Spanish and Spain (but any language works).
  • Go back to the same item.
  • Choose TVDB as your provider and check "All Languages". No results will appear (or if something appears, it's only in your language)

Expected behaviour

"All languages" checkbox should return posters and imagesa in other languages from TVDB.

Additional details

Tested in Jellyfin 10.5.3. Although this is not strictly related, it's very close to #7, as I also noticed that, pre-10.5.0, TVDb metadata provider doesn't fallback to English when no poster is found in Spanish.

The checkbox works perfectly for TMDB, so it seems specific to TVDB

failed to identify a particular show id

before found out about issue #16, I was redoing my whole collections. now, after doing manual identify on everything, 1 show (an old obscure anime) still failed to be identified correctly.

even when i manually input tvdb id (79471)

log excerpt:

[2020-12-28 17:29:45.433 +07:00] [INF] [61] Jellyfin.Api.Controllers.ItemLookupController: Setting provider id's to item 1809aa93-019a-ab35-611f-f4335e255c72-"Salaryman Kintaro (1999)": "{\"Tvdb\":
\"79471\"}"
[2020-12-28 17:29:45.642 +07:00] [ERR] [140] Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesProvider: Failed to retrieve actors for series "79471"
TvDbSharper.TvDbServerException: The given series ID does not exist; not found
   at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)
   at TvDbSharper.Clients.SeriesClient.GetActorsAsync(Int32 seriesId, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func`2 factory)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesProvider.FetchSeriesMetadata(MetadataResult`1 result, String metadataLanguage, Dictionary`2 seriesProviderIds, CancellationToken cancellationToken)
[2020-12-28 17:29:46.877 +07:00] [ERR] [219] Jellyfin.Plugin.Tvdb.Providers.TvdbEpisodeProvider: Failed to retrieve episode with id null, series id "131011"
TvDbSharper.TvDbServerException: The given series ID does not exist; No results for your query: map[AiredSeason:1 EpisodeNumber:12]
   at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)
   at TvDbSharper.Clients.SeriesClient.GetEpisodesAsync(Int32 seriesId, Int32 page, EpisodeQuery query, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func`2 factory)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetEpisodeTvdbId(Int32 seriesTvdbId, EpisodeQuery episodeQuery, String language, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbEpisodeProvider.GetEpisode(EpisodeInfo searchInfo, CancellationToken cancellationToken)

On first line, it shows the correct id (79471) but not the correct title.
On third line, it switches to wrong id (131011).

last result: jellyfin uses 131011 metadata instead.

Exceptions with the wrong IDs

I did a full library rescan with this plugin, and I'm seeing weird exceptions where it looks like it's querying with the wrong IDs:

TvDbSharper.TvDbServerException: No records are found that match your query; Resource not found
   at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)
   at TvDbSharper.Clients.SearchClient.SearchSeriesAsync(String value, String parameterKey, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func`2 factory)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesProvider.GetSeriesByRemoteId(String id, String idType, String language, CancellationToken cancellationToken)
[17:01:50] [ERR] [74] Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesProvider: Failed to retrieve series with remote id tt13780080
TvDbSharper.TvDbServerException: No records are found that match your query; Resource not found
   at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)
   at TvDbSharper.Clients.SearchClient.SearchSeriesAsync(String value, String parameterKey, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func`2 factory)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesProvider.GetSeriesByRemoteId(String id, String idType, String language, CancellationToken cancellationToken)
[17:01:50] [ERR] [10] Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesProvider: Failed to retrieve series with remote id EP01216702
TvDbSharper.TvDbServerException: No records are found that match your query; Resource not found
   at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)
   at TvDbSharper.Clients.SearchClient.SearchSeriesAsync(String value, String parameterKey, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func`2 factory)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesProvider.GetSeriesByRemoteId(String id, String idType, String language, CancellationToken cancellationToken)
[17:01:50] [ERR] [74] Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesProvider: Failed to retrieve series with id null
TvDbSharper.TvDbServerException: The given series ID does not exist; ID: 0 not found
   at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)
   at TvDbSharper.Clients.SeriesClient.GetAsync(Int32 seriesId, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func`2 factory)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesProvider.FetchSeriesMetadata(MetadataResult`1 result, String metadataLanguage, Dictionary`2 seriesProviderIds, CancellationToken cancellationToken)
[17:01:50] [ERR] [61] Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesProvider: Failed to retrieve series with id null
TvDbSharper.TvDbServerException: The given series ID does not exist; ID: 0 not found
   at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)
   at TvDbSharper.Clients.SeriesClient.GetAsync(Int32 seriesId, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func`2 factory)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesProvider.FetchSeriesMetadata(MetadataResult`1 result, String metadataLanguage, Dictionary`2 seriesProviderIds, CancellationToken cancellationToken)

One of those is clearly an IMDB ID. I don't know what EP01216702 is. And it also tried to use an ID of null. Is there a race condition perhaps where it is occasionally trying to use the wrong ID?

Creating and improperly handling skipped season numbers.

A good example of this is Beavis & Butthead where TheTVDB has skipped Season 8 (as MTV skipped Season 8 in their marketing).

  1. It should not keep recreating the absent Season 8 which does not exist in TheTVDB. It is not missing and should not be in Jellyfin.
  2. It should further not throw a giant unhelpful warning which doesn't explicitly state which series is even being queried for Season 8.

I keep getting a "missing" season 8 created each time. There is no Season 8 for the plugin to keep creating.

Jellyfin TVDB Missing plugin produces the following error.

[2022-05-26 13:59:36.118 -04:00] [INF] [63] Jellyfin.Plugin.Tvdb.Providers.TvdbMissingEpisodeProvider: Creating Season "Season 8" entry for "Beavis and Butt-Head"
[2022-05-26 13:59:36.414 -04:00] [WRN] [48] Jellyfin.Plugin.Tvdb.Providers.TvdbMissingEpisodeProvider: Unable to get episodes from TVDB
TvDbSharper.TvDbServerException: The given series ID does not exist; No results for your query: map[AiredSeason:8]
   at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)
   at TvDbSharper.Clients.SeriesClient.GetEpisodesAsync(Int32 seriesId, Int32 page, EpisodeQuery query, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func`2 factory)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbMissingEpisodeProvider.GetAllEpisodes(Int32 tvdbId, String acceptedLanguage, EpisodeQuery episodeQuery)

Cast & Crew using "role-specific images" instead of actor images

TVDB has "role-specific images" for each show (if they where added). This causes the cast and crew for a show to have the wrong images if the role-specific images were downloaded from another show. This especially affects if the cast and crew images were downloaded for an animated show.

some solutions:
1 - if possible, fetch the "Persons" ID from a Series to download the image of the actor, not the image of the actor from the series
2 - the ability to disable TVDB for actor images or prioritize a different fetcher
3 - when TVDB is used make every show have there own actor images instead of the actor images being global

"Identify" doesn't correct incorrectly scraped series

Issue: Misidentified show (Narrative telephone) can't be changed to correct show (Critical Role)

Setup: Jellyfin 10.7.2, traefik reverse proxy, tvdb plugin latest version, subscriber legacy api key entered

Logs when "identify" run:

[2021-04-11 08:21:41.333 +10:00] [WRN] Slow HTTP Response from "https://jellyfin.$DOMAINNAME.com/Items/RemoteSearch/Series" to "122.199.45.222" in 0:00:01.1156667 with Status Code 200
[2021-04-11 08:21:44.020 +10:00] [INF] Setting provider id's to item e9ac49d3-2dfa-8460-bff6-ab9cc636dbd1-"Narrative Telephone": "{\"Tvdb\":\"296861\"}"
[2021-04-11 08:21:48.005 +10:00] [ERR] Failed to retrieve episode with id null, series id "390572"
TvDbSharper.TvDbServerException: The given series ID does not exist; No results for your query: map[AiredSeason:2 EpisodeNumber:67]
   at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)
   at TvDbSharper.Clients.SeriesClient.GetEpisodesAsync(Int32 seriesId, Int32 page, EpisodeQuery query, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func`2 factory)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetEpisodeTvdbId(Int32 seriesTvdbId, EpisodeQuery episodeQuery, String language, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbEpisodeProvider.GetEpisode(EpisodeInfo searchInfo, CancellationToken cancellationToken)
[2021-04-11 08:21:48.062 +10:00] [ERR] Failed to retrieve episode images for series "390572"
TvDbSharper.TvDbServerException: The given series ID does not exist; No results for your query: map[AiredSeason:2 EpisodeNumber:67]
   at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)
   at TvDbSharper.Clients.SeriesClient.GetEpisodesAsync(Int32 seriesId, Int32 page, EpisodeQuery query, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func`2 factory)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetEpisodeTvdbId(Int32 seriesTvdbId, EpisodeQuery episodeQuery, String language, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbEpisodeImageProvider.GetImages(BaseItem item, CancellationToken cancellationToken)
[2021-04-11 08:21:49.115 +10:00] [ERR] Failed to retrieve episode with id null, series id "390572"
TvDbSharper.TvDbServerException: The given series ID does not exist; No results for your query: map[AiredSeason:2 EpisodeNumber:68]
   at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)
   at TvDbSharper.Clients.SeriesClient.GetEpisodesAsync(Int32 seriesId, Int32 page, EpisodeQuery query, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext()
--- End of stack trace from previous location ---

Screenshot of "identify" hanging (UI stays like this for >10 min):
Screenshot from 2021-04-15 11-47-33

Additional information:

[Question] Where is the missing episode/season stored or is there an api to get all missing episodes?

I want to setup a info page with missing episodes on my nas. Not in jellyfin, but in a interface that shows all my services. It would be good to know where the data is stored, so i could write my own tool. An api would great too, but the usecase is quite specific. This could be considered a feature suggestion into the ui of jellyfin, so that there is a singe page that shows all missing episodes, but i am not familiar enough with c# to implement it and extend front/backend. So my question is where do i find the missing info files?

Allow using alternate order

I believe the plugin doesn't allow using alternate episode orders, which would be great
And example of a series with alternative order is La casa de papel.

The “official” order is:
image

Though one may want to use the Netflix order:
image

I presume there could be some way to change the order of a single show, and keep the current behavior as default.

tvdb plugin doesn't work anymore

Jellyfin version 10.8.11
thetvdb plugin 10.0.0
OS: Windows 10

thetvdb plugin doesn't seem to be working at all. I tried to replicate this issue and it's happening everywhere. All my media is tagget before I insert it to Jellyfin (contains ID to tvdb and others, by mediaelk).

I don't know if this is somehow connected to API v4, but nothing working right now in Jellyfin. Everything works corretly when i disable tvdb plugin and use only themoviedb... but it has different numbering scheme so it's not good.

image

Here are some examples from logs when I tried to add TV Shows:

at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func2 factory)
at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetEpisodeTvdbId(Int32 seriesTvdbId, EpisodeQuery episodeQuery, String language, CancellationToken cancellationToken)
at Jellyfin.Plugin.Tvdb.Providers.TvdbEpisodeImageProvider.GetImages(BaseItem item, CancellationToken cancellationToken)
[2023-10-22 21:01:17.746 +02:00] [ERR] [65] Jellyfin.Plugin.Tvdb.Providers.TvdbEpisodeProvider: Failed to retrieve episode with id null, series id null:"NAME OF EPISODE"
TvDbSharper.TvDbServerException: The given series ID does not exist; No results for your query: map[AiredSeason:5 EpisodeNumber:10]
at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary2 errorMap) at TvDbSharper.Clients.SeriesClient.GetEpisodesAsync(Int32 seriesId, Int32 page, EpisodeQuery query, CancellationToken cancellationToken) at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_01.<b__0>d.MoveNext()

============

at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func2 factory) at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetImageKeyTypesForSeriesAsync(Int32 tvdbId, String language, CancellationToken cancellationToken)+MoveNext() at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetImageKeyTypesForSeriesAsync(Int32 tvdbId, String language, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult() at Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesImageProvider.GetImages(BaseItem item, CancellationToken cancellationToken) at Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesImageProvider.GetImages(BaseItem item, CancellationToken cancellationToken) at MediaBrowser.Providers.Manager.ProviderManager.GetImages(BaseItem item, IRemoteImageProvider provider, String preferredLanguage, Boolean includeAllLanguages, CancellationToken cancellationToken, Nullable1 type)
[ERR] [65] MediaBrowser.Providers.Manager.ProviderManager: "TvdbSeriesImageProvider" failed in GetImageInfos for type "Series" at "F:\IMAGINEPATH\IMAGINE SHOW(YEAR)"
TvDbSharper.TvDbServerException: The given series ID does not exist; Resource not found
at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary2 errorMap) at TvDbSharper.Clients.SeriesClient.GetImagesSummaryAsync(Int32 seriesId, CancellationToken cancellationToken) at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_01.<b__0>d.MoveNext()
`

missing feature not working

im new to jellyfin and i tried to setup jellyfin with plugins.
The plugin has the version 10.0 and seems to work. I checked the show page and it is linked the thetvdb. The tvdb has the other episodes on there website, but it does not show up as missing in the webui. I tried it for test purposes and its missing the whole first season and starts with episode 5 so it should defenetly show that there are some missing episodes. It only shows the episods i added. The API key was generated when i downloaded it.

TVDB Language Fallback Not Working

Describe the bug
Jellyfin doesn't use the default language, English, to fill missing metadata not available in the default metadata language of the library.

To Reproduce

  1. Go to admin panel
  2. Change language metadata of a library for some language not available in TV series or anime in TheTVDB.
  3. Refresh metadata replacing all previous metadata.
  4. Go to the TV series or anime.
  5. See missing title, or synopsis, since the choosen language doesn't have it.

Expected behavior
Jellyfin should pick what it can fron the choosen language, but if the metadata is missing (either title, or synopsis, or idk), fallback to English and pick only the missing metadata.

Logs
Jellyfin doesn't throws any error in logs.

Screenshots
No screenshot yet.

System (please complete the following information):

  • OS: Docker on Linux
  • Browser: Chrome 74.0.3729.131
  • Jellyfin Version: 10.3.2
  • Reverse proxy: nginx

Additional context
From what I remember, with TheTVDB v1, Jellyfin picked the English one if it found a missing metadata from the choosen language.

Incorrect series data even with specified series ID

I have the specific series number from thetvdb that I input in "identify". The UI shows the correct series name, albeit without the cover art, which I then choose. When everything is done refreshing, I still get old incorrect match. Looking at the logs, it says that the series ID doesn't exist even though I have even looked up and matched the exact ID. Correct ID is 97201, but it still shows data for 80352.

[2022-06-19 11:13:56.482 -07:00] [INF] Setting provider id's to item 524aad47-69ae-4597-a623-52d42e32db6e-"Life (2007)": "{\"Tvdb\":\"97201\"}"
[2022-06-19 11:13:57.679 -07:00] [ERR] "TvdbSeriesImageProvider" failed in GetImageInfos for type "Series" at "/mnt/videos/Other/Japanese TV shows/LIFE"
TvDbSharper.TvDbServerException: The given series ID does not exist; Resource not found
   at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)
   at TvDbSharper.Clients.SeriesClient.GetImagesSummaryAsync(Int32 seriesId, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func`2 factory)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetImageKeyTypesForSeriesAsync(Int32 tvdbId, String language, CancellationToken cancellationToken)+MoveNext()
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetImageKeyTypesForSeriesAsync(Int32 tvdbId, String language, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
   at Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesImageProvider.GetImages(BaseItem item, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesImageProvider.GetImages(BaseItem item, CancellationToken cancellationToken)
   at MediaBrowser.Providers.Manager.ProviderManager.GetImages(BaseItem item, IRemoteImageProvider provider, String preferredLanguage, Boolean includeAllLanguages, CancellationToken cancellationToken, Nullable`1 type)

Unhelpful error messages

Exceptions, like the one shown below, don’t provide the series ID in question. Because of this, debugging the problem and identifying a possibly misclassified show or episode is difficult. A helpful error message on these exceptions with information on what it was processing at the time would resolve this. Just tell me the series ID (or better yet the name) so I can re-identify the series.

[2022-05-10 13:38:52.632 -04:00] [WRN] [38] Jellyfin.Plugin.Tvdb.Providers.TvdbMissingEpisodeProvider: Unable to get episodes from TVDB
TvDbSharper.TvDbServerException: The given series ID does not exist; No results for your query: map[AiredSeason:0]
   at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)
   at TvDbSharper.Clients.SeriesClient.GetEpisodesAsync(Int32 seriesId, Int32 page, EpisodeQuery query, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func`2 factory)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbMissingEpisodeProvider.GetAllEpisodes(Int32 tvdbId, String acceptedLanguage, EpisodeQuery episodeQuery)

[2022-05-10 13:38:53.204 -04:00] [WRN] [18] Jellyfin.Plugin.Tvdb.Providers.TvdbMissingEpisodeProvider: Unable to get episodes from TVDB
TvDbSharper.TvDbServerException: The given series ID does not exist; No results for your query: map[AiredSeason:8]
   at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)
   at TvDbSharper.Clients.SeriesClient.GetEpisodesAsync(Int32 seriesId, Int32 page, EpisodeQuery query, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func`2 factory)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbMissingEpisodeProvider.GetAllEpisodes(Int32 tvdbId, String acceptedLanguage, EpisodeQuery episodeQuery)


Jellyfin and thetvdb API not working

Recently I set up a Jellyfin server with a RPi4 mainly used to watch anime. After using it a few months with AniDB I didn't like the way it organizes the anime, so I want to switch to thetvdb.

HW: RPi4
Version 10.7.6
OS: Raspbian

Since it wasn't working with the default API from the tvdb plugin I paid the tvdb subscription to get my own "Legacy API key" like they called it thinking that may be the problem, but after changing the API key still can't get any metadata from the tvdb.

What am I doing wrong?

I'm following the naming scheme of tvdb for my anime library.

I also tried to manually identifying the anime with thetvdb ID but only got synopsis and the cast info, not the images.

Is the problem Jellyfin? Thetvdb? me? Any suggestions? Please help.

The logs show this:

[2021-08-22 23:56:24.477 -03:00] [ERR] "TvdbSeriesImageProvider" failed in GetImageInfos for type "Series" at "/mnt/external/shared/Jellyfin/Anime test/Oreimo (2010)" TvDbSharper.TvDbServerException: The given series ID does not exist; Resource not found

at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)

at TvDbSharper.Clients.SeriesClient.GetImagesSummaryAsync(Int32 seriesId, CancellationToken cancellationToken)

at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext() --- End of stack trace from previous location ---

at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func`2 factory)

at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetImageKeyTypesForSeriesAsync(Int32 tvdbId, String language, CancellationToken cancellationToken)+MoveNext()

at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetImageKeyTypesForSeriesAsync(Int32 tvdbId, String language, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()

at Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesImageProvider.GetImages(BaseItem item, CancellationToken cancellationToken)

at Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesImageProvider.GetImages(BaseItem item, CancellationToken cancellationToken)

at MediaBrowser.Providers.Manager.ProviderManager.GetImages(BaseItem item, IRemoteImageProvider provider, IReadOnlyCollection`1 preferredLanguages, CancellationToken cancellationToken, Nullable`1 type)

[2021-08-22 23:56:24.670 -03:00] [ERR] "TvdbSeasonImageProvider" failed in GetImageInfos for type "Season" at "/mnt/external/shared/Jellyfin/Anime test/Oreimo (2010)/Season 1" TvDbSharper.TvDbServerException: The given series ID does not exist; Resource not found

at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)

at TvDbSharper.Clients.SeriesClient.GetImagesSummaryAsync(Int32 seriesId, CancellationToken cancellationToken)

at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext() --- End of stack trace from previous location ---

at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func`2 factory)

at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetImageKeyTypesForSeasonAsync(Int32 tvdbId, String language, CancellationToken cancellationToken)+MoveNext()

at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetImageKeyTypesForSeasonAsync(Int32 tvdbId, String language, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()

at Jellyfin.Plugin.Tvdb.Providers.TvdbSeasonImageProvider.GetImages(BaseItem item, CancellationToken cancellationToken)

at Jellyfin.Plugin.Tvdb.Providers.TvdbSeasonImageProvider.GetImages(BaseItem item, CancellationToken cancellationToken)

at MediaBrowser.Providers.Manager.ProviderManager.GetImages(BaseItem item, IRemoteImageProvider provider, IReadOnlyCollection`1 preferredLanguages, CancellationToken cancellationToken, Nullable`1 type)

[2021-08-22 23:56:24.769 -03:00] [ERR] "TvdbSeasonImageProvider" failed in GetImageInfos for type "Season" at "/mnt/external/shared/Jellyfin/Anime test/Oreimo (2010)/Specials" TvDbSharper.TvDbServerException: The given series ID does not exist; Resource not found

at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)

at TvDbSharper.Clients.SeriesClient.GetImagesSummaryAsync(Int32 seriesId, CancellationToken cancellationToken)

at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext() --- End of stack trace from previous location ---

at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func`2 factory)

at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetImageKeyTypesForSeasonAsync(Int32 tvdbId, String language, CancellationToken cancellationToken)+MoveNext()

at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetImageKeyTypesForSeasonAsync(Int32 tvdbId, String language, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()

at Jellyfin.Plugin.Tvdb.Providers.TvdbSeasonImageProvider.GetImages(BaseItem item, CancellationToken cancellationToken)

at Jellyfin.Plugin.Tvdb.Providers.TvdbSeasonImageProvider.GetImages(BaseItem item, CancellationToken cancellationToken)

at MediaBrowser.Providers.Manager.ProviderManager.GetImages(BaseItem item, IRemoteImageProvider provider, IReadOnlyCollection`1 preferredLanguages, CancellationToken cancellationToken, Nullable`1 type)

[2021-08-22 23:56:24.869 -03:00] [ERR] "TvdbSeasonImageProvider" failed in GetImageInfos for type "Season" at "/mnt/external/shared/Jellyfin/Anime test/Oreimo (2010)/Season 2" TvDbSharper.TvDbServerException: The given series ID does not exist; Resource not found

at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)

at TvDbSharper.Clients.SeriesClient.GetImagesSummaryAsync(Int32 seriesId, CancellationToken cancellationToken)

at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext() --- End of stack trace from previous location ---

at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func`2 factory)

at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetImageKeyTypesForSeasonAsync(Int32 tvdbId, String language, CancellationToken cancellationToken)+MoveNext()

at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetImageKeyTypesForSeasonAsync(Int32 tvdbId, String language, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()

at Jellyfin.Plugin.Tvdb.Providers.TvdbSeasonImageProvider.GetImages(BaseItem item, CancellationToken cancellationToken)

at Jellyfin.Plugin.Tvdb.Providers.TvdbSeasonImageProvider.GetImages(BaseItem item, CancellationToken cancellationToken)

at MediaBrowser.Providers.Manager.ProviderManager.GetImages(BaseItem item, IRemoteImageProvider provider, IReadOnlyCollection`1 preferredLanguages, CancellationToken cancellationToken, Nullable`1 type)

Languages don't work

This plugin keeps pulling metadata in english, even if I've chosen another language to use for the particular show. I've confirmed that the show does have metadata on TVDB in the language I've chosen, but this plugin ignores it. Copying the metadata over to TMDB immediately solves the issue, as I have prioritized that as a metadata scraper.

Running Jellyfin 10.8.10 and TVDB plugin 10.0.0.0

"Refresh Metadata" doesn't seem to do anything after updating TVDB episode id metadata

I noticed that some of my TV episodes were not cataloged correctly, mostly because of jellyfin/jellyfin#1758

I tried to work around this issue by identifying the episodes myself, by navigating to the season, then:

  • OS: Ubuntu
  • Virtualization: Docker
  • Clients: Browser
  • Browser: Firefox Nightly
  • Jellyfin Version: 10.6.1
  • Installed Plugins: AudioDB, MusicBrainz, OMDb, Open Subtitles, TheTVDB
  • Storage: samba

To Reproduce

  1. Clicking the meatball menu next to the badly identified episode
  2. clicking "Edit Metadata"
  3. Updating the "TheTVDB Episode Id"
  4. Click "Save changes"
  5. Clicking the meatball menu next to the badly identified episode
  6. Click "Refresh metadata"
  7. Click "Refresh" in the dialog that appears.

What happens

Nothing. I have waited hours.

Expected result:

Expected behavior

The metadata is updated using the TVDB id.

Logs

Screenshots

Additional context

Absolute order not working

Jellyfin v10.7.0RC1
Plugin: 1.0.0.0

Hey everyone.

I'm trying to setup Fairy Tail in absolute order as described here. The serie order in the metadata is set to absolute. I got 4 episodes to test and here are the path:

  • Fairy Tail (2009)/Season 1/S01E001.mkv
  • Fairy Tail (2009)/Season 1/S01E048.mkv
  • Fairy Tail (2009)/Season 1/S01E049.mkv
  • Fairy Tail (2009)/Season 1/S01E050.mkv

In the aired order, 001 et 048 are part of the season 1, and 49 and 50 of season 2.

Now Jellyfin detects a season 1, the first two episodes are working but the other two are bundled in the season 1 as files.
print_screen_2020-12-14-15-09-44

I'm guessing this is due to the TV library not having TVDB as a season metadata fetcher, and only TMDB.

TheTVDB 2.0.0.0: DI ordering failure at startup

Am getting the following error on start-up. (Unstable with new plugin manager running)

It looks to be caused by TvdbClientManager not getting instantiated first.

Please close if i'm testing on an older version.

Can reproduce if testing needed.

[14:02:12] [ERR] [1] Emby.Server.Implementations.ApplicationHost: Error creating Jellyfin.Plugin.Tvdb.Providers.TvdbEpisodeImageProvider
System.InvalidOperationException: Unable to resolve service for type 'Jellyfin.Plugin.Tvdb.TvdbClientManager' while attempting to activate 'Jellyfin.Plugin.T
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider)
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters)
   at Emby.Server.Implementations.ApplicationHost.CreateInstanceSafe(Type type) in C:\Code\jellyfin\Emby.Server.Implementations\ApplicationHost.cs:line 411
[14:02:12] [ERR] [1] Emby.Server.Implementations.ApplicationHost: Error creating Jellyfin.Plugin.Tvdb.Providers.TvdbPersonImageProvider
System.InvalidOperationException: Unable to resolve service for type 'Jellyfin.Plugin.Tvdb.TvdbClientManager' while attempting to activate 'Jellyfin.Plugin.T
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider)
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters)
   at Emby.Server.Implementations.ApplicationHost.CreateInstanceSafe(Type type) in C:\Code\jellyfin\Emby.Server.Implementations\ApplicationHost.cs:line 411
[14:02:12] [ERR] [1] Emby.Server.Implementations.ApplicationHost: Error creating Jellyfin.Plugin.Tvdb.Providers.TvdbSeasonImageProvider
System.InvalidOperationException: Unable to resolve service for type 'Jellyfin.Plugin.Tvdb.TvdbClientManager' while attempting to activate 'Jellyfin.Plugin.T
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider)
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters)
   at Emby.Server.Implementations.ApplicationHost.CreateInstanceSafe(Type type) in C:\Code\jellyfin\Emby.Server.Implementations\ApplicationHost.cs:line 411
[14:02:12] [ERR] [1] Emby.Server.Implementations.ApplicationHost: Error creating Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesImageProvider
System.InvalidOperationException: Unable to resolve service for type 'Jellyfin.Plugin.Tvdb.TvdbClientManager' while attempting to activate 'Jellyfin.Plugin.T
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider)
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters)
   at Emby.Server.Implementations.ApplicationHost.CreateInstanceSafe(Type type) in C:\Code\jellyfin\Emby.Server.Implementations\ApplicationHost.cs:line 411
[14:02:12] [ERR] [1] Emby.Server.Implementations.ApplicationHost: Error creating Jellyfin.Plugin.Tvdb.Providers.TvdbEpisodeProvider
System.InvalidOperationException: Unable to resolve service for type 'Jellyfin.Plugin.Tvdb.TvdbClientManager' while attempting to activate 'Jellyfin.Plugin.T
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider)
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters)
   at Emby.Server.Implementations.ApplicationHost.CreateInstanceSafe(Type type) in C:\Code\jellyfin\Emby.Server.Implementations\ApplicationHost.cs:line 411
[14:02:12] [ERR] [1] Emby.Server.Implementations.ApplicationHost: Error creating Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesProvider
System.InvalidOperationException: Unable to resolve service for type 'Jellyfin.Plugin.Tvdb.TvdbClientManager' while attempting to activate 'Jellyfin.Plugin.T
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider)
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters)
   at Emby.Server.Implementations.ApplicationHost.CreateInstanceSafe(Type type) in C:\Code\jellyfin\Emby.Server.Implementations\ApplicationHost.cs:line 411

TVDB missing episodes API issue

Hello,
I am getting this WRN in the log

[2023-08-12 16:54:51.068 +02:00] [WRN] [14] Jellyfin.Plugin.Tvdb.Providers.TvdbMissingEpisodeProvider: Unable to get episodes from TVDB
TvDbSharper.TvDbServerException: Invalid credentials; API Key Required
   at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)
   at TvDbSharper.Clients.AuthenticationClient.AuthenticateAsync(AuthenticationData authenticationData, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetTvDbClient(String language)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext()
--- End of stack trace from previous location ---

The missing episodes are not working is there a way to fix this issue? I have API from TVDB and I am using it in the plugin
Thank you.

Scan all libraries aborting with ERR

Version: 10.7.5
Operating System: Linux
Architecture: X64
Plugin Version: 4.0.0

Added a large music library, Jellyfin became unresponsive for days, removed the offending library but the following errors occur now on each "Scan All Libraries". Scan aborts and some TV entries are missing from the listing.

Any hints on more debugging would be appreciated. Thanks.

[2021-05-14 10:29:27.538 +07:00] [ERR] Error
TvDbSharper.TvDbServerException: The given series ID does not exist; No results for your query: map[AiredSeason:80]
   at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)
   at TvDbSharper.Clients.SeriesClient.GetEpisodesAsync(Int32 seriesId, Int32 page, EpisodeQuery query, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func`2 factory)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbMissingEpisodeProvider.GetAllEpisodes(Int32 tvdbId, String acceptedLanguage, EpisodeQuery episodeQuery)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbMissingEpisodeProvider.HandleSeason(Season season)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbMissingEpisodeProvider.OnProviderManagerRefreshComplete(Object sender, GenericEventArgs`1 genericEventArgs)
   at MediaBrowser.Providers.Manager.ProviderManager.OnRefreshComplete(BaseItem item)
   at MediaBrowser.Controller.Entities.Folder.ValidateChildrenInternal(IProgress`1 progress, CancellationToken cancellationToken, Boolean recursive, Boolean refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService)
   at MediaBrowser.Controller.Entities.Folder.<>c__DisplayClass61_0`1.<<RunTasks>b__1>d.MoveNext()
--- End of stack trace from previous location ---
   at MediaBrowser.Controller.Entities.Folder.RunTasks[T](Func`3 task, IList`1 children, IProgress`1 progress, CancellationToken cancellationToken)
   at MediaBrowser.Controller.Entities.Folder.ValidateChildrenInternal2(IProgress`1 progress, CancellationToken cancellationToken, Boolean recursive, Boolean refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService)
   at MediaBrowser.Controller.Entities.Folder.ValidateChildrenInternal(IProgress`1 progress, CancellationToken cancellationToken, Boolean recursive, Boolean refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService)
   at MediaBrowser.Controller.Entities.Folder.<>c__DisplayClass61_0`1.<<RunTasks>b__1>d.MoveNext()
--- End of stack trace from previous location ---
   at MediaBrowser.Controller.Entities.Folder.RunTasks[T](Func`3 task, IList`1 children, IProgress`1 progress, CancellationToken cancellationToken)
   at MediaBrowser.Controller.Entities.Folder.ValidateChildrenInternal2(IProgress`1 progress, CancellationToken cancellationToken, Boolean recursive, Boolean refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService)
   at MediaBrowser.Controller.Entities.Folder.ValidateChildrenInternal(IProgress`1 progress, CancellationToken cancellationToken, Boolean recursive, Boolean refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService)
   at MediaBrowser.Controller.Entities.Folder.<>c__DisplayClass61_0`1.<<RunTasks>b__1>d.MoveNext()
--- End of stack trace from previous location ---
   at MediaBrowser.Controller.Entities.Folder.RunTasks[T](Func`3 task, IList`1 children, IProgress`1 progress, CancellationToken cancellationToken)
   at MediaBrowser.Controller.Entities.Folder.ValidateChildrenInternal2(IProgress`1 progress, CancellationToken cancellationToken, Boolean recursive, Boolean refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService)
   at MediaBrowser.Controller.Entities.Folder.ValidateChildrenInternal(IProgress`1 progress, CancellationToken cancellationToken, Boolean recursive, Boolean refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService)
   at MediaBrowser.Controller.Entities.AggregateFolder.ValidateChildrenInternal(IProgress`1 progress, CancellationToken cancellationToken, Boolean recursive, Boolean refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService)
   at Emby.Server.Implementations.Library.LibraryManager.PerformLibraryValidation(IProgress`1 progress, CancellationToken cancellationToken)
   at Emby.Server.Implementations.Library.LibraryManager.ValidateMediaLibraryInternal(IProgress`1 progress, CancellationToken cancellationToken)
   at Emby.Server.Implementations.ScheduledTasks.ScheduledTaskWorker.ExecuteInternal(TaskOptions options)
[2021-05-14 10:29:27.617 +07:00] [INF] "Scan Media Library" Failed after 0 minute(s) and 19 seconds

Legacy API keys are deprecated and will be discontinued soon. Developers should update their projects to make use of our new API.

I don't have a Legacy keys of TheTVDB, so i only have the API keys.

I got the error message when i use API keys.

TvDbSharper.TvDbServerException: Invalid credentials; API Key Required
   at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)
   at TvDbSharper.Clients.AuthenticationClient.AuthenticateAsync(AuthenticationData authenticationData, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetTvDbClient(String language)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.Extensions.Caching.Memory.CacheExtensions.GetOrCreateAsync[TItem](IMemoryCache cache, Object key, Func`2 factory)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetImageKeyTypesForSeriesAsync(Int32 tvdbId, String language, CancellationToken cancellationToken)+MoveNext()
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetImageKeyTypesForSeriesAsync(Int32 tvdbId, String language, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
   at Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesImageProvider.GetImages(BaseItem item, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbSeriesImageProvider.GetImages(BaseItem item, CancellationToken cancellationToken)
   at MediaBrowser.Providers.Manager.ProviderManager.GetImages(BaseItem item, IRemoteImageProvider provider, String preferredLanguage, Boolean includeAllLanguages, CancellationToken cancellationToken, Nullable`1 type)

TVDB Image search resolutions incorrect

Image search results from theTVDB claim image resolutions to be 680x1000 pixels regardless of the actual resolution.

For example, whilst searching for season posters for Bob's Burgers, this image: TVDB link, claims to be 680x1000 whilst in the search window, but upon selecting it the reported resolution changes to the correct 400x578.

This can make it a little difficult to find consistent results when selecting season artwork.

I suspect this may be a fairly old bug, as my search for solutions found this issue on the main jellyfin repo. It claims they weren't receiving the full resolution image, but it seems likely the "full resolution" was in fact incorrect.

Config:

Running Jellyfin 10.8.10 on Windows 10, accessing via Chrome 115.0.5790.110.

Additional non default plugins:
Fanart
Open Subtitles

Trigger Rematch on 500+ series

When I setup up my library I didnt use TVDB, now that I installed it I want it to try and rematch 500+ series that should match, would I just move the agent up in the list and run a scan, refresh meta? The only way currently I can see to do this is to "Identify" each file copy the folder name, search, pick the show. Out of 5000 series about 500 have no images and dont look "matched" but jelly has no way like plex for me to identify non matched/identified, so I sorted by release date and the first 500 are all wonky out of order than somewhere in 500+ the "correctly" matched ones look right, so Im hoping the new agent will find these, or do I need to remove the paths from library and do it all over from scratch?

Build failed

Hello! I try to build a project and got this error

Microsoft (R) Build Engine version 16.8.0+126527ff1 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

  Determining projects to restore...
  All projects are up-to-date for restore.
/mnt/e/jellyfin-plugin-tvdb/Jellyfin.Plugin.Tvdb/TvdbPluginServiceRegistrator.cs(9,49): error CS0246: The type or namespace name 'IPluginServiceRegistrator' could not be found (are you missing a using directive or an assembly reference?) [/mnt/e/jellyfin-plugin-tvdb/Jellyfin.Plugin.Tvdb/Jellyfin.Plugin.Tvdb.csproj]
/mnt/e/jellyfin-plugin-tvdb/Jellyfin.Plugin.Tvdb/Providers/TvdbSeriesImageProvider.cs(24,44): error CS0738: 'TvdbSeriesImageProvider' does not implement interface member 'IRemoteImageProvider.GetImageResponse(string, CancellationToken)'. 'TvdbSeriesImageProvider.GetImageResponse(string, CancellationToken)' cannot implement 'IRemoteImageProvider.GetImageResponse(string, CancellationToken)' because it does not have the matching return type of 'Task<HttpResponseInfo>'. [/mnt/e/jellyfin-plugin-tvdb/Jellyfin.Plugin.Tvdb/Jellyfin.Plugin.Tvdb.csproj]
/mnt/e/jellyfin-plugin-tvdb/Jellyfin.Plugin.Tvdb/Providers/TvdbSeasonImageProvider.cs(24,44): error CS0738: 'TvdbSeasonImageProvider' does not implement interface member 'IRemoteImageProvider.GetImageResponse(string, CancellationToken)'. 'TvdbSeasonImageProvider.GetImageResponse(string, CancellationToken)' cannot implement 'IRemoteImageProvider.GetImageResponse(string, CancellationToken)' because it does not have the matching return type of 'Task<HttpResponseInfo>'. [/mnt/e/jellyfin-plugin-tvdb/Jellyfin.Plugin.Tvdb/Jellyfin.Plugin.Tvdb.csproj]
/mnt/e/jellyfin-plugin-tvdb/Jellyfin.Plugin.Tvdb/Providers/TvdbPersonImageProvider.cs(24,44): error CS0738: 'TvdbPersonImageProvider' does not implement interface member 'IRemoteImageProvider.GetImageResponse(string, CancellationToken)'. 'TvdbPersonImageProvider.GetImageResponse(string, CancellationToken)' cannot implement 'IRemoteImageProvider.GetImageResponse(string, CancellationToken)' because it does not have the matching return type of 'Task<HttpResponseInfo>'. [/mnt/e/jellyfin-plugin-tvdb/Jellyfin.Plugin.Tvdb/Jellyfin.Plugin.Tvdb.csproj]
/mnt/e/jellyfin-plugin-tvdb/Jellyfin.Plugin.Tvdb/Providers/TvdbEpisodeImageProvider.cs(20,45): error CS0738: 'TvdbEpisodeImageProvider' does not implement interface member 'IRemoteImageProvider.GetImageResponse(string, CancellationToken)'. 'TvdbEpisodeImageProvider.GetImageResponse(string, CancellationToken)' cannot implement 'IRemoteImageProvider.GetImageResponse(string, CancellationToken)' because it does not have the matching return type of 'Task<HttpResponseInfo>'. [/mnt/e/jellyfin-plugin-tvdb/Jellyfin.Plugin.Tvdb/Jellyfin.Plugin.Tvdb.csproj]
/mnt/e/jellyfin-plugin-tvdb/Jellyfin.Plugin.Tvdb/Providers/TvdbEpisodeProvider.cs(22,40): error CS0738: 'TvdbEpisodeProvider' does not implement interface member 'IRemoteSearchProvider.GetImageResponse(string, CancellationToken)'. 'TvdbEpisodeProvider.GetImageResponse(string, CancellationToken)' cannot implement 'IRemoteSearchProvider.GetImageResponse(string, CancellationToken)' because it does not have the matching return type of 'Task<HttpResponseInfo>'. [/mnt/e/jellyfin-plugin-tvdb/Jellyfin.Plugin.Tvdb/Jellyfin.Plugin.Tvdb.csproj]
/mnt/e/jellyfin-plugin-tvdb/Jellyfin.Plugin.Tvdb/Providers/TvdbSeriesProvider.cs(26,39): error CS0738: 'TvdbSeriesProvider' does not implement interface member 'IRemoteSearchProvider.GetImageResponse(string, CancellationToken)'. 'TvdbSeriesProvider.GetImageResponse(string, CancellationToken)' cannot implement 'IRemoteSearchProvider.GetImageResponse(string, CancellationToken)' because it does not have the matching return type of 'Task<HttpResponseInfo>'. [/mnt/e/jellyfin-plugin-tvdb/Jellyfin.Plugin.Tvdb/Jellyfin.Plugin.Tvdb.csproj]

Could you help me with this?

Failure fetching episode metadata

Description

Some episodes fail to fetch metadata, while others from the same show and season fetch them fine. File names are all in similar fashion (S##E##.mkv)

Attempts to resolve

  • Refreshing metadata
  • Removing file, updating library, adding file and updating library again

Versions

  • Jellyfin: 10.8.10
  • TVDB plugin: 9.0.0.0
  • TMDB Box Sets plugin: 10.0.0.0

Environment

  • OS: Windows 10
  • Browser: Firefox
  • Plugins: TMDB Box Sets, TVDB

Jellyfin log

https://pastebin.com/1VPDNtex

Browser page screenshot

image

File structure screenshot

image

The episode is shown as missing but it's not!

Hello,
So as the title says, literally all my episodes in all series that I have shown as missing but they are available. I checked the tvdb ID and it's the same in both episodes the missing one and the available.
Any help?

لقطة الشاشة 2023-05-06 005942

Use Own Key?

Does this use the Legacy key? So I can add my personal one?

[Issue]: When I add a missing episode, the "Missing" TVDB entry is not deleted

Please describe your bug

[Issue]: When I add a missing episode, the "Missing" TVDB entry is not deleted
I use TMDB data provider in first order even for TVshow library because more reliable.
But I added TVDB to show missing episodes.
Now I can't delete "Missing" entry, even if I completed the season:(
I tryed refresh all metadata /w remplace all pictures. Do not work
Also tried refresh all library without success.

Not tested : delete entire TVshow from db and refresh (it must work but crap&slow) I can test if you ask

Jellyfin Version

10.7.7

if other:

No response

Environment

- OS: Debian 10
- Virtualization: No
- Clients:
- Browser:
- FFmpeg Version: stock one from Jellyfin stable
- Playback Method: All
- Hardware Acceleration: No
- Plugins: TBDB Box set, Reports, TVDB
- Reverse Proxy: Apache HTTP
- Base URL: /jellyfin
- Networking: Gigabit LAN&WAN
- Storage: 116TB enterprise hdd

Jellyfin logs

No response

FFmpeg logs

No response

Please attach any browser or client logs here

No response

Please attach any screenshots here

BugMissing

Code of Conduct

  • I agree to follow this project's Code of Conduct

plugin can't work

In version 10.7.0,If the file name is xxx.xxx.xxx.mkv,jellyfin didn't get any results。If I manually change the name to xxx xxx xxx.mkv(Delete.),The plug-in will work.
But in version 10.6.4,business as usual.
I've tried three versions,it's all like this.
Plugin-OMDb don't have that problem,but I am a Chinese user,OMDb don't provide Chinese metadata.
All my file names are xxx.xxx.xxx.mkv.This difficult question is a headache for me.

Add option to TVDB plugin to use the DVD data

TVDB separates metadata such as episode number etc between as originally aired and the order on DVD releases. I organize my TV library by DVD episode number since it's based on DVD rips anyway. I propose to add a option to the TVDB plugin to toggle which data to use.

The DVD data is provided as additional json keys:

    "dvdEpisodeNumber": 0,
    "dvdSeason": 0,

No way to remove invalid import

It seems like there's no way to actually remove incorrect data—episodes and seasons can't be removed nor do they do that when refreshing metadata, for example
image
Vis a Vis: El Oasis seems to have a lot of specials (I counted 6) despite not having any really, and I can't find any way to remove it

Episodes metadata only filled on manual "identify"

using:

  • jellyfin linuxserver docker nightly (with jellyfin-server 20201223.3-unstable)
  • tvdb plugin 2.0.0.0

when:

  • adding new shows
  • adding new episodes in existing shows
  • replacing episode in existing shows

result:
Shows metadata and poster displays correctly, but no episodes metadata get filled. it displays filename instead.
Refresh metadata doesn't work. the problem persists.

It works only by doing manual Identify, everything filled and displays correctly.

Build failing on "invalid version string"

Following the instructions, I have .NET core for arch installed - get this error when starting to build:

/usr/share/dotnet/sdk/3.1.108/NuGet.targets(123,5): error : '10.-' is not a valid version string. [/home/wodger/Downloads/Jellyfin_TVDB/Jellyfin.Plugin.Tvdb.sln]

Would like to get this working if possible

Thanks

API issue

Hi!

While refreshing the metadata I keep getting a bunch of the following errors.

[2022-08-02 20:47:57.445 +02:00] [ERR] Failed to retrieve episode with id null, series id null
TvDbSharper.TvDbServerException: Invalid credentials; API Key Required
   at TvDbSharper.Infrastructure.Parser.Parse[T](ApiResponse response, IReadOnlyDictionary`2 errorMap)
   at TvDbSharper.Clients.AuthenticationClient.AuthenticateAsync(AuthenticationData authenticationData, CancellationToken cancellationToken)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.GetTvDbClient(String language)
   at Jellyfin.Plugin.Tvdb.TvdbClientManager.<>c__DisplayClass24_0`1.<<TryGetValue>b__0>d.MoveNext()
--- End of stack trace from previous location ---

Jellyfin 10.8.3, arm64, Debian

Metadata for TV shows

Describe the bug
Jellyfin 1.6.4 used to edit the metadata of TV shows but no longer does it in 1.7.0. I started using rc3 and noticed the issue and there was a bug report in github that you could open the metadata sub folders in rc3 and rc4 fixed that but still has the issue where it doesn't edit the metadata of TV shows but movies is fine.

Took a screenshot of episodes set by date they were put into jellyfin, Stargate episodes were during 1.6.4 and Top Gear is from 1.7.0 rc4
https://imgbox.com/u7AhawqF

System (please complete the following information):

  • OS: Windows
  • Virtualization: N/A
  • Clients: N/A
  • Browser: N/A
  • Jellyfin Version: 1.7.0 rc4
  • Playback: N/A
  • Installed Plugins: N/A
  • Reverse Proxy: N/A
  • Base URL: [e.g. none, yes: /example]
  • Networking: N/A
  • Storage: N/A

To Reproduce

  1. Add a TV Show

Expected behavior
Edit metadata of the TV Show or episode

Logs
If logs are needed please let me know what to do to get what you need.

Screenshots
https://imgbox.com/u7AhawqF

Additional context
N/A

Build 4.0.0 Reports "Malfunction"

On the Dashboard plugin screen, the TVDB plugin has "Malfunction" in the Status line.

Jellyfin
Version: 10.7.1
Operating System: Linux
Architecture: X64

Support for Special episodes with Display order: Absolute

It seems this plugin doesn't support special episodes when Display order is set to Absolute.

For example I have Detective Conan in my library configured with Absolute numbering, but when I tried to add a special (for example S0E04 - OVA 01: Conan vs. KID vs. Yaiba it gets the wrong metadata. It does show up as a Special, which is great, but the metadata information on the episode is from Episode 4 - The Coded Map of the City Case, which is less great.

Regarding normalization

Is there a reason why NormalizationForm.FormKD is used as opposed to something like NormalizationForm.FormC?

I'm asking because said normalization form is screwing up korean video titles encoded in utf8 (i.e., it works if I change it FormC). Are there any languages that depend on it? If so, I'll add a special case for korean, if not I'll add a pull request just changing it to FormC.

Error in Missing Epsiode provider causing refresh to fail (collection value null)

Having an issue where my scan isn't completing because of the Tvdb's missing epsiode provider (v6). Disabling it allows the search to complete.

Should this not be tested and handled gracefully (providing a warning and proceeding) rather than failing in this way?
There is also no logging on which show/episode/season if of concern here so I can remedy it, even with debug logging cranked to debug.

[2022-05-06 15:13:43.155 -04:00] [DBG] [38] MediaBrowser.Providers.Manager.ProviderManager: OnRefreshComplete "[ID-OF-MY-TV-LIBRARY]"
[2022-05-06 15:13:43.156 -04:00] [ERR] [38] MediaBrowser.Providers.Manager.ProviderManager: Error refreshing item
System.ArgumentNullException: Value cannot be null. (Parameter 'collection')
   at System.Collections.Generic.List`1.InsertRange(Int32 index, IEnumerable`1 collection)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbMissingEpisodeProvider.GetAllEpisodes(Int32 tvdbId, String acceptedLanguage, EpisodeQuery episodeQuery)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbMissingEpisodeProvider.HandleSeason(Season season)
   at Jellyfin.Plugin.Tvdb.Providers.TvdbMissingEpisodeProvider.OnProviderManagerRefreshComplete(Object sender, GenericEventArgs`1 genericEventArgs)
   at MediaBrowser.Providers.Manager.ProviderManager.OnRefreshComplete(BaseItem item)
   at MediaBrowser.Controller.Entities.Folder.ValidateChildrenInternal(IProgress`1 progress, CancellationToken cancellationToken, Boolean recursive, Boolean refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService)
   at MediaBrowser.Controller.Entities.Folder.<>c__DisplayClass61_0`1.<<RunTasks>b__1>d.MoveNext()
--- End of stack trace from previous location ---
   at MediaBrowser.Controller.Entities.Folder.RunTasks[T](Func`3 task, IList`1 children, IProgress`1 progress, CancellationToken cancellationToken)
   at MediaBrowser.Controller.Entities.Folder.ValidateChildrenInternal2(IProgress`1 progress, CancellationToken cancellationToken, Boolean recursive, Boolean refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService)
   at MediaBrowser.Controller.Entities.Folder.ValidateChildrenInternal(IProgress`1 progress, CancellationToken cancellationToken, Boolean recursive, Boolean refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService)
   at MediaBrowser.Controller.Entities.Folder.<>c__DisplayClass61_0`1.<<RunTasks>b__1>d.MoveNext()
--- End of stack trace from previous location ---
   at MediaBrowser.Controller.Entities.Folder.RunTasks[T](Func`3 task, IList`1 children, IProgress`1 progress, CancellationToken cancellationToken)
   at MediaBrowser.Controller.Entities.Folder.ValidateChildrenInternal2(IProgress`1 progress, CancellationToken cancellationToken, Boolean recursive, Boolean refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService)
   at MediaBrowser.Controller.Entities.Folder.ValidateChildrenInternal(IProgress`1 progress, CancellationToken cancellationToken, Boolean recursive, Boolean refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService)
   at MediaBrowser.Providers.Manager.ProviderManager.RefreshCollectionFolderChildren(MetadataRefreshOptions options, CollectionFolder collectionFolder, CancellationToken cancellationToken)
   at MediaBrowser.Providers.Manager.ProviderManager.RefreshItem(BaseItem item, MetadataRefreshOptions options, CancellationToken cancellationToken)
   at MediaBrowser.Providers.Manager.ProviderManager.StartProcessingRefreshQueue()

Episodes with `Part 1` in the title get parsed as Episode 1

For instance, in S01 of Avatar, The Last Airbender, there are two episodes with Part 1 in the title:

  • Ep. 07 - Winter Solstice Part 1 - The Spirit World
  • Ep. 19 - The Siege of the North - Part 1

Both these episodes, AND the actual first episode of the season (Ep. 01 - The Boy in the Iceberg) get parsed as S01E01.

The same thing happens with other parts: part 2 becomes S01E02, and so on.

[request] Don't retrieve missing Specials

For many shows there are deleted scenes or interviews or DVD extras that the plugin will retrieve and populate into Jellyfin. I don't think the average user is interested in these as they are upcoming episodes or missing episodes assuming they have this provider enabled.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.