mirror of
				https://github.com/zoriya/Kyoo.git
				synced 2025-11-04 03:27:14 -05:00 
			
		
		
		
	Trying to fix the edit
This commit is contained in:
		
							parent
							
								
									28d48e9daf
								
							
						
					
					
						commit
						5f030b281f
					
				@ -44,7 +44,6 @@ namespace Kyoo.Controllers
 | 
				
			|||||||
		//Register values
 | 
							//Register values
 | 
				
			||||||
		void Register(object obj);
 | 
							void Register(object obj);
 | 
				
			||||||
		Task Edit(object obj, bool resetOld);
 | 
							Task Edit(object obj, bool resetOld);
 | 
				
			||||||
		void RegisterShowLinks(Library library, Collection collection, Show show);
 | 
					 | 
				
			||||||
		Task SaveChanges();
 | 
							Task SaveChanges();
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		// Validate values
 | 
							// Validate values
 | 
				
			||||||
 | 
				
			|||||||
@ -7,7 +7,7 @@ namespace Kyoo.Models
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	public class Show : IOnMerge
 | 
						public class Show : IOnMerge
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		[JsonIgnore] public long ID { get; set; }
 | 
							[NotMergableAttribute] [JsonIgnore] public long ID { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		public string Slug { get; set; }
 | 
							public string Slug { get; set; }
 | 
				
			||||||
		public string Title { get; set; }
 | 
							public string Title { get; set; }
 | 
				
			||||||
 | 
				
			|||||||
@ -99,7 +99,10 @@ namespace Kyoo
 | 
				
			|||||||
			if (second == null)
 | 
								if (second == null)
 | 
				
			||||||
				return first;
 | 
									return first;
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			Type type = typeof(T);
 | 
								Type type = first.GetType();
 | 
				
			||||||
 | 
								if (second.GetType() != type && second.GetType().IsAssignableFrom(type))
 | 
				
			||||||
 | 
									type = second.GetType();
 | 
				
			||||||
 | 
								
 | 
				
			||||||
			foreach (PropertyInfo property in type.GetProperties().Where(x => x.CanRead && x.CanWrite))
 | 
								foreach (PropertyInfo property in type.GetProperties().Where(x => x.CanRead && x.CanWrite))
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				if (Attribute.GetCustomAttribute(property, typeof(NotMergableAttribute)) != null)
 | 
									if (Attribute.GetCustomAttribute(property, typeof(NotMergableAttribute)) != null)
 | 
				
			||||||
@ -131,10 +134,10 @@ namespace Kyoo
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		public static T Nullify<T>(T obj)
 | 
							public static T Nullify<T>(T obj)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			Type type = typeof(T);
 | 
								Type type = obj.GetType();
 | 
				
			||||||
			foreach (PropertyInfo property in type.GetProperties())
 | 
								foreach (PropertyInfo property in type.GetProperties())
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				if (!property.CanWrite)
 | 
									if (!property.CanWrite || Attribute.GetCustomAttribute(property, typeof(NotMergableAttribute)) != null)
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
				
 | 
									
 | 
				
			||||||
				object defaultValue = property.PropertyType.IsValueType 
 | 
									object defaultValue = property.PropertyType.IsValueType 
 | 
				
			||||||
 | 
				
			|||||||
@ -191,20 +191,6 @@ namespace Kyoo.Controllers
 | 
				
			|||||||
			});
 | 
								});
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		public void RegisterShowLinks(Library library, Collection collection, Show show)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			if (collection != null)
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				_database.LibraryLinks.AddIfNotExist(new LibraryLink {Library = library, Collection = collection},
 | 
					 | 
				
			||||||
					x => x.Library == library && x.Collection == collection && x.ShowID == null);
 | 
					 | 
				
			||||||
				_database.CollectionLinks.AddIfNotExist(new CollectionLink { Collection = collection, Show = show},
 | 
					 | 
				
			||||||
					x => x.Collection == collection && x.Show == show);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				_database.LibraryLinks.AddIfNotExist(new LibraryLink {Library = library, Show = show},
 | 
					 | 
				
			||||||
					x => x.Library == library && x.Collection == null && x.Show == show);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		public Task SaveChanges()
 | 
							public Task SaveChanges()
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			return SaveChanges(0);
 | 
								return SaveChanges(0);
 | 
				
			||||||
