commit
35ff2be9d7
@ -0,0 +1,60 @@
|
|||||||
|
#pragma warning disable CS1591
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Emby.Server.Implementations.Images;
|
||||||
|
using MediaBrowser.Common.Configuration;
|
||||||
|
using MediaBrowser.Controller.Drawing;
|
||||||
|
using MediaBrowser.Controller.Dto;
|
||||||
|
using MediaBrowser.Controller.Entities;
|
||||||
|
using MediaBrowser.Controller.Entities.Audio;
|
||||||
|
using MediaBrowser.Controller.Entities.Movies;
|
||||||
|
using MediaBrowser.Controller.Entities.TV;
|
||||||
|
using MediaBrowser.Controller.Library;
|
||||||
|
using MediaBrowser.Controller.Playlists;
|
||||||
|
using MediaBrowser.Controller.Providers;
|
||||||
|
using MediaBrowser.Model.Entities;
|
||||||
|
using MediaBrowser.Model.IO;
|
||||||
|
using MediaBrowser.Model.Querying;
|
||||||
|
|
||||||
|
namespace Emby.Server.Implementations.Images
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Class ArtistImageProvider.
|
||||||
|
/// </summary>
|
||||||
|
public class ArtistImageProvider : BaseDynamicImageProvider<MusicArtist>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The library manager.
|
||||||
|
/// </summary>
|
||||||
|
private readonly ILibraryManager _libraryManager;
|
||||||
|
|
||||||
|
public ArtistImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager) : base(fileSystem, providerManager, applicationPaths, imageProcessor)
|
||||||
|
{
|
||||||
|
_libraryManager = libraryManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get children objects used to create an artist image.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="item">The artist used to create the image.</param>
|
||||||
|
/// <returns>Any relevant children objects.</returns>
|
||||||
|
protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem item)
|
||||||
|
{
|
||||||
|
return Array.Empty<BaseItem>();
|
||||||
|
|
||||||
|
// TODO enable this when BaseDynamicImageProvider objects are configurable
|
||||||
|
// return _libraryManager.GetItemList(new InternalItemsQuery
|
||||||
|
// {
|
||||||
|
// ArtistIds = new[] { item.Id },
|
||||||
|
// IncludeItemTypes = new[] { typeof(MusicAlbum).Name },
|
||||||
|
// OrderBy = new[] { (ItemSortBy.Random, SortOrder.Ascending) },
|
||||||
|
// Limit = 4,
|
||||||
|
// Recursive = true,
|
||||||
|
// ImageTypes = new[] { ImageType.Primary },
|
||||||
|
// DtoOptions = new DtoOptions(false)
|
||||||
|
// });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,66 @@
|
|||||||
|
#pragma warning disable CS1591
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using MediaBrowser.Common.Configuration;
|
||||||
|
using MediaBrowser.Controller.Drawing;
|
||||||
|
using MediaBrowser.Controller.Entities;
|
||||||
|
using MediaBrowser.Controller.Entities.Audio;
|
||||||
|
using MediaBrowser.Controller.Entities.TV;
|
||||||
|
using MediaBrowser.Controller.Playlists;
|
||||||
|
using MediaBrowser.Controller.Providers;
|
||||||
|
using MediaBrowser.Model.Entities;
|
||||||
|
using MediaBrowser.Model.IO;
|
||||||
|
|
||||||
|
namespace Emby.Server.Implementations.Images
|
||||||
|
{
|
||||||
|
public class PlaylistImageProvider : BaseDynamicImageProvider<Playlist>
|
||||||
|
{
|
||||||
|
public PlaylistImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor) : base(fileSystem, providerManager, applicationPaths, imageProcessor)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem item)
|
||||||
|
{
|
||||||
|
var playlist = (Playlist)item;
|
||||||
|
|
||||||
|
return playlist.GetManageableItems()
|
||||||
|
.Select(i =>
|
||||||
|
{
|
||||||
|
var subItem = i.Item2;
|
||||||
|
|
||||||
|
var episode = subItem as Episode;
|
||||||
|
|
||||||
|
if (episode != null)
|
||||||
|
{
|
||||||
|
var series = episode.Series;
|
||||||
|
if (series != null && series.HasImage(ImageType.Primary))
|
||||||
|
{
|
||||||
|
return series;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (subItem.HasImage(ImageType.Primary))
|
||||||
|
{
|
||||||
|
return subItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
var parent = subItem.GetOwner() ?? subItem.GetParent();
|
||||||
|
|
||||||
|
if (parent != null && parent.HasImage(ImageType.Primary))
|
||||||
|
{
|
||||||
|
if (parent is MusicAlbum)
|
||||||
|
{
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
})
|
||||||
|
.Where(i => i != null)
|
||||||
|
.GroupBy(x => x.Id)
|
||||||
|
.Select(x => x.First())
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,117 @@
|
|||||||
|
{
|
||||||
|
"LabelRunningTimeValue": "Duración: {0}",
|
||||||
|
"ValueSpecialEpisodeName": "Especial - {0}",
|
||||||
|
"Sync": "Sincronizar",
|
||||||
|
"Songs": "Canciones",
|
||||||
|
"Shows": "Programas",
|
||||||
|
"Playlists": "Listas de reproducción",
|
||||||
|
"Photos": "Fotos",
|
||||||
|
"Movies": "Películas",
|
||||||
|
"HeaderNextUp": "A continuación",
|
||||||
|
"HeaderLiveTV": "TV en vivo",
|
||||||
|
"HeaderFavoriteSongs": "Canciones favoritas",
|
||||||
|
"HeaderFavoriteArtists": "Artistas favoritos",
|
||||||
|
"HeaderFavoriteAlbums": "Álbumes favoritos",
|
||||||
|
"HeaderFavoriteEpisodes": "Episodios favoritos",
|
||||||
|
"HeaderFavoriteShows": "Programas favoritos",
|
||||||
|
"HeaderContinueWatching": "Continuar viendo",
|
||||||
|
"HeaderAlbumArtists": "Artistas del álbum",
|
||||||
|
"Genres": "Géneros",
|
||||||
|
"Folders": "Carpetas",
|
||||||
|
"Favorites": "Favoritos",
|
||||||
|
"Collections": "Colecciones",
|
||||||
|
"Channels": "Canales",
|
||||||
|
"Books": "Libros",
|
||||||
|
"Artists": "Artistas",
|
||||||
|
"Albums": "Álbumes",
|
||||||
|
"TaskDownloadMissingSubtitlesDescription": "Busca subtítulos faltantes en Internet basándose en la configuración de metadatos.",
|
||||||
|
"TaskDownloadMissingSubtitles": "Descargar subtítulos faltantes",
|
||||||
|
"TaskRefreshChannelsDescription": "Actualiza la información de canales de Internet.",
|
||||||
|
"TaskRefreshChannels": "Actualizar canales",
|
||||||
|
"TaskCleanTranscodeDescription": "Elimina archivos transcodificados que tengan más de un día.",
|
||||||
|
"TaskCleanTranscode": "Limpiar directorio de transcodificado",
|
||||||
|
"TaskUpdatePluginsDescription": "Descarga e instala actualizaciones para complementos que están configurados para actualizarse automáticamente.",
|
||||||
|
"TaskUpdatePlugins": "Actualizar complementos",
|
||||||
|
"TaskRefreshPeopleDescription": "Actualiza metadatos de actores y directores en tu biblioteca de medios.",
|
||||||
|
"TaskRefreshPeople": "Actualizar personas",
|
||||||
|
"TaskCleanLogsDescription": "Elimina archivos de registro con más de {0} días de antigüedad.",
|
||||||
|
"TaskCleanLogs": "Limpiar directorio de registros",
|
||||||
|
"TaskRefreshLibraryDescription": "Escanea tu biblioteca de medios por archivos nuevos y actualiza los metadatos.",
|
||||||
|
"TaskRefreshLibrary": "Escanear biblioteca de medios",
|
||||||
|
"TaskRefreshChapterImagesDescription": "Crea miniaturas para videos que tienen capítulos.",
|
||||||
|
"TaskRefreshChapterImages": "Extraer imágenes de los capítulos",
|
||||||
|
"TaskCleanCacheDescription": "Elimina archivos caché que ya no son necesarios para el sistema.",
|
||||||
|
"TaskCleanCache": "Limpiar directorio caché",
|
||||||
|
"TasksChannelsCategory": "Canales de Internet",
|
||||||
|
"TasksApplicationCategory": "Aplicación",
|
||||||
|
"TasksLibraryCategory": "Biblioteca",
|
||||||
|
"TasksMaintenanceCategory": "Mantenimiento",
|
||||||
|
"VersionNumber": "Versión {0}",
|
||||||
|
"ValueHasBeenAddedToLibrary": "{0} se ha añadido a tu biblioteca de medios",
|
||||||
|
"UserStoppedPlayingItemWithValues": "{0} ha terminado de reproducir {1} en {2}",
|
||||||
|
"UserStartedPlayingItemWithValues": "{0} está reproduciendo {1} en {2}",
|
||||||
|
"UserPolicyUpdatedWithName": "La política de usuario ha sido actualizada para {0}",
|
||||||
|
"UserPasswordChangedWithName": "Se ha cambiado la contraseña para el usuario {0}",
|
||||||
|
"UserOnlineFromDevice": "{0} está en línea desde {1}",
|
||||||
|
"UserOfflineFromDevice": "{0} se ha desconectado desde {1}",
|
||||||
|
"UserLockedOutWithName": "El usuario {0} ha sido bloqueado",
|
||||||
|
"UserDownloadingItemWithValues": "{0} está descargando {1}",
|
||||||
|
"UserDeletedWithName": "El usuario {0} ha sido eliminado",
|
||||||
|
"UserCreatedWithName": "El usuario {0} ha sido creado",
|
||||||
|
"User": "Usuario",
|
||||||
|
"TvShows": "Programas de TV",
|
||||||
|
"System": "Sistema",
|
||||||
|
"SubtitleDownloadFailureFromForItem": "Falló la descarga de subtítulos desde {0} para {1}",
|
||||||
|
"StartupEmbyServerIsLoading": "El servidor Jellyfin está cargando. Por favor, intente de nuevo pronto.",
|
||||||
|
"ServerNameNeedsToBeRestarted": "{0} debe ser reiniciado",
|
||||||
|
"ScheduledTaskStartedWithName": "{0} iniciado",
|
||||||
|
"ScheduledTaskFailedWithName": "{0} falló",
|
||||||
|
"ProviderValue": "Proveedor: {0}",
|
||||||
|
"PluginUpdatedWithName": "{0} fue actualizado",
|
||||||
|
"PluginUninstalledWithName": "{0} fue desinstalado",
|
||||||
|
"PluginInstalledWithName": "{0} fue instalado",
|
||||||
|
"Plugin": "Complemento",
|
||||||
|
"NotificationOptionVideoPlaybackStopped": "Reproducción de video detenida",
|
||||||
|
"NotificationOptionVideoPlayback": "Reproducción de video iniciada",
|
||||||
|
"NotificationOptionUserLockedOut": "Usuario bloqueado",
|
||||||
|
"NotificationOptionTaskFailed": "Falla de tarea programada",
|
||||||
|
"NotificationOptionServerRestartRequired": "Se necesita reiniciar el servidor",
|
||||||
|
"NotificationOptionPluginUpdateInstalled": "Actualización de complemento instalada",
|
||||||
|
"NotificationOptionPluginUninstalled": "Complemento desinstalado",
|
||||||
|
"NotificationOptionPluginInstalled": "Complemento instalado",
|
||||||
|
"NotificationOptionPluginError": "Falla de complemento",
|
||||||
|
"NotificationOptionNewLibraryContent": "Nuevo contenido agregado",
|
||||||
|
"NotificationOptionInstallationFailed": "Falla de instalación",
|
||||||
|
"NotificationOptionCameraImageUploaded": "Imagen de la cámara subida",
|
||||||
|
"NotificationOptionAudioPlaybackStopped": "Reproducción de audio detenida",
|
||||||
|
"NotificationOptionAudioPlayback": "Reproducción de audio iniciada",
|
||||||
|
"NotificationOptionApplicationUpdateInstalled": "Actualización de la aplicación instalada",
|
||||||
|
"NotificationOptionApplicationUpdateAvailable": "Actualización de la aplicación disponible",
|
||||||
|
"NewVersionIsAvailable": "Una nueva versión del Servidor Jellyfin está disponible para descargar.",
|
||||||
|
"NameSeasonUnknown": "Temporada desconocida",
|
||||||
|
"NameSeasonNumber": "Temporada {0}",
|
||||||
|
"NameInstallFailed": "Falló la instalación de {0}",
|
||||||
|
"MusicVideos": "Videos musicales",
|
||||||
|
"Music": "Música",
|
||||||
|
"MixedContent": "Contenido mezclado",
|
||||||
|
"MessageServerConfigurationUpdated": "Se ha actualizado la configuración del servidor",
|
||||||
|
"MessageNamedServerConfigurationUpdatedWithValue": "Se ha actualizado la sección {0} de la configuración del servidor",
|
||||||
|
"MessageApplicationUpdatedTo": "El servidor Jellyfin ha sido actualizado a {0}",
|
||||||
|
"MessageApplicationUpdated": "El servidor Jellyfin ha sido actualizado",
|
||||||
|
"Latest": "Recientes",
|
||||||
|
"LabelIpAddressValue": "Dirección IP: {0}",
|
||||||
|
"ItemRemovedWithName": "{0} fue removido de la biblioteca",
|
||||||
|
"ItemAddedWithName": "{0} fue agregado a la biblioteca",
|
||||||
|
"Inherit": "Heredar",
|
||||||
|
"HomeVideos": "Videos caseros",
|
||||||
|
"HeaderRecordingGroups": "Grupos de grabación",
|
||||||
|
"HeaderCameraUploads": "Subidas desde la cámara",
|
||||||
|
"FailedLoginAttemptWithUserName": "Intento fallido de inicio de sesión desde {0}",
|
||||||
|
"DeviceOnlineWithName": "{0} está conectado",
|
||||||
|
"DeviceOfflineWithName": "{0} se ha desconectado",
|
||||||
|
"ChapterNameValue": "Capítulo {0}",
|
||||||
|
"CameraImageUploadedFrom": "Una nueva imagen de cámara ha sido subida desde {0}",
|
||||||
|
"AuthenticationSucceededWithUserName": "{0} autenticado con éxito",
|
||||||
|
"Application": "Aplicación",
|
||||||
|
"AppDeviceValues": "App: {0}, Dispositivo: {1}"
|
||||||
|
}
|
@ -0,0 +1,99 @@
|
|||||||
|
{
|
||||||
|
"VersionNumber": "பதிப்பு {0}",
|
||||||
|
"ValueSpecialEpisodeName": "சிறப்பு - {0}",
|
||||||
|
"TasksMaintenanceCategory": "பராமரிப்பு",
|
||||||
|
"TaskCleanCache": "தற்காலிக சேமிப்பு கோப்பகத்தை சுத்தம் செய்யவும்",
|
||||||
|
"TaskRefreshChapterImages": "அத்தியாயப் படங்களை பிரித்தெடுக்கவும்",
|
||||||
|
"TaskRefreshPeople": "மக்களைப் புதுப்பிக்கவும்",
|
||||||
|
"TaskCleanTranscode": "டிரான்ஸ்கோட் கோப்பகத்தை சுத்தம் செய்யவும்",
|
||||||
|
"TaskRefreshChannelsDescription": "இணையச் சேனல் தகவல்களைப் புதுப்பிக்கிறது.",
|
||||||
|
"System": "ஒருங்கியம்",
|
||||||
|
"NotificationOptionTaskFailed": "திட்டமிடப்பட்ட பணி தோல்வியடைந்தது",
|
||||||
|
"NotificationOptionPluginUpdateInstalled": "உட்செருகி புதுப்பிக்கப்பட்டது",
|
||||||
|
"NotificationOptionPluginUninstalled": "உட்செருகி நீக்கப்பட்டது",
|
||||||
|
"NotificationOptionPluginInstalled": "உட்செருகி நிறுவப்பட்டது",
|
||||||
|
"NotificationOptionPluginError": "உட்செருகி செயலிழந்தது",
|
||||||
|
"NotificationOptionCameraImageUploaded": "புகைப்படம் பதிவேற்றப்பட்டது",
|
||||||
|
"MixedContent": "கலப்பு உள்ளடக்கங்கள்",
|
||||||
|
"MessageServerConfigurationUpdated": "சேவையக அமைப்புகள் புதுப்பிக்கப்பட்டன",
|
||||||
|
"MessageApplicationUpdatedTo": "ஜெல்லிஃபின் சேவையகம் {0} இற்கு புதுப்பிக்கப்பட்டது",
|
||||||
|
"MessageApplicationUpdated": "ஜெல்லிஃபின் சேவையகம் புதுப்பிக்கப்பட்டது",
|
||||||
|
"Inherit": "மரபரிமையாகப் பெறு",
|
||||||
|
"HeaderRecordingGroups": "பதிவு குழுக்கள்",
|
||||||
|
"HeaderCameraUploads": "புகைப்பட பதிவேற்றங்கள்",
|
||||||
|
"Folders": "கோப்புறைகள்",
|
||||||
|
"FailedLoginAttemptWithUserName": "{0} இலிருந்து உள்நுழைவு முயற்சி தோல்வியடைந்தது",
|
||||||
|
"DeviceOnlineWithName": "{0} இணைக்கப்பட்டது",
|
||||||
|
"DeviceOfflineWithName": "{0} துண்டிக்கப்பட்டது",
|
||||||
|
"Collections": "தொகுப்புகள்",
|
||||||
|
"CameraImageUploadedFrom": "{0} இலிருந்து புதிய புகைப்படம் பதிவேற்றப்பட்டது",
|
||||||
|
"AppDeviceValues": "செயலி: {0}, சாதனம்: {1}",
|
||||||
|
"TaskDownloadMissingSubtitles": "விடுபட்டுபோன வசன வரிகளைப் பதிவிறக்கு",
|
||||||
|
"TaskRefreshChannels": "சேனல்களை புதுப்பி",
|
||||||
|
"TaskUpdatePlugins": "உட்செருகிகளை புதுப்பி",
|
||||||
|
"TaskRefreshLibrary": "மீடியா நூலகத்தை ஆராய்",
|
||||||
|
"TasksChannelsCategory": "இணைய சேனல்கள்",
|
||||||
|
"TasksApplicationCategory": "செயலி",
|
||||||
|
"TasksLibraryCategory": "நூலகம்",
|
||||||
|
"UserPolicyUpdatedWithName": "பயனர் கொள்கை {0} இற்கு புதுப்பிக்கப்பட்டுள்ளது",
|
||||||
|
"UserPasswordChangedWithName": "{0} பயனருக்கு கடவுச்சொல் மாற்றப்பட்டுள்ளது",
|
||||||
|
"UserLockedOutWithName": "பயனர் {0} முடக்கப்பட்டார்",
|
||||||
|
"UserDownloadingItemWithValues": "{0} ஆல் {1} பதிவிறக்கப்படுகிறது",
|
||||||
|
"UserDeletedWithName": "பயனர் {0} நீக்கப்பட்டார்",
|
||||||
|
"UserCreatedWithName": "பயனர் {0} உருவாக்கப்பட்டார்",
|
||||||
|
"User": "பயனர்",
|
||||||
|
"TvShows": "தொலைக்காட்சித் தொடர்கள்",
|
||||||
|
"Sync": "ஒத்திசைவு",
|
||||||
|
"StartupEmbyServerIsLoading": "ஜெல்லிஃபின் சேவையகம் துவங்குகிறது. சிறிது நேரம் கழித்து முயற்சிக்கவும்.",
|
||||||
|
"Songs": "பாட்டுகள்",
|
||||||
|
"Shows": "தொடர்கள்",
|
||||||
|
"ServerNameNeedsToBeRestarted": "{0} மறுதொடக்கம் செய்யப்பட வேண்டும்",
|
||||||
|
"ScheduledTaskStartedWithName": "{0} துவங்கியது",
|
||||||
|
"ScheduledTaskFailedWithName": "{0} தோல்வியடைந்தது",
|
||||||
|
"ProviderValue": "வழங்குநர்: {0}",
|
||||||
|
"PluginUpdatedWithName": "{0} புதுப்பிக்கப்பட்டது",
|
||||||
|
"PluginUninstalledWithName": "{0} நீக்கப்பட்டது",
|
||||||
|
"PluginInstalledWithName": "{0} நிறுவப்பட்டது",
|
||||||
|
"Plugin": "உட்செருகி",
|
||||||
|
"Playlists": "தொடர் பட்டியல்கள்",
|
||||||
|
"Photos": "புகைப்படங்கள்",
|
||||||
|
"NotificationOptionVideoPlaybackStopped": "நிகழ்பட ஒளிபரப்பு நிறுத்தப்பட்டது",
|
||||||
|
"NotificationOptionVideoPlayback": "நிகழ்பட ஒளிபரப்பு துவங்கியது",
|
||||||
|
"NotificationOptionUserLockedOut": "பயனர் கணக்கு முடக்கப்பட்டது",
|
||||||
|
"NotificationOptionServerRestartRequired": "சேவையக மறுதொடக்கம் தேவை",
|
||||||
|
"NotificationOptionNewLibraryContent": "புதிய உள்ளடக்கங்கள் சேர்க்கப்பட்டன",
|
||||||
|
"NotificationOptionInstallationFailed": "நிறுவல் தோல்வியடைந்தது",
|
||||||
|
"NotificationOptionAudioPlaybackStopped": "ஒலி இசைத்தல் நிறுத்தப்பட்டது",
|
||||||
|
"NotificationOptionAudioPlayback": "ஒலி இசைக்கத் துவங்கியுள்ளது",
|
||||||
|
"NotificationOptionApplicationUpdateInstalled": "செயலி புதுப்பிக்கப்பட்டது",
|
||||||
|
"NotificationOptionApplicationUpdateAvailable": "செயலியினை புதுப்பிக்கலாம்",
|
||||||
|
"NameSeasonUnknown": "பருவம் அறியப்படாதவை",
|
||||||
|
"NameSeasonNumber": "பருவம் {0}",
|
||||||
|
"NameInstallFailed": "{0} நிறுவல் தோல்வியடைந்தது",
|
||||||
|
"MusicVideos": "இசைப்படங்கள்",
|
||||||
|
"Music": "இசை",
|
||||||
|
"Movies": "திரைப்படங்கள்",
|
||||||
|
"Latest": "புதியன",
|
||||||
|
"LabelRunningTimeValue": "ஓடும் நேரம்: {0}",
|
||||||
|
"LabelIpAddressValue": "ஐபி முகவரி: {0}",
|
||||||
|
"ItemRemovedWithName": "{0} நூலகத்திலிருந்து அகற்றப்பட்டது",
|
||||||
|
"ItemAddedWithName": "{0} நூலகத்தில் சேர்க்கப்பட்டது",
|
||||||
|
"HeaderNextUp": "அடுத்ததாக",
|
||||||
|
"HeaderLiveTV": "நேரடித் தொலைக்காட்சி",
|
||||||
|
"HeaderFavoriteSongs": "பிடித்த பாட்டுகள்",
|
||||||
|
"HeaderFavoriteShows": "பிடித்த தொடர்கள்",
|
||||||
|
"HeaderFavoriteEpisodes": "பிடித்த அத்தியாயங்கள்",
|
||||||
|
"HeaderFavoriteArtists": "பிடித்த கலைஞர்கள்",
|
||||||
|
"HeaderFavoriteAlbums": "பிடித்த ஆல்பங்கள்",
|
||||||
|
"HeaderContinueWatching": "தொடர்ந்து பார்",
|
||||||
|
"HeaderAlbumArtists": "இசைக் கலைஞர்கள்",
|
||||||
|
"Genres": "வகைகள்",
|
||||||
|
"Favorites": "பிடித்தவை",
|
||||||
|
"ChapterNameValue": "அத்தியாயம் {0}",
|
||||||
|
"Channels": "சேனல்கள்",
|
||||||
|
"Books": "புத்தகங்கள்",
|
||||||
|
"AuthenticationSucceededWithUserName": "{0} வெற்றிகரமாக அங்கீகரிக்கப்பட்டது",
|
||||||
|
"Artists": "கலைஞர்கள்",
|
||||||
|
"Application": "செயலி",
|
||||||
|
"Albums": "ஆல்பங்கள்"
|
||||||
|
}
|
@ -1,18 +0,0 @@
|
|||||||
using System.IO;
|
|
||||||
using MediaBrowser.Model.Services;
|
|
||||||
|
|
||||||
namespace Emby.Server.Implementations.SocketSharp
|
|
||||||
{
|
|
||||||
public class HttpFile : IHttpFile
|
|
||||||
{
|
|
||||||
public string Name { get; set; }
|
|
||||||
|
|
||||||
public string FileName { get; set; }
|
|
||||||
|
|
||||||
public long ContentLength { get; set; }
|
|
||||||
|
|
||||||
public string ContentType { get; set; }
|
|
||||||
|
|
||||||
public Stream InputStream { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,198 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.IO;
|
|
||||||
|
|
||||||
public sealed class HttpPostedFile : IDisposable
|
|
||||||
{
|
|
||||||
private string _name;
|
|
||||||
private string _contentType;
|
|
||||||
private Stream _stream;
|
|
||||||
private bool _disposed = false;
|
|
||||||
|
|
||||||
internal HttpPostedFile(string name, string content_type, Stream base_stream, long offset, long length)
|
|
||||||
{
|
|
||||||
_name = name;
|
|
||||||
_contentType = content_type;
|
|
||||||
_stream = new ReadSubStream(base_stream, offset, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
public string ContentType => _contentType;
|
|
||||||
|
|
||||||
public int ContentLength => (int)_stream.Length;
|
|
||||||
|
|
||||||
public string FileName => _name;
|
|
||||||
|
|
||||||
public Stream InputStream => _stream;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Releases the unmanaged resources and disposes of the managed resources used.
|
|
||||||
/// </summary>
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
if (_disposed)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_stream.Dispose();
|
|
||||||
_stream = null;
|
|
||||||
|
|
||||||
_name = null;
|
|
||||||
_contentType = null;
|
|
||||||
|
|
||||||
_disposed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private class ReadSubStream : Stream
|
|
||||||
{
|
|
||||||
private Stream _stream;
|
|
||||||
private long _offset;
|
|
||||||
private long _end;
|
|
||||||
private long _position;
|
|
||||||
|
|
||||||
public ReadSubStream(Stream s, long offset, long length)
|
|
||||||
{
|
|
||||||
_stream = s;
|
|
||||||
_offset = offset;
|
|
||||||
_end = offset + length;
|
|
||||||
_position = offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool CanRead => true;
|
|
||||||
|
|
||||||
public override bool CanSeek => true;
|
|
||||||
|
|
||||||
public override bool CanWrite => false;
|
|
||||||
|
|
||||||
public override long Length => _end - _offset;
|
|
||||||
|
|
||||||
public override long Position
|
|
||||||
{
|
|
||||||
get => _position - _offset;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (value > Length)
|
|
||||||
{
|
|
||||||
throw new ArgumentOutOfRangeException(nameof(value));
|
|
||||||
}
|
|
||||||
|
|
||||||
_position = Seek(value, SeekOrigin.Begin);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Flush()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public override int Read(byte[] buffer, int dest_offset, int count)
|
|
||||||
{
|
|
||||||
if (buffer == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(buffer));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dest_offset < 0)
|
|
||||||
{
|
|
||||||
throw new ArgumentOutOfRangeException(nameof(dest_offset), "< 0");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count < 0)
|
|
||||||
{
|
|
||||||
throw new ArgumentOutOfRangeException(nameof(count), "< 0");
|
|
||||||
}
|
|
||||||
|
|
||||||
int len = buffer.Length;
|
|
||||||
if (dest_offset > len)
|
|
||||||
{
|
|
||||||
throw new ArgumentException("destination offset is beyond array size", nameof(dest_offset));
|
|
||||||
}
|
|
||||||
|
|
||||||
// reordered to avoid possible integer overflow
|
|
||||||
if (dest_offset > len - count)
|
|
||||||
{
|
|
||||||
throw new ArgumentException("Reading would overrun buffer", nameof(count));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count > _end - _position)
|
|
||||||
{
|
|
||||||
count = (int)(_end - _position);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count <= 0)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
_stream.Position = _position;
|
|
||||||
int result = _stream.Read(buffer, dest_offset, count);
|
|
||||||
if (result > 0)
|
|
||||||
{
|
|
||||||
_position += result;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_position = _end;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override int ReadByte()
|
|
||||||
{
|
|
||||||
if (_position >= _end)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
_stream.Position = _position;
|
|
||||||
int result = _stream.ReadByte();
|
|
||||||
if (result < 0)
|
|
||||||
{
|
|
||||||
_position = _end;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_position++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override long Seek(long d, SeekOrigin origin)
|
|
||||||
{
|
|
||||||
long real;
|
|
||||||
switch (origin)
|
|
||||||
{
|
|
||||||
case SeekOrigin.Begin:
|
|
||||||
real = _offset + d;
|
|
||||||
break;
|
|
||||||
case SeekOrigin.End:
|
|
||||||
real = _end + d;
|
|
||||||
break;
|
|
||||||
case SeekOrigin.Current:
|
|
||||||
real = _position + d;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new ArgumentException("Unknown SeekOrigin value", nameof(origin));
|
|
||||||
}
|
|
||||||
|
|
||||||
long virt = real - _offset;
|
|
||||||
if (virt < 0 || virt > Length)
|
|
||||||
{
|
|
||||||
throw new ArgumentException("Invalid position", nameof(d));
|
|
||||||
}
|
|
||||||
|
|
||||||
_position = _stream.Seek(real, SeekOrigin.Begin);
|
|
||||||
return _position;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void SetLength(long value)
|
|
||||||
{
|
|
||||||
throw new NotSupportedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Write(byte[] buffer, int offset, int count)
|
|
||||||
{
|
|
||||||
throw new NotSupportedException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue