Better handle multiple tags respecting US format (#878)

* Better handle multiple tags respecting US format

Based on unversioned, V1 & V2 of US formats : https://github.com/UltraStar-Deluxe/format
Should address #623
Creator now takes multiple values
Maintain backward compatibility

* Update file path properties to match US formats
This commit is contained in:
Quentin Bray authored and GitHub committed 2026-06-23 21:04:59 +02:00
1 parent cae67eb4ab
commit 1bba340cf8
10 files changed
+97 -160

No files matched your search

+22 -48
View File
@@ -16,6 +16,7 @@
#endregion
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using VocaluxeLib.Log;
@@ -180,11 +181,6 @@ namespace VocaluxeLib.Songs
case "ARTIST-ON-SORTING":
_Song.ArtistSorting = value;
break;
case "CREATOR":
case "AUTHOR":
case "AUTOR":
_Song.Creator = value;
break;
case "VERSION":
_Song.Version = value;
break;
@@ -200,7 +196,7 @@ namespace VocaluxeLib.Songs
case "AUDIO":
if (File.Exists(Path.Combine(_Song.Folder, value)))
{
_Song.MP3FileName = value;
_Song.Audio = value;
headerFlags |= EHeaderFlags.MP3;
}
else
@@ -213,7 +209,7 @@ namespace VocaluxeLib.Songs
case "INSTRUMENTAL":
if (File.Exists(Path.Combine(_Song.Folder, value)))
{
_Song.InstrumentalFileName = value;
_Song.Instrumental = value;
headerFlags |= EHeaderFlags.Instrumental;
}
else
@@ -227,7 +223,7 @@ namespace VocaluxeLib.Songs
case "VOCALS":
if (File.Exists(Path.Combine(_Song.Folder, value)))
{
_Song.VocalsFileName = value;
_Song.Vocals = value;
headerFlags |= EHeaderFlags.Vocals;
}
else
@@ -249,39 +245,23 @@ namespace VocaluxeLib.Songs
CLog.CSongLog.Warning("[{SongFileName}] Invalid BPM value: {Value}", CLog.Params(_Song.FileName, value));
}
break;
case "CREATOR":
case "AUTHOR":
case "AUTOR":
_Song.Creators.AddRange(_GetMultipleHeaderValues(value));
break;
case "EDITION":
if (value.Length > 1)
{
_Song.Editions.Add(value);
}
else
{
CLog.CSongLog.Warning("[{SongFileName}] Invalid edition: {Value}", CLog.Params(_Song.FileName, value));
}
_Song.Editions.AddRange(_GetMultipleHeaderValues(value));
break;
case "GENRE":
if (value.Length > 1)
{
_Song.Genres.Add(value);
}
else
{
CLog.CSongLog.Warning("[{SongFileName}] Invalid genre: {Value}", CLog.Params(_Song.FileName, value));
}
_Song.Genres.AddRange(_GetMultipleHeaderValues(value));
break;
case "TAGS":
if (value.Length > 1)
{
_Song.Tags.AddRange(value.Split(','));
}
else
{
CLog.CSongLog.Warning("[{SongFileName}] Invalid tags: {Value}", CLog.Params(_Song.FileName, value));
}
_Song.Tags.AddRange(_GetMultipleHeaderValues(value));
break;
case "LANGUAGE":
_Song.Languages.AddRange(_GetMultipleHeaderValues(value).Select(_UnifyLanguage));
break;
case "ALBUM":
_Song.Album = value;
@@ -297,17 +277,6 @@ namespace VocaluxeLib.Songs
CLog.CSongLog.Warning("[{SongFileName}] Invalid year: {Value}", CLog.Params(_Song.FileName, value));
}
break;
case "LANGUAGE":
if (value.Length > 1)
{
_Song.Languages.Add(_UnifyLanguage(value));
}
else
{
CLog.CSongLog.Warning("[{SongFileName}] Invalid language: {Value}", CLog.Params(_Song.FileName, value));
}
break;
case "COMMENT":
if (!string.IsNullOrEmpty(_Song._Comment))
@@ -331,7 +300,7 @@ namespace VocaluxeLib.Songs
case "COVER":
if (File.Exists(Path.Combine(_Song.Folder, value)))
{
_Song.CoverFileName = value;
_Song.Cover = value;
}
else
{
@@ -354,7 +323,7 @@ namespace VocaluxeLib.Songs
case "VIDEO":
if (File.Exists(Path.Combine(_Song.Folder, value)))
{
_Song.VideoFileName = value;
_Song.Video = value;
}
else
{
@@ -597,6 +566,11 @@ namespace VocaluxeLib.Songs
return true;
}
private IEnumerable<string> _GetMultipleHeaderValues(string value)
{
return value.Split(',').Select(v => v.Trim()).Where(v => !string.IsNullOrEmpty(v));
}
private static string _UnifyLanguage(string lang)
{
if (lang != "")