@ -240,11 +226,12 @@ namespace Kyoo.Controllers
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				if (resetOld)
 | 
									if (resetOld)
 | 
				
			||||||
					Utility.Nullify(existing);
 | 
										Utility.Nullify(existing);
 | 
				
			||||||
 | 
									_database.ChangeTracker.DetectChanges();
 | 
				
			||||||
				Utility.Merge(existing, obj);
 | 
									Utility.Merge(existing, obj);
 | 
				
			||||||
				
 | 
									
 | 
				
			||||||
				ValidateRootEntry(_database.Entry(existing), entry => entry.State != EntityState.Added);
 | 
					 | 
				
			||||||
				
 | 
					 | 
				
			||||||
				_database.ChangeTracker.DetectChanges();
 | 
									_database.ChangeTracker.DetectChanges();
 | 
				
			||||||
 | 
									ValidateRootEntry(_database.Entry(existing), entry => entry.State != EntityState.Unchanged 
 | 
				
			||||||
 | 
									                                                      && entry.State != EntityState.Deleted);
 | 
				
			||||||
				await _database.SaveChangesAsync();
 | 
									await _database.SaveChangesAsync();
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			finally
 | 
								finally
 | 
				
			||||||
@ -277,12 +264,14 @@ namespace Kyoo.Controllers
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		private void ValidateRootEntry(EntityEntry entry, Func<EntityEntry, bool> shouldRun)
 | 
							private void ValidateRootEntry(EntityEntry entry, Func<EntityEntry, bool> shouldRun, object parentObject = null)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if (!shouldRun.Invoke(entry))
 | 
								if (!shouldRun.Invoke(entry))
 | 
				
			||||||
				return;
 | 
									return;
 | 
				
			||||||
			foreach (NavigationEntry navigation in entry.Navigations)
 | 
								foreach (NavigationEntry navigation in entry.Navigations)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
 | 
									if (!navigation.Metadata.IsCollection() && ReferenceEquals(navigation.CurrentValue, parentObject))
 | 
				
			||||||
 | 
										continue;
 | 
				
			||||||
				ValidateNavigation(navigation);
 | 
									ValidateNavigation(navigation);
 | 
				
			||||||
				if (navigation.CurrentValue == null)
 | 
									if (navigation.CurrentValue == null)
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
@ -290,10 +279,14 @@ namespace Kyoo.Controllers
 | 
				
			|||||||
				{
 | 
									{
 | 
				
			||||||
					IEnumerable entities = (IEnumerable)navigation.CurrentValue;
 | 
										IEnumerable entities = (IEnumerable)navigation.CurrentValue;
 | 
				
			||||||
					foreach (object childEntry in entities)
 | 
										foreach (object childEntry in entities)
 | 
				
			||||||
						ValidateRootEntry(_database.Entry(childEntry), shouldRun);
 | 
										{
 | 
				
			||||||
 | 
											if (ReferenceEquals(childEntry, parentObject))
 | 
				
			||||||
 | 
												continue;
 | 
				
			||||||
 | 
											ValidateRootEntry(_database.Entry(childEntry), shouldRun, entry.Entity);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				else
 | 
									else
 | 
				
			||||||
					ValidateRootEntry(_database.Entry(navigation.CurrentValue), shouldRun);
 | 
										ValidateRootEntry(_database.Entry(navigation.CurrentValue), shouldRun, entry.Entity);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -335,7 +328,7 @@ namespace Kyoo.Controllers
 | 
				
			|||||||
			return list.Select(x =>
 | 
								return list.Select(x =>
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				T tmp = Validate(x);
 | 
									T tmp = Validate(x);
 | 
				
			||||||
				if (tmp != x)
 | 
									if (!ReferenceEquals(x, tmp))
 | 
				
			||||||
					_database.Entry(x).State = EntityState.Detached;
 | 
										_database.Entry(x).State = EntityState.Detached;
 | 
				
			||||||
				return tmp ?? x;
 | 
									return tmp ?? x;
 | 
				
			||||||
			})/*.GroupBy(GetSlug).Select(x => x.First()).Where(x => x != null)*/.ToList();
 | 
								})/*.GroupBy(GetSlug).Select(x => x.First()).Where(x => x != null)*/.ToList();
 | 
				
			||||||
@ -345,13 +338,41 @@ namespace Kyoo.Controllers
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			return obj switch
 | 
								return obj switch
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				Library library => GetLibrary(library.Slug),
 | 
									Library library => _database.Libraries
 | 
				
			||||||
				Collection collection => GetCollection(collection.Slug),
 | 
										.Include(x => x.Links)
 | 
				
			||||||
				Show show => GetShow(show.Slug),
 | 
										.Include(x => x.Providers)
 | 
				
			||||||
				Season season => GetSeason(season.Show.Slug, season.SeasonNumber),
 | 
										.FirstOrDefault(x => x.Slug == library.Slug),
 | 
				
			||||||
				Episode episode => GetEpisode(episode.Show.Slug, episode.SeasonNumber, episode.EpisodeNumber),
 | 
									Collection collection => _database.Collections
 | 
				
			||||||
				Studio studio => GetStudio(studio.Slug),
 | 
										.Include(x => x.Links)
 | 
				
			||||||
				People people => GetPeople(people.Slug),
 | 
										.FirstOrDefault(x => x.Slug == collection.Slug),
 | 
				
			||||||
 | 
									Show show => _database.Shows
 | 
				
			||||||
 | 
										.Include(x => x.Seasons)
 | 
				
			||||||
 | 
										.Include(x => x.Episodes)
 | 
				
			||||||
 | 
										.Include(x => x.People)
 | 
				
			||||||
 | 
										.Include(x => x.GenreLinks)
 | 
				
			||||||
 | 
										.Include(x => x.Studio)
 | 
				
			||||||
 | 
										.Include(x => x.ExternalIDs)
 | 
				
			||||||
 | 
										.FirstOrDefault(x => x.Slug == show.Slug),
 | 
				
			||||||
 | 
									Season season => _database.Seasons
 | 
				
			||||||
 | 
										.Include(x => x.Episodes)
 | 
				
			||||||
 | 
										.Include(x => x.ExternalIDs)
 | 
				
			||||||
 | 
										.Include(x => x.Show)
 | 
				
			||||||
 | 
										.FirstOrDefault(x => x.Show.Slug == season.Show.Slug && x.SeasonNumber == season.SeasonNumber),
 | 
				
			||||||
 | 
									Episode episode => _database.Episodes
 | 
				
			||||||
 | 
										.Include(x => x.Season)
 | 
				
			||||||
 | 
										.Include(x => x.Show)
 | 
				
			||||||
 | 
										.Include(x => x.ExternalIDs)
 | 
				
			||||||
 | 
										.Include(x => x.Tracks)
 | 
				
			||||||
 | 
										.FirstOrDefault(x => x.EpisodeNumber == episode.EpisodeNumber
 | 
				
			||||||
 | 
										                     && x.SeasonNumber == episode.SeasonNumber 
 | 
				
			||||||
 | 
										                     && x.Show.Slug == episode.Show.Slug),
 | 
				
			||||||
 | 
									Studio studio => _database.Studios
 | 
				
			||||||
 | 
										.Include(x => x.Shows)
 | 
				
			||||||
 | 
										.FirstOrDefault(x => x.Slug == studio.Slug),
 | 
				
			||||||
 | 
									People people => _database.Peoples
 | 
				
			||||||
 | 
										.Include(x => x.Roles)
 | 
				
			||||||
 | 
										.Include(x => x.ExternalIDs)
 | 
				
			||||||
 | 
										.FirstOrDefault(x => x.Slug == people.Slug),
 | 
				
			||||||
				Genre genre => GetGenre(genre.Slug),
 | 
									Genre genre => GetGenre(genre.Slug),
 | 
				
			||||||
				ProviderID provider => GetProvider(provider.Name),
 | 
									ProviderID provider => GetProvider(provider.Name),
 | 
				
			||||||
				_ => null
 | 
									_ => null
 | 
				
			||||||
 | 
				
			|||||||
@ -76,9 +76,12 @@ namespace Kyoo.Controllers
 | 
				
			|||||||
			return collection;
 | 
								return collection;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		public async Task<Show> CompleteShow(Show show, Library library)
 | 
							public async Task<Show> CompleteShow(Show old, Library library)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			return await GetMetadata(provider => provider.GetShowByID(show), library, $"the show {show.Title}");
 | 
								Show show = await GetMetadata(provider => provider.GetShowByID(old), library, $"the show {old.Title}");
 | 
				
			||||||
 | 
								show.GenreLinks = show.GenreLinks?.GroupBy(x => x.Genre.Slug).Select(x => x.First()).ToList();
 | 
				
			||||||
 | 
								show.People = show.People?.GroupBy(x => x.Slug).Select(x => x.First()).ToList();
 | 
				
			||||||
 | 
								return show;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		public async Task<Show> SearchShow(string showName, bool isMovie, Library library)
 | 
							public async Task<Show> SearchShow(string showName, bool isMovie, Library library)
 | 
				
			||||||
 | 
				
			|||||||
@ -51,9 +51,9 @@ namespace Kyoo
 | 
				
			|||||||
			services.AddDbContext<DatabaseContext>(options =>
 | 
								services.AddDbContext<DatabaseContext>(options =>
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				options.UseLazyLoadingProxies()
 | 
									options.UseLazyLoadingProxies()
 | 
				
			||||||
					.UseNpgsql(_configuration.GetConnectionString("Database"));
 | 
										.UseNpgsql(_configuration.GetConnectionString("Database"))
 | 
				
			||||||
				// .EnableSensitiveDataLogging()
 | 
										.EnableSensitiveDataLogging();
 | 
				
			||||||
				// .UseLoggerFactory(LoggerFactory.Create(builder => builder.AddConsole()));
 | 
									//.UseLoggerFactory(LoggerFactory.Create(builder => builder.AddConsole()));
 | 
				
			||||||
			});
 | 
								});
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			services.AddDbContext<IdentityDatabase>(options =>
 | 
								services.AddDbContext<IdentityDatabase>(options =>
 | 
				
			||||||
 | 
				
			|||||||
@ -142,8 +142,12 @@ namespace Kyoo.Controllers
 | 
				
			|||||||
			long absoluteNumber = long.TryParse(match.Groups["Absolute"].Value, out tmp) ? tmp : -1;
 | 
								long absoluteNumber = long.TryParse(match.Groups["Absolute"].Value, out tmp) ? tmp : -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			Collection collection = await GetCollection(libraryManager, collectionName, library);
 | 
								Collection collection = await GetCollection(libraryManager, collectionName, library);
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								if (collection != null)
 | 
				
			||||||
 | 
									libraryManager.Register(collection);
 | 
				
			||||||
 | 
								
 | 
				
			||||||
			bool isMovie = seasonNumber == -1 && episodeNumber == -1 && absoluteNumber == -1;
 | 
								bool isMovie = seasonNumber == -1 && episodeNumber == -1 && absoluteNumber == -1;
 | 
				
			||||||
			Show show = await GetShow(libraryManager, showName, showPath, isMovie, library);
 | 
								Show show = await GetShow(libraryManager, collection, showName, showPath, isMovie, library);
 | 
				
			||||||
			if (isMovie)
 | 
								if (isMovie)
 | 
				
			||||||
				libraryManager.Register(await GetMovie(show, path));
 | 
									libraryManager.Register(await GetMovie(show, path));
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
@ -152,9 +156,6 @@ namespace Kyoo.Controllers
 | 
				
			|||||||
				Episode episode = await GetEpisode(libraryManager, show, season, episodeNumber, absoluteNumber, path, library);
 | 
									Episode episode = await GetEpisode(libraryManager, show, season, episodeNumber, absoluteNumber, path, library);
 | 
				
			||||||
				libraryManager.Register(episode);
 | 
									libraryManager.Register(episode);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if (collection != null)
 | 
					 | 
				
			||||||
				libraryManager.Register(collection);
 | 
					 | 
				
			||||||
			libraryManager.RegisterShowLinks(library, collection, show);
 | 
					 | 
				
			||||||
			Console.WriteLine($"Registering episode at: {path}");
 | 
								Console.WriteLine($"Registering episode at: {path}");
 | 
				
			||||||
			await libraryManager.SaveChanges();
 | 
								await libraryManager.SaveChanges();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@ -162,14 +163,19 @@ namespace Kyoo.Controllers
 | 
				
			|||||||
		private async Task<Collection> GetCollection(ILibraryManager libraryManager, string collectionName, Library library)
 | 
							private async Task<Collection> GetCollection(ILibraryManager libraryManager, string collectionName, Library library)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if (string.IsNullOrEmpty(collectionName))
 | 
								if (string.IsNullOrEmpty(collectionName))
 | 
				
			||||||
				return await Task.FromResult<Collection>(null);
 | 
									return default;
 | 
				
			||||||
			Collection name = libraryManager.GetCollection(Utility.ToSlug(collectionName));
 | 
								Collection name = libraryManager.GetCollection(Utility.ToSlug(collectionName));
 | 
				
			||||||
			if (name != null)
 | 
								if (name != null)
 | 
				
			||||||
				return name;
 | 
									return name;
 | 
				
			||||||
			return await _metadataProvider.GetCollectionFromName(collectionName, library);
 | 
								return await _metadataProvider.GetCollectionFromName(collectionName, library);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		private async Task<Show> GetShow(ILibraryManager libraryManager, string showTitle, string showPath, bool isMovie, Library library)
 | 
							private async Task<Show> GetShow(ILibraryManager libraryManager,
 | 
				
			||||||
 | 
								Collection collection,
 | 
				
			||||||
 | 
								string showTitle,
 | 
				
			||||||
 | 
								string showPath,
 | 
				
			||||||
 | 
								bool isMovie,
 | 
				
			||||||
 | 
								Library library)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			Show show = libraryManager.GetShowByPath(showPath);
 | 
								Show show = libraryManager.GetShowByPath(showPath);
 | 
				
			||||||
			if (show != null)
 | 
								if (show != null)
 | 
				
			||||||
@ -179,6 +185,15 @@ namespace Kyoo.Controllers
 | 
				
			|||||||
			show.People = await _metadataProvider.GetPeople(show, library);
 | 
								show.People = await _metadataProvider.GetPeople(show, library);
 | 
				
			||||||
			await _thumbnailsManager.Validate(show.People);
 | 
								await _thumbnailsManager.Validate(show.People);
 | 
				
			||||||
			await _thumbnailsManager.Validate(show);
 | 
								await _thumbnailsManager.Validate(show);
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								if (collection != null)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									libraryManager.Register(new LibraryLink {Library = library, Collection = collection});
 | 
				
			||||||
 | 
									libraryManager.Register(new CollectionLink { Collection = collection, Show = show});
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									libraryManager.Register(new LibraryLink {Library = library, Show = show});
 | 
				
			||||||
 | 
								
 | 
				
			||||||
			return show;
 | 
								return show;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -196,9 +211,20 @@ namespace Kyoo.Controllers
 | 
				
			|||||||
			return season;
 | 
								return season;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		private async Task<Episode> GetEpisode(ILibraryManager libraryManager, Show show, Season season, long episodeNumber, long absoluteNumber, string episodePath, Library library)
 | 
							private async Task<Episode> GetEpisode(ILibraryManager libraryManager,
 | 
				
			||||||
 | 
								Show show, 
 | 
				
			||||||
 | 
								Season season, 
 | 
				
			||||||
 | 
								long episodeNumber,
 | 
				
			||||||
 | 
								long absoluteNumber,
 | 
				
			||||||
 | 
								string episodePath,
 | 
				
			||||||
 | 
								Library library)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			Episode episode = await _metadataProvider.GetEpisode(show, episodePath, season?.SeasonNumber ?? -1, episodeNumber, absoluteNumber, library);
 | 
								Episode episode = await _metadataProvider.GetEpisode(show, 
 | 
				
			||||||
 | 
									episodePath,
 | 
				
			||||||
 | 
									season?.SeasonNumber ?? -1, 
 | 
				
			||||||
 | 
									episodeNumber, 
 | 
				
			||||||
 | 
									absoluteNumber,
 | 
				
			||||||
 | 
									library);
 | 
				
			||||||
			if (season == null)
 | 
								if (season == null)
 | 
				
			||||||
				season = await GetSeason(libraryManager, show, episode.SeasonNumber, library);
 | 
									season = await GetSeason(libraryManager, show, episode.SeasonNumber, library);
 | 
				
			||||||
			episode.Season = season;
 | 
								episode.Season = season;
 | 
				
			||||||
@ -223,7 +249,8 @@ namespace Kyoo.Controllers
 | 
				
			|||||||
		private async Task<IEnumerable<Track>> GetTracks(Episode episode)
 | 
							private async Task<IEnumerable<Track>> GetTracks(Episode episode)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			IEnumerable<Track> tracks = await _transcoder.GetTrackInfo(episode.Path);
 | 
								IEnumerable<Track> tracks = await _transcoder.GetTrackInfo(episode.Path);
 | 
				
			||||||
			List<Track> epTracks = tracks.Where(x => x.Type != StreamType.Subtitle).Concat(GetExtractedSubtitles(episode)).ToList();
 | 
								List<Track> epTracks = tracks.Where(x => x.Type != StreamType.Subtitle)
 | 
				
			||||||
 | 
									.Concat(GetExtractedSubtitles(episode)).ToList();
 | 
				
			||||||
			if (epTracks.Count(x => !x.IsExternal) < tracks.Count())
 | 
								if (epTracks.Count(x => !x.IsExternal) < tracks.Count())
 | 
				
			||||||
				epTracks.AddRange(await _transcoder.ExtractSubtitles(episode.Path));
 | 
									epTracks.AddRange(await _transcoder.ExtractSubtitles(episode.Path));
 | 
				
			||||||
			episode.Tracks = epTracks;
 | 
								episode.Tracks = epTracks;
 | 
				
			||||||
@ -262,7 +289,33 @@ namespace Kyoo.Controllers
 | 
				
			|||||||
			return tracks;
 | 
								return tracks;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		private static readonly string[] VideoExtensions = { ".webm", ".mkv", ".flv", ".vob", ".ogg", ".ogv", ".avi", ".mts", ".m2ts", ".ts", ".mov", ".qt", ".asf", ".mp4", ".m4p", ".m4v", ".mpg", ".mp2", ".mpeg", ".mpe", ".mpv", ".m2v", ".3gp", ".3g2" };
 | 
							private static readonly string[] VideoExtensions =
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								".webm",
 | 
				
			||||||
 | 
								".mkv",
 | 
				
			||||||
 | 
								".flv",
 | 
				
			||||||
 | 
								".vob",
 | 
				
			||||||
 | 
								".ogg",
 | 
				
			||||||
 | 
								".ogv",
 | 
				
			||||||
 | 
								".avi",
 | 
				
			||||||
 | 
								".mts",
 | 
				
			||||||
 | 
								".m2ts",
 | 
				
			||||||
 | 
								".ts",
 | 
				
			||||||
 | 
								".mov",
 | 
				
			||||||
 | 
								".qt",
 | 
				
			||||||
 | 
								".asf",
 | 
				
			||||||
 | 
								".mp4",
 | 
				
			||||||
 | 
								".m4p",
 | 
				
			||||||
 | 
								".m4v",
 | 
				
			||||||
 | 
								".mpg",
 | 
				
			||||||
 | 
								".mp2",
 | 
				
			||||||
 | 
								".mpeg", 
 | 
				
			||||||
 | 
								".mpe",
 | 
				
			||||||
 | 
								".mpv",
 | 
				
			||||||
 | 
								".m2v",
 | 
				
			||||||
 | 
								".3gp",
 | 
				
			||||||
 | 
								".3g2"
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		private static bool IsVideo(string filePath)
 | 
							private static bool IsVideo(string filePath)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
 | 
				
			|||||||
@ -62,6 +62,8 @@ namespace Kyoo.Tasks
 | 
				
			|||||||
				edited.ID = old.ID;
 | 
									edited.ID = old.ID;
 | 
				
			||||||
				edited.Slug = old.Slug;
 | 
									edited.Slug = old.Slug;
 | 
				
			||||||
				edited.Path = old.Path;
 | 
									edited.Path = old.Path;
 | 
				
			||||||
 | 
									edited.Seasons = old.Seasons;
 | 
				
			||||||
 | 
									edited.Episodes = old.Episodes;
 | 
				
			||||||
				await libraryManager.Edit(edited, true);
 | 
									await libraryManager.Edit(edited, true);
 | 
				
			||||||
				await _thumbnailsManager.Validate(edited, true);
 | 
									await _thumbnailsManager.Validate(edited, true);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user