diff --git a/osu.Game/Rulesets/Edit/Checks/CheckAudioInVideo.cs b/osu.Game/Rulesets/Edit/Checks/CheckAudioInVideo.cs index 38976dd4b5..71a493c4cc 100644 --- a/osu.Game/Rulesets/Edit/Checks/CheckAudioInVideo.cs +++ b/osu.Game/Rulesets/Edit/Checks/CheckAudioInVideo.cs @@ -9,6 +9,7 @@ using osu.Game.Beatmaps; using osu.Game.IO.FileAbstraction; using osu.Game.Rulesets.Edit.Checks.Components; using osu.Game.Storyboards; +using osu.Game.Utils; using TagLib; using File = TagLib.File; @@ -61,7 +62,7 @@ namespace osu.Game.Rulesets.Edit.Checks { // We use TagLib here for platform invariance; BASS cannot detect audio presence on Linux. using (Stream data = context.WorkingBeatmap.GetStream(storagePath)) - using (File tagFile = File.Create(new StreamFileAbstraction(filename, data))) + using (File tagFile = TagLibUtils.CreateFile(new StreamFileAbstraction(filename, data))) { if (tagFile.Properties.AudioChannels == 0) continue; diff --git a/osu.Game/Rulesets/Edit/Checks/CheckVideoResolution.cs b/osu.Game/Rulesets/Edit/Checks/CheckVideoResolution.cs index 1b603b7e47..8cd9422eb4 100644 --- a/osu.Game/Rulesets/Edit/Checks/CheckVideoResolution.cs +++ b/osu.Game/Rulesets/Edit/Checks/CheckVideoResolution.cs @@ -9,6 +9,7 @@ using osu.Game.Beatmaps; using osu.Game.IO.FileAbstraction; using osu.Game.Rulesets.Edit.Checks.Components; using osu.Game.Storyboards; +using osu.Game.Utils; using TagLib; using File = TagLib.File; @@ -45,7 +46,7 @@ namespace osu.Game.Rulesets.Edit.Checks try { using (Stream data = context.WorkingBeatmap.GetStream(storagePath)) - using (File tagFile = File.Create(new StreamFileAbstraction(filename, data))) + using (File tagFile = TagLibUtils.CreateFile(new StreamFileAbstraction(filename, data))) { int height = tagFile.Properties.VideoHeight; int width = tagFile.Properties.VideoWidth; diff --git a/osu.Game/Screens/Edit/Setup/ResourcesSection.cs b/osu.Game/Screens/Edit/Setup/ResourcesSection.cs index a1c81eedec..037b4eb08f 100644 --- a/osu.Game/Screens/Edit/Setup/ResourcesSection.cs +++ b/osu.Game/Screens/Edit/Setup/ResourcesSection.cs @@ -102,7 +102,7 @@ namespace osu.Game.Screens.Edit.Setup try { - tagSource = TagLib.File.Create(source.FullName); + tagSource = TagLibUtils.CreateFile(source.FullName); } catch (Exception e) { diff --git a/osu.Game/Utils/TagLibUtils.cs b/osu.Game/Utils/TagLibUtils.cs new file mode 100644 index 0000000000..e7bcf02237 --- /dev/null +++ b/osu.Game/Utils/TagLibUtils.cs @@ -0,0 +1,32 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System.IO; +using osu.Game.IO.FileAbstraction; +using TagLib; + +namespace osu.Game.Utils +{ + public class TagLibUtils + { + /// + /// Creates a with culture-invariant MIME type detection. + /// + /// The file abstraction of the file to be created. + /// The created. + public static TagLib.File CreateFile(StreamFileAbstraction fileAbstraction) => + TagLib.File.Create(fileAbstraction, getMimeType(fileAbstraction.Name), ReadStyle.Average); + + /// + /// Creates a with culture-invariant MIME type detection. + /// + /// The full path of the file to be created. + /// The created. + public static TagLib.File CreateFile(string filePath) => + TagLib.File.Create(filePath, getMimeType(filePath), ReadStyle.Average); + + // Manual MIME type resolution to avoid culture variance (ie. https://github.com/ppy/osu/issues/32962) + private static string getMimeType(string fileName) => + @"taglib/" + Path.GetExtension(fileName).TrimStart('.'); + } +}