mirror of
				https://github.com/jellyfin/jellyfin.git
				synced 2025-11-04 03:27:21 -05:00 
			
		
		
		
	save web client view selection
This commit is contained in:
		
							parent
							
								
									752dfa2743
								
							
						
					
					
						commit
						798454c2e4
					
				@ -210,6 +210,7 @@
 | 
				
			|||||||
    <Compile Include="Sorting\IBaseItemComparer.cs" />
 | 
					    <Compile Include="Sorting\IBaseItemComparer.cs" />
 | 
				
			||||||
    <Compile Include="Sorting\IUserBaseItemComparer.cs" />
 | 
					    <Compile Include="Sorting\IUserBaseItemComparer.cs" />
 | 
				
			||||||
    <Compile Include="Providers\BaseItemXmlParser.cs" />
 | 
					    <Compile Include="Providers\BaseItemXmlParser.cs" />
 | 
				
			||||||
 | 
					    <Compile Include="Sorting\SortExtensions.cs" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj">
 | 
					    <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj">
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										143
									
								
								MediaBrowser.Controller/Sorting/SortExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								MediaBrowser.Controller/Sorting/SortExtensions.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,143 @@
 | 
				
			|||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MediaBrowser.Controller.Sorting
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public static class SortExtensions
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public static IEnumerable<T> OrderByString<T>(this IEnumerable<T> list, Func<T, string> getName)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return list.OrderBy(getName, new AlphanumComparator());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public static IEnumerable<T> OrderByStringDescending<T>(this IEnumerable<T> list, Func<T, string> getName)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return list.OrderByDescending(getName, new AlphanumComparator());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public static IOrderedEnumerable<T> ThenByString<T>(this IOrderedEnumerable<T> list, Func<T, string> getName)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return list.ThenBy(getName, new AlphanumComparator());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public static IOrderedEnumerable<T> ThenByStringDescending<T>(this IOrderedEnumerable<T> list, Func<T, string> getName)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return list.ThenByDescending(getName, new AlphanumComparator());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private class AlphanumComparator : IComparer<string>
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            private enum ChunkType { Alphanumeric, Numeric };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            private static bool InChunk(char ch, char otherCh)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var type = ChunkType.Alphanumeric;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (char.IsDigit(otherCh))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    type = ChunkType.Numeric;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if ((type == ChunkType.Alphanumeric && char.IsDigit(ch))
 | 
				
			||||||
 | 
					                    || (type == ChunkType.Numeric && !char.IsDigit(ch)))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    return false;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            public static int CompareValues(string s1, string s2)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (s1 == null || s2 == null)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    return 0;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                int thisMarker = 0, thisNumericChunk = 0;
 | 
				
			||||||
 | 
					                int thatMarker = 0, thatNumericChunk = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                while ((thisMarker < s1.Length) || (thatMarker < s2.Length))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    if (thisMarker >= s1.Length)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        return -1;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else if (thatMarker >= s2.Length)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        return 1;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    char thisCh = s1[thisMarker];
 | 
				
			||||||
 | 
					                    char thatCh = s2[thatMarker];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    StringBuilder thisChunk = new StringBuilder();
 | 
				
			||||||
 | 
					                    StringBuilder thatChunk = new StringBuilder();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    while ((thisMarker < s1.Length) && (thisChunk.Length == 0 || InChunk(thisCh, thisChunk[0])))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        thisChunk.Append(thisCh);
 | 
				
			||||||
 | 
					                        thisMarker++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if (thisMarker < s1.Length)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            thisCh = s1[thisMarker];
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    while ((thatMarker < s2.Length) && (thatChunk.Length == 0 || InChunk(thatCh, thatChunk[0])))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        thatChunk.Append(thatCh);
 | 
				
			||||||
 | 
					                        thatMarker++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if (thatMarker < s2.Length)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            thatCh = s2[thatMarker];
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    int result = 0;
 | 
				
			||||||
 | 
					                    // If both chunks contain numeric characters, sort them numerically
 | 
				
			||||||
 | 
					                    if (char.IsDigit(thisChunk[0]) && char.IsDigit(thatChunk[0]))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        if (!int.TryParse(thisChunk.ToString(), out thisNumericChunk))
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            return 0;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        if (!int.TryParse(thatChunk.ToString(), out thatNumericChunk))
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            return 0;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if (thisNumericChunk < thatNumericChunk)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            result = -1;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if (thisNumericChunk > thatNumericChunk)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            result = 1;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        result = thisChunk.ToString().CompareTo(thatChunk.ToString());
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (result != 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        return result;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            public int Compare(string x, string y)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return CompareValues(x, y);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -172,6 +172,11 @@ namespace MediaBrowser.Providers.Movies
 | 
				
			|||||||
                    item.CommunityRating = imdbRating;
 | 
					                    item.CommunityRating = imdbRating;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (!string.IsNullOrEmpty(result.Website))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    item.HomePageUrl = result.Website;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                ParseAdditionalMetadata(item, result);
 | 
					                ParseAdditionalMetadata(item, result);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -251,6 +256,11 @@ namespace MediaBrowser.Providers.Movies
 | 
				
			|||||||
            public string Production { get; set; }
 | 
					            public string Production { get; set; }
 | 
				
			||||||
            public string Website { get; set; }
 | 
					            public string Website { get; set; }
 | 
				
			||||||
            public string Response { get; set; }
 | 
					            public string Response { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            public string Language { get; set; }
 | 
				
			||||||
 | 
					            public string Country { get; set; }
 | 
				
			||||||
 | 
					            public string Awards { get; set; }
 | 
				
			||||||
 | 
					            public string Metascore { get; set; }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -9,6 +9,7 @@ using MediaBrowser.Controller.Library;
 | 
				
			|||||||
using MediaBrowser.Controller.LiveTv;
 | 
					using MediaBrowser.Controller.LiveTv;
 | 
				
			||||||
using MediaBrowser.Controller.MediaInfo;
 | 
					using MediaBrowser.Controller.MediaInfo;
 | 
				
			||||||
using MediaBrowser.Controller.Persistence;
 | 
					using MediaBrowser.Controller.Persistence;
 | 
				
			||||||
 | 
					using MediaBrowser.Controller.Sorting;
 | 
				
			||||||
using MediaBrowser.Model.Entities;
 | 
					using MediaBrowser.Model.Entities;
 | 
				
			||||||
using MediaBrowser.Model.LiveTv;
 | 
					using MediaBrowser.Model.LiveTv;
 | 
				
			||||||
using MediaBrowser.Model.Logging;
 | 
					using MediaBrowser.Model.Logging;
 | 
				
			||||||
@ -956,14 +957,14 @@ namespace MediaBrowser.Server.Implementations.LiveTv
 | 
				
			|||||||
            if (string.Equals(query.SortBy, "Priority", StringComparison.OrdinalIgnoreCase))
 | 
					            if (string.Equals(query.SortBy, "Priority", StringComparison.OrdinalIgnoreCase))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                timers = query.SortOrder == SortOrder.Descending ?
 | 
					                timers = query.SortOrder == SortOrder.Descending ?
 | 
				
			||||||
                    timers.OrderBy(i => i.Priority).ThenByDescending(i => i.Name) :
 | 
					                    timers.OrderBy(i => i.Priority).ThenByStringDescending(i => i.Name) :
 | 
				
			||||||
                    timers.OrderByDescending(i => i.Priority).ThenBy(i => i.Name);
 | 
					                    timers.OrderByDescending(i => i.Priority).ThenByString(i => i.Name);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                timers = query.SortOrder == SortOrder.Descending ?
 | 
					                timers = query.SortOrder == SortOrder.Descending ?
 | 
				
			||||||
                    timers.OrderByDescending(i => i.Name) :
 | 
					                    timers.OrderByStringDescending(i => i.Name) :
 | 
				
			||||||
                    timers.OrderBy(i => i.Name);
 | 
					                    timers.OrderByString(i => i.Name);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var returnArray = timers
 | 
					            var returnArray = timers
 | 
				
			||||||
@ -1154,7 +1155,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
 | 
				
			|||||||
                .ToLookup(i => i.Name, StringComparer.OrdinalIgnoreCase)
 | 
					                .ToLookup(i => i.Name, StringComparer.OrdinalIgnoreCase)
 | 
				
			||||||
                .ToList();
 | 
					                .ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            groups.AddRange(series.OrderBy(i => i.Key).Select(i => new RecordingGroupDto
 | 
					            groups.AddRange(series.OrderByString(i => i.Key).Select(i => new RecordingGroupDto
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Name = i.Key,
 | 
					                Name = i.Key,
 | 
				
			||||||
                RecordingCount = i.Count()
 | 
					                RecordingCount = i.Count()
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user