|
|
@ -775,36 +775,6 @@ namespace MediaBrowser.Controller.Entities
|
|
|
|
return Id.ToString("N", CultureInfo.InvariantCulture);
|
|
|
|
return Id.ToString("N", CultureInfo.InvariantCulture);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private List<Tuple<StringBuilder, bool>> GetSortChunks(string s1)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
var list = new List<Tuple<StringBuilder, bool>>();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int thisMarker = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (thisMarker < s1.Length)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
char thisCh = s1[thisMarker];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var thisChunk = new StringBuilder();
|
|
|
|
|
|
|
|
bool isNumeric = char.IsDigit(thisCh);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (thisMarker < s1.Length && char.IsDigit(thisCh) == isNumeric)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
thisChunk.Append(thisCh);
|
|
|
|
|
|
|
|
thisMarker++;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (thisMarker < s1.Length)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
thisCh = s1[thisMarker];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
list.Add(new Tuple<StringBuilder, bool>(thisChunk, isNumeric));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return list;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public virtual bool CanDelete()
|
|
|
|
public virtual bool CanDelete()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (SourceType == SourceType.Channel)
|
|
|
|
if (SourceType == SourceType.Channel)
|
|
|
@ -951,28 +921,40 @@ namespace MediaBrowser.Controller.Entities
|
|
|
|
return ModifySortChunks(sortable);
|
|
|
|
return ModifySortChunks(sortable);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private string ModifySortChunks(string name)
|
|
|
|
internal static string ModifySortChunks(string name)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var chunks = GetSortChunks(name);
|
|
|
|
void AppendChunk(StringBuilder builder, bool isDigitChunk, ReadOnlySpan<char> chunk)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (isDigitChunk && chunk.Length < 10)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
builder.Append('0', 10 - chunk.Length);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var builder = new StringBuilder();
|
|
|
|
builder.Append(chunk);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var chunk in chunks)
|
|
|
|
if (name.Length == 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var chunkBuilder = chunk.Item1;
|
|
|
|
return string.Empty;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var builder = new StringBuilder(name.Length);
|
|
|
|
|
|
|
|
|
|
|
|
// This chunk is numeric
|
|
|
|
int chunkStart = 0;
|
|
|
|
if (chunk.Item2)
|
|
|
|
bool isDigitChunk = char.IsDigit(name[0]);
|
|
|
|
|
|
|
|
for (int i = 0; i < name.Length; i++)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
var isDigit = char.IsDigit(name[i]);
|
|
|
|
|
|
|
|
if (isDigit != isDigitChunk)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
while (chunkBuilder.Length < 10)
|
|
|
|
AppendChunk(builder, isDigitChunk, name.AsSpan(chunkStart, i - chunkStart));
|
|
|
|
{
|
|
|
|
chunkStart = i;
|
|
|
|
chunkBuilder.Insert(0, '0');
|
|
|
|
isDigitChunk = isDigit;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
builder.Append(chunkBuilder);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AppendChunk(builder, isDigitChunk, name.AsSpan(chunkStart));
|
|
|
|
|
|
|
|
|
|
|
|
// logger.LogDebug("ModifySortChunks Start: {0} End: {1}", name, builder.ToString());
|
|
|
|
// logger.LogDebug("ModifySortChunks Start: {0} End: {1}", name, builder.ToString());
|
|
|
|
return builder.ToString().RemoveDiacritics();
|
|
|
|
return builder.ToString().RemoveDiacritics();
|
|
|
|
}
|
|
|
|
}
|
|
|
|