Compare commits

...

6 Commits

Author SHA1 Message Date
Frank Riley 876c6155e9
Merge 1449b861b1 into e2a22cec0e 2024-05-04 13:06:58 -04:00
Nyanmisaka e2a22cec0e Translated using Weblate (Chinese (Simplified))
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/zh_Hans/
2024-05-04 13:06:46 -04:00
queeup 067962ae2a Translated using Weblate (Turkish)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/tr/
2024-05-04 13:06:46 -04:00
Szilágyi Kristóf 8a65d239b7 Translated using Weblate (Hungarian)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/hu/
2024-05-04 13:06:46 -04:00
HiPotionQ8 518404cd1d Translated using Weblate (Arabic)
Translation: Jellyfin/Jellyfin
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-core/ar/
2024-05-04 13:06:46 -04:00
Frank Riley 1449b861b1 Add uniqueid tag to nfo 2023-02-03 07:20:34 -07:00
9 changed files with 164 additions and 123 deletions

View File

@ -128,5 +128,7 @@
"TaskRefreshTrickplayImages": "توليد صور Trickplay",
"TaskRefreshTrickplayImagesDescription": "يُنشئ معاينات Trickplay لمقاطع الفيديو في المكتبات المُمكّنة.",
"TaskCleanCollectionsAndPlaylists": "حذف المجموعات وقوائم التشغيل",
"TaskCleanCollectionsAndPlaylistsDescription": "حذف عناصر من المجموعات وقوائم التشغيل التي لم تعد موجودة."
"TaskCleanCollectionsAndPlaylistsDescription": "حذف عناصر من المجموعات وقوائم التشغيل التي لم تعد موجودة.",
"TaskAudioNormalization": "تطبيع الصوت",
"TaskAudioNormalizationDescription": "مسح الملفات لتطبيع بيانات الصوت."
}

View File

