Skip to content

Commit ddcd2a8

Browse files
authored
Merge pull request #9 from jamiw1/dev
v0.4.0 lyricsing
2 parents 97ee03c + a911e1c commit ddcd2a8

23 files changed

Lines changed: 935 additions & 40 deletions

App.xaml.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,14 @@
2121
using Windows.Media.Playback;
2222
using Windows.Storage;
2323
using System.Threading.Tasks;
24+
using System.Net.Http;
2425

2526
namespace Musium
2627
{
2728
public partial class App : Application
2829
{
2930
public static Window MainWindow { get; private set; }
30-
31+
public static HttpClient LyricHttpClient { get; private set; }
3132
public App()
3233
{
3334
InitializeComponent();
@@ -37,6 +38,9 @@ protected override async void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventA
3738
MainWindow = new MainWindow();
3839
MainWindow.Activate();
3940

41+
LyricHttpClient = new HttpClient();
42+
LyricHttpClient.BaseAddress = new Uri("https://lrclib.net/api/");
43+
4044
var Audio = AudioService.Instance;
4145
await Task.Run(async () =>
4246
{

Controls/QueueListItemControl.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
</Grid>
3030
<StackPanel>
3131
<TextBlock Text="{x:Bind Song.Title, Mode=OneWay, TargetNullValue='No Song'}" FontWeight="Medium"/>
32-
<TextBlock Text="{x:Bind Song.Album.Artist.Name, Mode=OneWay, TargetNullValue='No Artist'}" FontSize="12" FontWeight="Light"/>
32+
<TextBlock Text="{x:Bind Song.ArtistName, Mode=OneWay, TargetNullValue='No Artist'}" FontSize="12" FontWeight="Light"/>
3333
</StackPanel>
3434
</StackPanel>
3535
<Grid Grid.Column="1" HorizontalAlignment="Right" VerticalAlignment="Center" Background="Transparent" BorderThickness="0" Margin="0,0">

Converters/LyricsPassConverter.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using Microsoft.UI.Xaml;
2+
using Microsoft.UI.Xaml.Data;
3+
using System;
4+
using System.Diagnostics;
5+
6+
namespace Musium.Converters
7+
{
8+
public class LyricsPassConverter : IValueConverter
9+
{
10+
public object Convert(object value, Type targetType, object parameter, string language)
11+
{
12+
if (value is string s)
13+
{
14+
if (s.Equals("[INSTRUMENTAL]"))
15+
{
16+
return "This song does not contain any lyrics.";
17+
}
18+
return s;
19+
}
20+
21+
return null;
22+
}
23+
24+
public object ConvertBack(object value, Type targetType, object parameter, string language)
25+
{
26+
return value is Visibility visibility && visibility == Visibility.Visible;
27+
}
28+
}
29+
}
30+
31+
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using Microsoft.UI.Xaml;
2+
using Microsoft.UI.Xaml.Data;
3+
using System;
4+
using System.Diagnostics;
5+
6+
namespace Musium.Converters
7+
{
8+
public class StringFilledToVisibilityConverter : IValueConverter
9+
{
10+
public object Convert(object value, Type targetType, object parameter, string language)
11+
{
12+
if (value is string s)
13+
{
14+
bool isFilled = !string.IsNullOrEmpty(s) || !string.IsNullOrWhiteSpace(s);
15+
16+
if (parameter is string param && param.Equals("Inverse", StringComparison.OrdinalIgnoreCase))
17+
{
18+
isFilled = !isFilled;
19+
}
20+
21+
return isFilled ? Visibility.Visible : Visibility.Collapsed;
22+
}
23+
24+
if (parameter is string par && par.Equals("Inverse", StringComparison.OrdinalIgnoreCase)) return Visibility.Visible;
25+
return Visibility.Collapsed;
26+
}
27+
28+
public object ConvertBack(object value, Type targetType, object parameter, string language)
29+
{
30+
return value is Visibility visibility && visibility == Visibility.Visible;
31+
}
32+
}
33+
}
34+
35+

Models/Song.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.IO;
77
using System.Linq;
88
using System.Runtime.CompilerServices;
9+
using System.Threading.Tasks;
910
using Windows.Devices.Radios;
1011
using Windows.Media.Core;
1112

@@ -35,6 +36,17 @@ public Album Album
3536
}
3637
}
3738

39+
private string _artistName;
40+
public string ArtistName
41+
{
42+
get => _artistName;
43+
set
44+
{
45+
_artistName = value;
46+
OnPropertyChanged();
47+
}
48+
}
49+
3850
private string _filePath;
3951
public string FilePath
4052
{
@@ -57,6 +69,36 @@ public string? Genre
5769
}
5870
}
5971

72+
private string? _lyrics;
73+
public string? Lyrics
74+
{
75+
get => _lyrics;
76+
set
77+
{
78+
_lyrics = value;
79+
OnPropertyChanged();
80+
}
81+
}
82+
public IOException? AttemptApplyLyricsToFile(string lyrics)
83+
{
84+
try
85+
{
86+
using (var file = TagLib.File.Create(FilePath))
87+
{
88+
file.Tag.Lyrics = lyrics;
89+
file.Save();
90+
Lyrics = lyrics;
91+
}
92+
93+
Debug.WriteLine("lyrics saved successfully.");
94+
return null;
95+
}
96+
catch (IOException ex)
97+
{
98+
return ex;
99+
}
100+
}
101+
60102
private int? _trackNumber;
61103
public int? TrackNumber
62104
{

Musium.csproj

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,13 @@
2222
<None Remove="Controls\TitlebarControls.xaml" />
2323
<None Remove="Controls\TrackItemControl.xaml" />
2424
<None Remove="Pages\InnerAlbum.xaml" />
25+
<None Remove="Pages\Lyrics.xaml" />
2526
<None Remove="Pages\NowPlaying.xaml" />
27+
<None Remove="Pages\Queue.xaml" />
28+
<None Remove="Popups\AddLyricsPopup.xaml" />
29+
<None Remove="Popups\ClearLyricsPopup.xaml" />
30+
<None Remove="Popups\ConfirmLyricsPopup.xaml" />
31+
<None Remove="Popups\LyricErrorPopup.xaml" />
2632
<None Remove="Styles\GridContentStyles.xaml" />
2733
</ItemGroup>
2834

@@ -48,6 +54,7 @@
4854
<ProjectCapability Include="Msix" />
4955
</ItemGroup>
5056
<ItemGroup>
57+
<PackageReference Include="CommunityToolkit.WinUI.Controls.Primitives" Version="8.2.250402" />
5158
<PackageReference Include="CommunityToolkit.WinUI.Controls.SettingsControls" Version="8.2.250402" />
5259
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.4948" />
5360
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.8.250907003" />
@@ -62,6 +69,24 @@
6269
<None Update="Assets\Placeholder.png">
6370
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
6471
</None>
72+
<Page Update="Popups\LyricErrorPopup.xaml">
73+
<Generator>MSBuild:Compile</Generator>
74+
</Page>
75+
<Page Update="Popups\ClearLyricsPopup.xaml">
76+
<Generator>MSBuild:Compile</Generator>
77+
</Page>
78+
<Page Update="Popups\ConfirmLyricsPopup.xaml">
79+
<Generator>MSBuild:Compile</Generator>
80+
</Page>
81+
<Page Update="Popups\AddLyricsPopup.xaml">
82+
<Generator>MSBuild:Compile</Generator>
83+
</Page>
84+
<Page Update="Pages\Lyrics.xaml">
85+
<Generator>MSBuild:Compile</Generator>
86+
</Page>
87+
<Page Update="Pages\Queue.xaml">
88+
<Generator>MSBuild:Compile</Generator>
89+
</Page>
6590
<Page Update="Pages\Favorites.xaml">
6691
<Generator>MSBuild:Compile</Generator>
6792
</Page>

Package.appxmanifest

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<Identity
1111
Name="b838ab11-140c-408f-b4bf-a855a42f7e2a"
1212
Publisher="CN=jamied"
13-
Version="0.3.0.0" />
13+
Version="0.4.0.0" />
1414

1515
<mp:PhoneIdentity PhoneProductId="b838ab11-140c-408f-b4bf-a855a42f7e2a" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
1616

Pages/Lyrics.xaml

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Page
3+
x:Class="Musium.Pages.Lyrics"
4+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
5+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
6+
xmlns:local="using:Musium.Pages"
7+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
8+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
9+
xmlns:converters="using:Musium.Converters"
10+
mc:Ignorable="d">
11+
<Page.Resources>
12+
<converters:StringFilledToVisibilityConverter x:Key="StringFilledToVisibilityConverter"/>
13+
<converters:LyricsPassConverter x:Key="LyricsPassConverter"/>
14+
</Page.Resources>
15+
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Padding="0">
16+
<ScrollView HorizontalScrollMode="Disabled" Padding="32,0">
17+
<StackPanel Margin="16">
18+
<StackPanel
19+
HorizontalAlignment="Center"
20+
Spacing="12"
21+
Visibility="{x:Bind Audio.CurrentSongPlaying.Lyrics, Mode=OneWay, ConverterParameter='Inverse', Converter={StaticResource StringFilledToVisibilityConverter}}">
22+
<TextBlock
23+
HorizontalAlignment="Center"
24+
VerticalAlignment="Top"
25+
Text="Lyrics are unavailable for this track."
26+
TextAlignment="Center"
27+
TextWrapping="WrapWholeWords"
28+
FontSize="18"/>
29+
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Spacing="8">
30+
<Button HorizontalAlignment="Center" Padding="8" Click="AddLyricsButton_Click">
31+
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" Spacing="8">
32+
<SymbolIcon Symbol="Add" VerticalAlignment="Center"/>
33+
<TextBlock Text="Add lyrics" FontSize="16"/>
34+
</StackPanel>
35+
</Button>
36+
<Button HorizontalAlignment="Center" Padding="8" Click="MarkInstrumentalButton_Click">
37+
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" Spacing="8">
38+
<FontIcon Glyph="&#xEC54;" />
39+
<TextBlock Text="Mark as instrumental" FontSize="16"/>
40+
</StackPanel>
41+
</Button>
42+
</StackPanel>
43+
</StackPanel>
44+
<TextBlock
45+
HorizontalAlignment="Center"
46+
VerticalAlignment="Top"
47+
Text="{x:Bind Audio.CurrentSongPlaying.Lyrics, Mode=OneWay, Converter={StaticResource LyricsPassConverter}, TargetNullValue='This should not be visible.'}"
48+
TextAlignment="Center"
49+
TextWrapping="WrapWholeWords"
50+
FontSize="18"
51+
Visibility="{x:Bind Audio.CurrentSongPlaying.Lyrics, Mode=OneWay, Converter={StaticResource StringFilledToVisibilityConverter}}"/>
52+
53+
</StackPanel>
54+
</ScrollView>
55+
<Grid HorizontalAlignment="Right" VerticalAlignment="Top" Margin="16">
56+
<Button
57+
Width="32"
58+
Height="32"
59+
Padding="0"
60+
Visibility="{x:Bind Audio.CurrentSongPlaying.Lyrics, Mode=OneWay, Converter={StaticResource StringFilledToVisibilityConverter}}">
61+
<SymbolIcon Symbol="More"/>
62+
<Button.Flyout>
63+
<MenuFlyout>
64+
<MenuFlyoutItem Text="Edit lyrics" Tag="edit" Click="MenuFlyoutItem_Click">
65+
<MenuFlyoutItem.Icon>
66+
<SymbolIcon Symbol="Edit"/>
67+
</MenuFlyoutItem.Icon>
68+
</MenuFlyoutItem>
69+
<MenuFlyoutSeparator/>
70+
<MenuFlyoutItem Text="Clear lyrics" Tag="clear" Click="MenuFlyoutItem_Click">
71+
<MenuFlyoutItem.Icon>
72+
<SymbolIcon Symbol="Delete"/>
73+
</MenuFlyoutItem.Icon>
74+
</MenuFlyoutItem>
75+
<MenuFlyoutItem Text="Mark as instrumental" Tag="instrumental" Click="MenuFlyoutItem_Click">
76+
<MenuFlyoutItem.Icon>
77+
<FontIcon Glyph="&#xEC54;" />
78+
</MenuFlyoutItem.Icon>
79+
</MenuFlyoutItem>
80+
</MenuFlyout>
81+
</Button.Flyout>
82+
</Button>
83+
</Grid>
84+
</Grid>
85+
</Page>

0 commit comments

Comments
 (0)