1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-08 21:22:56 +08:00

Centralise supported file extensions to one helper class

As proposed in
https://github.com/ppy/osu-server-beatmap-submission/pull/5#discussion_r1861680837.
This commit is contained in:
Bartłomiej Dach 2024-11-28 15:37:27 +01:00
parent d0e80ce982
commit 110e4fbb30
No known key found for this signature in database
11 changed files with 50 additions and 33 deletions

View File

@ -408,7 +408,7 @@ namespace osu.Game.Beatmaps
// user requested abort // user requested abort
return; return;
var video = b.Files.FirstOrDefault(f => OsuGameBase.VIDEO_EXTENSIONS.Any(ex => f.Filename.EndsWith(ex, StringComparison.OrdinalIgnoreCase))); var video = b.Files.FirstOrDefault(f => SupportedExtensions.VIDEO_EXTENSIONS.Any(ex => f.Filename.EndsWith(ex, StringComparison.OrdinalIgnoreCase)));
if (video != null) if (video != null)
{ {

View File

@ -17,6 +17,7 @@ using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Objects.Legacy; using osu.Game.Rulesets.Objects.Legacy;
using osu.Game.Rulesets.Objects.Types; using osu.Game.Rulesets.Objects.Types;
using osu.Game.Screens.Edit; using osu.Game.Screens.Edit;
using osu.Game.Utils;
namespace osu.Game.Beatmaps.Formats namespace osu.Game.Beatmaps.Formats
{ {
@ -446,7 +447,7 @@ namespace osu.Game.Beatmaps.Formats
// Some very old beatmaps had incorrect type specifications for their backgrounds (ie. using 1 for VIDEO // Some very old beatmaps had incorrect type specifications for their backgrounds (ie. using 1 for VIDEO
// instead of 0 for BACKGROUND). To handle this gracefully, check the file extension against known supported // instead of 0 for BACKGROUND). To handle this gracefully, check the file extension against known supported
// video extensions and handle similar to a background if it doesn't match. // video extensions and handle similar to a background if it doesn't match.
if (!OsuGameBase.VIDEO_EXTENSIONS.Contains(Path.GetExtension(filename).ToLowerInvariant())) if (!SupportedExtensions.VIDEO_EXTENSIONS.Contains(Path.GetExtension(filename).ToLowerInvariant()))
{ {
beatmap.BeatmapInfo.Metadata.BackgroundFile = filename; beatmap.BeatmapInfo.Metadata.BackgroundFile = filename;
lineSupportedByEncoder = true; lineSupportedByEncoder = true;

View File

@ -10,6 +10,7 @@ using osu.Game.Beatmaps.Legacy;
using osu.Game.IO; using osu.Game.IO;
using osu.Game.Storyboards; using osu.Game.Storyboards;
using osu.Game.Storyboards.Commands; using osu.Game.Storyboards.Commands;
using osu.Game.Utils;
using osuTK; using osuTK;
using osuTK.Graphics; using osuTK.Graphics;
@ -112,7 +113,7 @@ namespace osu.Game.Beatmaps.Formats
// //
// This avoids potential weird crashes when ffmpeg attempts to parse an image file as a video // This avoids potential weird crashes when ffmpeg attempts to parse an image file as a video
// (see https://github.com/ppy/osu/issues/22829#issuecomment-1465552451). // (see https://github.com/ppy/osu/issues/22829#issuecomment-1465552451).
if (!OsuGameBase.VIDEO_EXTENSIONS.Contains(Path.GetExtension(path).ToLowerInvariant())) if (!SupportedExtensions.VIDEO_EXTENSIONS.Contains(Path.GetExtension(path).ToLowerInvariant()))
break; break;
storyboard.GetLayer("Video").Add(storyboardSprite = new StoryboardVideo(path, offset)); storyboard.GetLayer("Video").Add(storyboardSprite = new StoryboardVideo(path, offset));

View File

@ -13,6 +13,7 @@ using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Sprites; using osu.Game.Graphics.Sprites;
using osu.Game.Graphics.UserInterfaceV2.FileSelection; using osu.Game.Graphics.UserInterfaceV2.FileSelection;
using osu.Game.Overlays; using osu.Game.Overlays;
using osu.Game.Utils;
namespace osu.Game.Graphics.UserInterfaceV2 namespace osu.Game.Graphics.UserInterfaceV2
{ {
@ -96,24 +97,18 @@ namespace osu.Game.Graphics.UserInterfaceV2
{ {
get get
{ {
if (OsuGameBase.VIDEO_EXTENSIONS.Contains(File.Extension.ToLowerInvariant())) string extension = File.Extension.ToLowerInvariant();
if (SupportedExtensions.VIDEO_EXTENSIONS.Contains(extension))
return FontAwesome.Regular.FileVideo; return FontAwesome.Regular.FileVideo;
switch (File.Extension) if (SupportedExtensions.AUDIO_EXTENSIONS.Contains(extension))
{ return FontAwesome.Regular.FileAudio;
case @".ogg":
case @".mp3":
case @".wav":
return FontAwesome.Regular.FileAudio;
case @".jpg": if (SupportedExtensions.IMAGE_EXTENSIONS.Contains(extension))
case @".jpeg": return FontAwesome.Regular.FileImage;
case @".png":
return FontAwesome.Regular.FileImage;
default: return FontAwesome.Regular.File;
return FontAwesome.Regular.File;
}
} }
} }

View File

@ -73,8 +73,6 @@ namespace osu.Game
[Cached(typeof(OsuGameBase))] [Cached(typeof(OsuGameBase))]
public partial class OsuGameBase : Framework.Game, ICanAcceptFiles, IBeatSyncProvider public partial class OsuGameBase : Framework.Game, ICanAcceptFiles, IBeatSyncProvider
{ {
public static readonly string[] VIDEO_EXTENSIONS = { ".mp4", ".mov", ".avi", ".flv", ".mpg", ".wmv", ".m4v" };
#if DEBUG #if DEBUG
public const string GAME_NAME = "osu! (development)"; public const string GAME_NAME = "osu! (development)";
#else #else

View File

@ -35,6 +35,7 @@ using osu.Game.Screens.Edit.Components.Menus;
using osu.Game.Skinning; using osu.Game.Skinning;
using osu.Framework.Graphics.Cursor; using osu.Framework.Graphics.Cursor;
using osu.Game.Input.Bindings; using osu.Game.Input.Bindings;
using osu.Game.Utils;
namespace osu.Game.Overlays.SkinEditor namespace osu.Game.Overlays.SkinEditor
{ {
@ -709,7 +710,7 @@ namespace osu.Game.Overlays.SkinEditor
Task ICanAcceptFiles.Import(ImportTask[] tasks, ImportParameters parameters) => throw new NotImplementedException(); Task ICanAcceptFiles.Import(ImportTask[] tasks, ImportParameters parameters) => throw new NotImplementedException();
public IEnumerable<string> HandledExtensions => new[] { ".jpg", ".jpeg", ".png" }; public IEnumerable<string> HandledExtensions => SupportedExtensions.IMAGE_EXTENSIONS;
#endregion #endregion

View File

@ -3,13 +3,12 @@
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using osu.Game.Utils;
namespace osu.Game.Rulesets.Edit.Checks.Components namespace osu.Game.Rulesets.Edit.Checks.Components
{ {
public static class AudioCheckUtils public static class AudioCheckUtils
{ {
public static readonly string[] AUDIO_EXTENSIONS = { "mp3", "ogg", "wav" }; public static bool HasAudioExtension(string filename) => SupportedExtensions.AUDIO_EXTENSIONS.Contains(Path.GetExtension(filename).ToLowerInvariant());
public static bool HasAudioExtension(string filename) => AUDIO_EXTENSIONS.Any(Path.GetExtension(filename).ToLowerInvariant().EndsWith);
} }
} }

View File

@ -10,6 +10,7 @@ using osu.Game.Beatmaps;
using osu.Game.Graphics.UserInterfaceV2; using osu.Game.Graphics.UserInterfaceV2;
using osu.Game.Overlays; using osu.Game.Overlays;
using osu.Game.Localisation; using osu.Game.Localisation;
using osu.Game.Utils;
namespace osu.Game.Screens.Edit.Setup namespace osu.Game.Screens.Edit.Setup
{ {
@ -48,12 +49,14 @@ namespace osu.Game.Screens.Edit.Setup
Children = new Drawable[] Children = new Drawable[]
{ {
backgroundChooser = new FormFileSelector(".jpg", ".jpeg", ".png") backgroundChooser = new FormFileSelector(SupportedExtensions.IMAGE_EXTENSIONS)
{ {
Caption = GameplaySettingsStrings.BackgroundHeader, Caption = GameplaySettingsStrings.BackgroundHeader,
PlaceholderText = EditorSetupStrings.ClickToSelectBackground, PlaceholderText = EditorSetupStrings.ClickToSelectBackground,
}, },
audioTrackChooser = new FormFileSelector(".mp3", ".ogg") // `SupportedExtensions.AUDIO_EXTENSIONS` not used here specifically it includes `.wav` for samples, which is strictly disallowed by ranking criteria
// (https://osu.ppy.sh/wiki/en/Ranking_criteria#audio)
audioTrackChooser = new FormFileSelector(@".mp3", @".ogg")
{ {
Caption = EditorSetupStrings.AudioTrack, Caption = EditorSetupStrings.AudioTrack,
PlaceholderText = EditorSetupStrings.ClickToSelectTrack, PlaceholderText = EditorSetupStrings.ClickToSelectTrack,

View File

@ -1,8 +1,8 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence. // Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text. // See the LICENCE file in the repository root for full licence text.
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
@ -14,6 +14,7 @@ using osu.Game.Configuration;
using osu.Game.Graphics.Sprites; using osu.Game.Graphics.Sprites;
using osu.Game.Localisation.SkinComponents; using osu.Game.Localisation.SkinComponents;
using osu.Game.Overlays.Settings; using osu.Game.Overlays.Settings;
using osu.Game.Utils;
using osuTK; using osuTK;
namespace osu.Game.Skinning namespace osu.Game.Skinning
@ -93,10 +94,10 @@ namespace osu.Game.Skinning
// but that requires further thought. // but that requires further thought.
var highestPrioritySkin = getHighestPriorityUserSkin(((SkinnableSprite)SettingSourceObject).source.AllSources) as Skin; var highestPrioritySkin = getHighestPriorityUserSkin(((SkinnableSprite)SettingSourceObject).source.AllSources) as Skin;
string[]? availableFiles = highestPrioritySkin?.SkinInfo.PerformRead(s => s.Files string[]? availableFiles = highestPrioritySkin?.SkinInfo.PerformRead(
.Where(f => f.Filename.EndsWith(".png", StringComparison.Ordinal) s => s.Files
|| f.Filename.EndsWith(".jpg", StringComparison.Ordinal)) .Where(f => SupportedExtensions.IMAGE_EXTENSIONS.Contains(Path.GetExtension(f.Filename).ToLowerInvariant()))
.Select(f => f.Filename).Distinct()).ToArray(); .Select(f => f.Filename).Distinct()).ToArray();
if (availableFiles?.Length > 0) if (availableFiles?.Length > 0)
Items = availableFiles; Items = availableFiles;

View File

@ -7,6 +7,7 @@ using System.Linq;
using osu.Game.Beatmaps; using osu.Game.Beatmaps;
using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Mods;
using osu.Game.Storyboards.Drawables; using osu.Game.Storyboards.Drawables;
using osu.Game.Utils;
namespace osu.Game.Storyboards namespace osu.Game.Storyboards
{ {
@ -96,8 +97,6 @@ namespace osu.Game.Storyboards
public virtual DrawableStoryboard CreateDrawable(IReadOnlyList<Mod>? mods = null) => public virtual DrawableStoryboard CreateDrawable(IReadOnlyList<Mod>? mods = null) =>
new DrawableStoryboard(this, mods); new DrawableStoryboard(this, mods);
private static readonly string[] image_extensions = { @".png", @".jpg" };
public virtual string? GetStoragePathFromStoryboardPath(string path) public virtual string? GetStoragePathFromStoryboardPath(string path)
{ {
string? resolvedPath = null; string? resolvedPath = null;
@ -109,7 +108,7 @@ namespace osu.Game.Storyboards
else else
{ {
// Some old storyboards don't include a file extension, so let's best guess at one. // Some old storyboards don't include a file extension, so let's best guess at one.
foreach (string ext in image_extensions) foreach (string ext in SupportedExtensions.IMAGE_EXTENSIONS)
{ {
if ((resolvedPath = BeatmapInfo.BeatmapSet?.GetPathForFile($"{path}{ext}")) != null) if ((resolvedPath = BeatmapInfo.BeatmapSet?.GetPathForFile($"{path}{ext}")) != null)
break; break;

View File

@ -0,0 +1,19 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
namespace osu.Game.Utils
{
public static class SupportedExtensions
{
public static readonly string[] VIDEO_EXTENSIONS = [@".mp4", @".mov", @".avi", @".flv", @".mpg", @".wmv", @".m4v"];
public static readonly string[] AUDIO_EXTENSIONS = [@".mp3", @".ogg", @".wav"];
public static readonly string[] IMAGE_EXTENSIONS = [@".jpg", @".jpeg", @".png"];
public static readonly string[] ALL_EXTENSIONS =
[
..VIDEO_EXTENSIONS,
..AUDIO_EXTENSIONS,
..IMAGE_EXTENSIONS
];
}
}