@ -1,13 +1,13 @@
{
"Albums": "Albumok",
"AppDeviceValues": "Program: {0}, eszköz: {1}",
"AppDeviceValues": "Program: {0}, Eszköz: {1}",
"Application": "Alkalmazás",
"Artists": "Előadók",
"AuthenticationSucceededWithUserName": "{0} sikeresen hitelesítve",
"Books": "Könyvek",
"CameraImageUploadedFrom": "Új kamerakép feltöltve innen: {0}",
"CameraImageUploadedFrom": "Új kamerakép lett feltöltve innen: {0}",
"Channels": "Csatornák",
"ChapterNameValue": "{0}. jelenet",
"ChapterNameValue": "Jelenet {0}",
"Collections": "Gyűjtemények",
"DeviceOfflineWithName": "{0} kijelentkezett",
"DeviceOnlineWithName": "{0} belépett",
@ -15,27 +15,27 @@
"Favorites": "Kedvencek",
"Folders": "Könyvtárak",
"Genres": "Műfajok",
"HeaderAlbumArtists": "Albumelőadók",
"HeaderAlbumArtists": "Album előadók",
"HeaderContinueWatching": "Megtekintés folytatása",
"HeaderFavoriteAlbums": "Kedvenc albumok",
"HeaderFavoriteAlbums": "Kedvenc Albumok",
"HeaderFavoriteArtists": "Kedvenc előadók",
"HeaderFavoriteEpisodes": "Kedvenc epizódok",
"HeaderFavoriteShows": "Kedvenc sorozatok",
"HeaderFavoriteSongs": "Kedvenc számok",
"HeaderFavoriteSongs": "Kedvenc dalok",
"HeaderLiveTV": "Élő TV",
"HeaderNextUp": "Következik",
"HeaderRecordingGroups": "Felvételi csoportok",
"HomeVideos": "Házi videók",
"HomeVideos": "Otthoni videók",
"Inherit": "Örökölt",
"ItemAddedWithName": "{0} hozzáadva a könyvtárhoz",
"ItemRemovedWithName": "{0} eltávolítva a könyvtárból",
"LabelIpAddressValue": "IP-cím: {0}",
"LabelRunningTimeValue": "Lejátszási idő: {0}",
"Latest": "Legújabb",
"MessageApplicationUpdated": "A Jellyfin kiszolgáló frissítve",
"MessageApplicationUpdated": "A Jellyfin kiszolgáló frissítve lett",
"MessageApplicationUpdatedTo": "A Jellyfin kiszolgáló frissítve lett a következőre: {0}",
"MessageNamedServerConfigurationUpdatedWithValue": "A kiszolgálókonfigurációs rész frissítve: {0}",
"MessageServerConfigurationUpdated": "Kiszolgálókonfiguráció frissítve",
"MessageNamedServerConfigurationUpdatedWithValue": "A kiszolgálókonfigurációs rész frissítve lett: {0}",
"MessageServerConfigurationUpdated": "Kiszolgálókonfiguráció frissítve lett",
"MixedContent": "Vegyes tartalom",
"Movies": "Filmek",
"Music": "Zenék",
@ -46,7 +46,7 @@
"NewVersionIsAvailable": "Letölthető a Jellyfin kiszolgáló új verziója.",
"NotificationOptionApplicationUpdateAvailable": "Frissítés érhető el az alkalmazáshoz",
"NotificationOptionApplicationUpdateInstalled": "Alkalmazásfrissítés telepítve",
"NotificationOptionAudioPlayback": "Hanglejátszás elkezdve",
"NotificationOptionAudioPlayback": "Hanglejátszás elkezdődött",
"NotificationOptionAudioPlaybackStopped": "Hanglejátszás leállítva",
"NotificationOptionCameraImageUploaded": "Kamerakép feltöltve",
"NotificationOptionInstallationFailed": "Telepítési hiba",
@ -126,5 +126,9 @@
"External": "Külső",
"HearingImpaired": "Hallássérült",
"TaskRefreshTrickplayImages": "Trickplay képek generálása",
"TaskRefreshTrickplayImagesDescription": "Trickplay előnézetet készít az engedélyezett könyvtárakban lévő videókhoz."
"TaskRefreshTrickplayImagesDescription": "Trickplay előnézetet készít az engedélyezett könyvtárakban lévő videókhoz.",
"TaskAudioNormalization": "Hangerő Normalizáció",
"TaskCleanCollectionsAndPlaylistsDescription": "Nem létező elemek törlése a gyűjteményekből és lejátszási listákról.",
"TaskAudioNormalizationDescription": "Hangerő normalizációs adatok keresése.",
"TaskCleanCollectionsAndPlaylists": "Gyűjtemények és lejátszási listák optimalizálása"
}

View File

@ -128,5 +128,7 @@
"TaskRefreshTrickplayImages": "Trickplay Görselleri Oluştur",
"TaskRefreshTrickplayImagesDescription": "Etkin kütüphanelerdeki videolar için trickplay önizlemeleri oluşturur.",
"TaskCleanCollectionsAndPlaylistsDescription": "Artık var olmayan koleksiyon ve çalma listelerindeki ögeleri kaldırır.",
"TaskCleanCollectionsAndPlaylists": "Koleksiyonları ve çalma listelerini temizleyin"
"TaskCleanCollectionsAndPlaylists": "Koleksiyonları ve çalma listelerini temizleyin",
"TaskAudioNormalizationDescription": "Ses normalleştirme verileri için dosyaları tarar.",
"TaskAudioNormalization": "Ses Normalleştirme"
}

View File

@ -128,5 +128,7 @@
"TaskRefreshTrickplayImages": "生成时间轴缩略图",
"TaskRefreshTrickplayImagesDescription": "为启用的媒体库中的视频生成时间轴缩略图。",
"TaskCleanCollectionsAndPlaylists": "清理合集和播放列表",
"TaskCleanCollectionsAndPlaylistsDescription": "清理合集和播放列表中已不存在的项目。"
"TaskCleanCollectionsAndPlaylistsDescription": "清理合集和播放列表中已不存在的项目。",
"TaskAudioNormalization": "音频标准化",
"TaskAudioNormalizationDescription": "扫描文件以寻找音频标准化数据。"
}

View File

@ -84,6 +84,11 @@ namespace MediaBrowser.Model.Entities
/// <summary>
/// The TvMaze provider.
/// </summary>
TvMaze = 19
TvMaze = 19,
/// <summary>
/// The Jellyfin provider.
/// </summary>
Jellyfin = 20
}
}

View File

@ -92,6 +92,8 @@ namespace MediaBrowser.XbmcMetadata.Savers
"musicbrainzreleasegroupid",
"tvdbid",
"collectionitem",
"jellyfinid",
"uniqueid",
"isuserfavorite",
"userrating",
@ -296,6 +298,11 @@ namespace MediaBrowser.XbmcMetadata.Savers
}
}
protected virtual MetadataProvider? GetDefaultProvider()
{
return null;
}
protected abstract void WriteCustomElements(BaseItem item, XmlWriter writer);
public static void AddMediaInfo<T>(T item, XmlWriter writer)
@ -439,6 +446,17 @@ namespace MediaBrowser.XbmcMetadata.Savers
{
var writtenProviderIds = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
var defaultProvider = GetDefaultProvider();
if (defaultProvider != null)
{
var defaultProviderId = item.GetProviderId((MetadataProvider)defaultProvider);
if (!string.IsNullOrEmpty(defaultProviderId))
{
writer.WriteElementString("id", defaultProviderId);
}
}
var overview = (item.Overview ?? string.Empty)
.StripHtml()
.Replace("&quot;", "'", StringComparison.Ordinal);
@ -544,46 +562,17 @@ namespace MediaBrowser.XbmcMetadata.Savers
writer.WriteElementString("aspectratio", hasAspectRatio.AspectRatio);
}
var tmdbCollection = item.GetProviderId(MetadataProvider.TmdbCollection);
AddProviderId(writer, item, MetadataProvider.TmdbCollection, writtenProviderIds, "collectionnumber");
if (!string.IsNullOrEmpty(tmdbCollection))
var imdbTagName = "imdbid";
if (item is Series)
{
writer.WriteElementString("collectionnumber", tmdbCollection);
writtenProviderIds.Add(MetadataProvider.TmdbCollection.ToString());
imdbTagName = "imdb_id";
}
var imdb = item.GetProviderId(MetadataProvider.Imdb);
if (!string.IsNullOrEmpty(imdb))
{
if (item is Series)
{
writer.WriteElementString("imdb_id", imdb);
}
else
{
writer.WriteElementString("imdbid", imdb);
}
writtenProviderIds.Add(MetadataProvider.Imdb.ToString());
}
// Series xml saver already saves this
if (item is not Series)
{
var tvdb = item.GetProviderId(MetadataProvider.Tvdb);
if (!string.IsNullOrEmpty(tvdb))
{
writer.WriteElementString("tvdbid", tvdb);
writtenProviderIds.Add(MetadataProvider.Tvdb.ToString());
}
}
var tmdb = item.GetProviderId(MetadataProvider.Tmdb);
if (!string.IsNullOrEmpty(tmdb))
{
writer.WriteElementString("tmdbid", tmdb);
writtenProviderIds.Add(MetadataProvider.Tmdb.ToString());
}
AddProviderIdAndUniqueId(writer, item, MetadataProvider.Imdb, writtenProviderIds, false, imdbTagName);
AddProviderIdAndUniqueId(writer, item, MetadataProvider.Tvdb, writtenProviderIds);
AddProviderIdAndUniqueId(writer, item, MetadataProvider.Tmdb, writtenProviderIds);
if (!string.IsNullOrEmpty(item.PreferredMetadataLanguage))
{
@ -687,68 +676,16 @@ namespace MediaBrowser.XbmcMetadata.Savers
}
}
var externalId = item.GetProviderId(MetadataProvider.AudioDbArtist);
AddProviderId(writer, item, MetadataProvider.AudioDbArtist, writtenProviderIds);
AddProviderId(writer, item, MetadataProvider.AudioDbAlbum, writtenProviderIds);
AddProviderId(writer, item, MetadataProvider.Zap2It, writtenProviderIds);
AddProviderId(writer, item, MetadataProvider.MusicBrainzAlbum, writtenProviderIds);
AddProviderId(writer, item, MetadataProvider.MusicBrainzAlbumArtist, writtenProviderIds);
AddProviderId(writer, item, MetadataProvider.MusicBrainzArtist, writtenProviderIds);
AddProviderId(writer, item, MetadataProvider.MusicBrainzReleaseGroup, writtenProviderIds);
AddProviderId(writer, item, MetadataProvider.TvRage, writtenProviderIds);
if (!string.IsNullOrEmpty(externalId))
{
writer.WriteElementString("audiodbartistid", externalId);
writtenProviderIds.Add(MetadataProvider.AudioDbArtist.ToString());
}
externalId = item.GetProviderId(MetadataProvider.AudioDbAlbum);
if (!string.IsNullOrEmpty(externalId))
{
writer.WriteElementString("audiodbalbumid", externalId);
writtenProviderIds.Add(MetadataProvider.AudioDbAlbum.ToString());
}
externalId = item.GetProviderId(MetadataProvider.Zap2It);
if (!string.IsNullOrEmpty(externalId))
{
writer.WriteElementString("zap2itid", externalId);
writtenProviderIds.Add(MetadataProvider.Zap2It.ToString());
}
externalId = item.GetProviderId(MetadataProvider.MusicBrainzAlbum);
if (!string.IsNullOrEmpty(externalId))
{
writer.WriteElementString("musicbrainzalbumid", externalId);
writtenProviderIds.Add(MetadataProvider.MusicBrainzAlbum.ToString());
}
externalId = item.GetProviderId(MetadataProvider.MusicBrainzAlbumArtist);
if (!string.IsNullOrEmpty(externalId))
{
writer.WriteElementString("musicbrainzalbumartistid", externalId);
writtenProviderIds.Add(MetadataProvider.MusicBrainzAlbumArtist.ToString());
}
externalId = item.GetProviderId(MetadataProvider.MusicBrainzArtist);
if (!string.IsNullOrEmpty(externalId))
{
writer.WriteElementString("musicbrainzartistid", externalId);
writtenProviderIds.Add(MetadataProvider.MusicBrainzArtist.ToString());
}
externalId = item.GetProviderId(MetadataProvider.MusicBrainzReleaseGroup);
if (!string.IsNullOrEmpty(externalId))
{
writer.WriteElementString("musicbrainzreleasegroupid", externalId);
writtenProviderIds.Add(MetadataProvider.MusicBrainzReleaseGroup.ToString());
}
externalId = item.GetProviderId(MetadataProvider.TvRage);
if (!string.IsNullOrEmpty(externalId))
{
writer.WriteElementString("tvrageid", externalId);
writtenProviderIds.Add(MetadataProvider.TvRage.ToString());
}
AddProviderIdAndUniqueId(writer, item, MetadataProvider.Jellyfin, writtenProviderIds, true, null, item.Id.ToString("N", CultureInfo.InvariantCulture));
if (item.ProviderIds is not null)
{
@ -764,7 +701,10 @@ namespace MediaBrowser.XbmcMetadata.Savers
XmlConvert.VerifyName(tagName);
Logger.LogDebug("Saving custom provider tagname {0}", tagName);
writer.WriteElementString(GetTagForProviderKey(providerKey), providerId);
writer.WriteElementString(tagName, providerId);
var typeName = GetUniqueIdTypeForProviderKey(providerKey);
AddUniqueId(writer, item, typeName, providerId, IsDefaultProvider(providerKey));
}
catch (ArgumentException)
{
@ -793,6 +733,56 @@ namespace MediaBrowser.XbmcMetadata.Savers
}
}
private void AddProviderIdAndUniqueId(XmlWriter writer, BaseItem item, MetadataProvider provider, HashSet<string> writtenProviderIds, bool isDefault = false, string? tagName = null, string? externalId = null)
{
AddProviderIdImpl(writer, item, provider, writtenProviderIds, true, isDefault, tagName, externalId);
}
private void AddProviderId(XmlWriter writer, BaseItem item, MetadataProvider provider, HashSet<string> writtenProviderIds, string? tagName = null, string? externalId = null)
{
AddProviderIdImpl(writer, item, provider, writtenProviderIds, false, false, tagName, externalId);
}
private void AddProviderIdImpl(XmlWriter writer, BaseItem item, MetadataProvider provider, HashSet<string> writtenProviderIds, bool addUniqueId, bool isDefault, string? tagName = null, string? externalId = null)
{
if (string.IsNullOrEmpty(externalId))
{
externalId = item.GetProviderId(provider);
}
if (!string.IsNullOrEmpty(externalId))
{
var providerKey = provider.ToString();
if (tagName is null)
{
tagName = GetTagForProviderKey(providerKey);
}
writer.WriteElementString(tagName, externalId);
writtenProviderIds.Add(providerKey);
if (addUniqueId)
{
AddUniqueId(writer, item, GetUniqueIdTypeForProviderKey(providerKey), externalId, isDefault);
}
}
}
private void AddUniqueId(XmlWriter writer, BaseItem item, string providerTypeName, string externalId, bool isDefault)
{
writer.WriteStartElement("uniqueid");
writer.WriteAttributeString("type", providerTypeName);
if (isDefault)
{
writer.WriteAttributeString("default", "true");
}
writer.WriteString(externalId);
writer.WriteEndElement();
}
private void AddCollectionItems(Folder item, XmlWriter writer)
{
var items = item.LinkedChildren
@ -1024,5 +1014,31 @@ namespace MediaBrowser.XbmcMetadata.Savers
private string GetTagForProviderKey(string providerKey)
=> providerKey.ToLowerInvariant() + "id";
private string GetUniqueIdTypeForProviderKey(string providerKey)
=> providerKey.ToLowerInvariant();
private bool IsDefaultProvider(string providerKey)
{
var defaultProvider = GetDefaultProvider();
if (defaultProvider != null)
{
var defaultProviderKey = defaultProvider.ToString();
return providerKey.Equals(defaultProviderKey, StringComparison.OrdinalIgnoreCase);
}
return false;
}
private bool IsDefaultProvider(MetadataProvider provider)
{
var defaultProvider = GetDefaultProvider();
if (defaultProvider != null)
{
return provider == defaultProvider;
}
return false;
}
}
}

View File

@ -6,6 +6,7 @@ using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO;
using MediaBrowser.XbmcMetadata.Configuration;
using Microsoft.Extensions.Logging;
@ -49,6 +50,12 @@ namespace MediaBrowser.XbmcMetadata.Savers
public override bool IsEnabledFor(BaseItem item, ItemUpdateType updateType)
=> item.SupportsLocalMetadata && item is Episode && updateType >= MinimumUpdateType;
/// <inheritdoc />
protected override MetadataProvider? GetDefaultProvider()
{
return MetadataProvider.Tvdb;
}
/// <inheritdoc />
protected override void WriteCustomElements(BaseItem item, XmlWriter writer)
{

View File

@ -91,16 +91,15 @@ namespace MediaBrowser.XbmcMetadata.Savers
return false;
}
/// <inheritdoc />
protected override MetadataProvider? GetDefaultProvider()
{
return MetadataProvider.Imdb;
}
/// <inheritdoc />
protected override void WriteCustomElements(BaseItem item, XmlWriter writer)
{
var imdb = item.GetProviderId(MetadataProvider.Imdb);
if (!string.IsNullOrEmpty(imdb))
{
writer.WriteElementString("id", imdb);
}
if (item is MusicVideo musicVideo)
{
foreach (var artist in musicVideo.Artists)

View File

@ -49,6 +49,12 @@ namespace MediaBrowser.XbmcMetadata.Savers
public override bool IsEnabledFor(BaseItem item, ItemUpdateType updateType)
=> item.SupportsLocalMetadata && item is Series && updateType >= MinimumUpdateType;
/// <inheritdoc />
protected override MetadataProvider? GetDefaultProvider()
{
return MetadataProvider.Tvdb;
}
/// <inheritdoc />
protected override void WriteCustomElements(BaseItem item, XmlWriter writer)
{
@ -58,8 +64,6 @@ namespace MediaBrowser.XbmcMetadata.Savers
if (!string.IsNullOrEmpty(tvdb))
{
writer.WriteElementString("id", tvdb);
writer.WriteStartElement("episodeguide");
var language = item.GetPreferredMetadataLanguage();