feat(netd): add try catch to handle errors properly
All checks were successful
Discord / discord commits (push) Has been skipped
All checks were successful
Discord / discord commits (push) Has been skipped
This commit is contained in:
parent
a1c608ee0a
commit
3ad658406b
5 changed files with 130 additions and 74 deletions
|
@ -9,7 +9,6 @@
|
||||||
./timer.nix
|
./timer.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
# TODO: netd: make error handling with HA notifs
|
|
||||||
# TODO: nix: add HA options for custom_sentences and stuff
|
# TODO: nix: add HA options for custom_sentences and stuff
|
||||||
|
|
||||||
services.home-assistant = {
|
services.home-assistant = {
|
||||||
|
|
|
@ -4,6 +4,7 @@ using HomeAssistantGenerated;
|
||||||
using NetDaemon.AppModel;
|
using NetDaemon.AppModel;
|
||||||
using NetDaemon.HassModel;
|
using NetDaemon.HassModel;
|
||||||
using NetDaemon.HassModel.Integration;
|
using NetDaemon.HassModel.Integration;
|
||||||
|
using System;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
|
||||||
record PlayAlbumData(string? artist, string? album);
|
record PlayAlbumData(string? artist, string? album);
|
||||||
|
@ -24,24 +25,27 @@ public class PlayAlbum
|
||||||
"spotify_play_album",
|
"spotify_play_album",
|
||||||
async (e) =>
|
async (e) =>
|
||||||
{
|
{
|
||||||
var result = (await ha.CallServiceWithResponseAsync(
|
try
|
||||||
"spotifyplus",
|
|
||||||
"search_albums",
|
|
||||||
data: new SpotifyplusSearchAlbumsParameters
|
|
||||||
{
|
|
||||||
Criteria = $"{e?.artist} {e?.album}",
|
|
||||||
LimitTotal = 1,
|
|
||||||
EntityId = Global.DEFAULT_ENTITY_ID,
|
|
||||||
// My Defaults
|
|
||||||
Market = "CA",
|
|
||||||
IncludeExternal = "audio",
|
|
||||||
}
|
|
||||||
)).Value.Deserialize<SpotifyplusSearchAlbumsResponse>(_jsonOptions);
|
|
||||||
|
|
||||||
string? uri = result?.Result?.Items?[0]?.Uri;
|
|
||||||
|
|
||||||
if (uri is not null)
|
|
||||||
{
|
{
|
||||||
|
var result = (await ha.CallServiceWithResponseAsync(
|
||||||
|
"spotifyplus",
|
||||||
|
"search_albums",
|
||||||
|
data: new SpotifyplusSearchAlbumsParameters
|
||||||
|
{
|
||||||
|
Criteria = $"{e?.artist} {e?.album}",
|
||||||
|
LimitTotal = 1,
|
||||||
|
EntityId = Global.DEFAULT_ENTITY_ID,
|
||||||
|
// My Defaults
|
||||||
|
Market = "CA",
|
||||||
|
IncludeExternal = "audio",
|
||||||
|
}
|
||||||
|
)).Value.Deserialize<SpotifyplusSearchAlbumsResponse>(_jsonOptions);
|
||||||
|
|
||||||
|
string uri = result?.Result?.Items?[0]?.Uri ??
|
||||||
|
throw new NullReferenceException(
|
||||||
|
$"The album {e?.album}{(e?.artist is null ? "" : $" by {e?.artist}")} could not be found."
|
||||||
|
);
|
||||||
|
|
||||||
ha.CallService(
|
ha.CallService(
|
||||||
"spotifyplus",
|
"spotifyplus",
|
||||||
"player_media_play_context",
|
"player_media_play_context",
|
||||||
|
@ -56,6 +60,18 @@ public class PlayAlbum
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
catch (Exception error)
|
||||||
|
{
|
||||||
|
ha.CallService(
|
||||||
|
"notify",
|
||||||
|
"persistent_notification",
|
||||||
|
data: new PersistentNotificationCreateParameters
|
||||||
|
{
|
||||||
|
Message = error.Message,
|
||||||
|
Title = "Erreur Spotify",
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ using HomeAssistantGenerated;
|
||||||
using NetDaemon.AppModel;
|
using NetDaemon.AppModel;
|
||||||
using NetDaemon.HassModel;
|
using NetDaemon.HassModel;
|
||||||
using NetDaemon.HassModel.Integration;
|
using NetDaemon.HassModel.Integration;
|
||||||
|
using System;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
|
||||||
record PlayArtistData(string? artist);
|
record PlayArtistData(string? artist);
|
||||||
|
@ -24,24 +25,25 @@ public class PlayArtist
|
||||||
"spotify_play_artist",
|
"spotify_play_artist",
|
||||||
async (e) =>
|
async (e) =>
|
||||||
{
|
{
|
||||||
var result = (await ha.CallServiceWithResponseAsync(
|
try
|
||||||
"spotifyplus",
|
|
||||||
"search_artists",
|
|
||||||
data: new SpotifyplusSearchArtistsParameters
|
|
||||||
{
|
|
||||||
Criteria = e?.artist,
|
|
||||||
LimitTotal = 1,
|
|
||||||
EntityId = Global.DEFAULT_ENTITY_ID,
|
|
||||||
// My Defaults
|
|
||||||
Market = "CA",
|
|
||||||
IncludeExternal = "audio",
|
|
||||||
}
|
|
||||||
)).Value.Deserialize<SpotifyplusSearchArtistsResponse>(_jsonOptions);
|
|
||||||
|
|
||||||
string? uri = result?.Result?.Items?[0]?.Uri;
|
|
||||||
|
|
||||||
if (uri is not null)
|
|
||||||
{
|
{
|
||||||
|
var result = (await ha.CallServiceWithResponseAsync(
|
||||||
|
"spotifyplus",
|
||||||
|
"search_artists",
|
||||||
|
data: new SpotifyplusSearchArtistsParameters
|
||||||
|
{
|
||||||
|
Criteria = e?.artist,
|
||||||
|
LimitTotal = 1,
|
||||||
|
EntityId = Global.DEFAULT_ENTITY_ID,
|
||||||
|
// My Defaults
|
||||||
|
Market = "CA",
|
||||||
|
IncludeExternal = "audio",
|
||||||
|
}
|
||||||
|
)).Value.Deserialize<SpotifyplusSearchArtistsResponse>(_jsonOptions);
|
||||||
|
|
||||||
|
string uri = result?.Result?.Items?[0]?.Uri ??
|
||||||
|
throw new NullReferenceException($"The artist {e?.artist} could not be found.");
|
||||||
|
|
||||||
ha.CallService(
|
ha.CallService(
|
||||||
"spotifyplus",
|
"spotifyplus",
|
||||||
"player_media_play_context",
|
"player_media_play_context",
|
||||||
|
@ -56,6 +58,18 @@ public class PlayArtist
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
catch (Exception error)
|
||||||
|
{
|
||||||
|
ha.CallService(
|
||||||
|
"notify",
|
||||||
|
"persistent_notification",
|
||||||
|
data: new PersistentNotificationCreateParameters
|
||||||
|
{
|
||||||
|
Message = error.Message,
|
||||||
|
Title = "Erreur Spotify",
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,30 +28,32 @@ public class PlayPlaylist
|
||||||
"spotify_play_playlist",
|
"spotify_play_playlist",
|
||||||
async (e) =>
|
async (e) =>
|
||||||
{
|
{
|
||||||
string? query = e?.playlist;
|
try
|
||||||
|
|
||||||
var result = (await ha.CallServiceWithResponseAsync(
|
|
||||||
"spotifyplus",
|
|
||||||
"get_playlist_favorites",
|
|
||||||
data: new SpotifyplusGetPlaylistFavoritesParameters
|
|
||||||
{
|
|
||||||
LimitTotal = 200,
|
|
||||||
SortResult = true,
|
|
||||||
EntityId = Global.DEFAULT_ENTITY_ID,
|
|
||||||
}
|
|
||||||
)).Value.Deserialize<SpotifyplusPlaylistResponse>(_jsonOptions);
|
|
||||||
|
|
||||||
List<PlaylistsItem>? myPlaylists = result?.Result?.Items;
|
|
||||||
|
|
||||||
if (query is not null && myPlaylists is not null)
|
|
||||||
{
|
{
|
||||||
|
string query = e?.playlist ?? throw new NullReferenceException("Query not found.");
|
||||||
|
|
||||||
|
var result = (await ha.CallServiceWithResponseAsync(
|
||||||
|
"spotifyplus",
|
||||||
|
"get_playlist_favorites",
|
||||||
|
data: new SpotifyplusGetPlaylistFavoritesParameters
|
||||||
|
{
|
||||||
|
LimitTotal = 200,
|
||||||
|
SortResult = true,
|
||||||
|
EntityId = Global.DEFAULT_ENTITY_ID,
|
||||||
|
}
|
||||||
|
)).Value.Deserialize<SpotifyplusPlaylistResponse>(_jsonOptions);
|
||||||
|
|
||||||
|
List<PlaylistsItem> myPlaylists = result?.Result?.Items ??
|
||||||
|
throw new NullReferenceException($"No playlists found for query {query}");
|
||||||
|
|
||||||
ExtractedResult<PlaylistsItem> match = Process.ExtractOne<PlaylistsItem>(
|
ExtractedResult<PlaylistsItem> match = Process.ExtractOne<PlaylistsItem>(
|
||||||
new PlaylistsItem { Name = query.ToLower() },
|
new PlaylistsItem { Name = query.ToLower() },
|
||||||
myPlaylists,
|
myPlaylists,
|
||||||
new Func<PlaylistsItem, string>((item) => (item.Name ?? "").ToLower())
|
new Func<PlaylistsItem, string>((item) => (item.Name ?? "").ToLower())
|
||||||
);
|
);
|
||||||
|
|
||||||
string uri = match.Value!.Uri!;
|
string uri = match.Value?.Uri ??
|
||||||
|
throw new NullReferenceException($"No matches found for query {query}");
|
||||||
|
|
||||||
// We search outside the user's playlists if the score is too low
|
// We search outside the user's playlists if the score is too low
|
||||||
if (match.Score < 85)
|
if (match.Score < 85)
|
||||||
|
@ -70,12 +72,10 @@ public class PlayPlaylist
|
||||||
}
|
}
|
||||||
)).Value.Deserialize<SpotifyplusPlaylistResponse>(_jsonOptions);
|
)).Value.Deserialize<SpotifyplusPlaylistResponse>(_jsonOptions);
|
||||||
|
|
||||||
string? potentialUri = otherResult?.Result?.Items?[0]?.Uri;
|
string potentialUri = otherResult?.Result?.Items?[0]?.Uri ??
|
||||||
|
throw new NullReferenceException($"No public matches found for query {query}");
|
||||||
|
|
||||||
if (potentialUri is not null)
|
uri = potentialUri;
|
||||||
{
|
|
||||||
uri = potentialUri;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ha.CallService(
|
ha.CallService(
|
||||||
|
@ -92,6 +92,18 @@ public class PlayPlaylist
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
catch (Exception error)
|
||||||
|
{
|
||||||
|
ha.CallService(
|
||||||
|
"notify",
|
||||||
|
"persistent_notification",
|
||||||
|
data: new PersistentNotificationCreateParameters
|
||||||
|
{
|
||||||
|
Message = error.Message,
|
||||||
|
Title = "Erreur Spotify",
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ using HomeAssistantGenerated;
|
||||||
using NetDaemon.AppModel;
|
using NetDaemon.AppModel;
|
||||||
using NetDaemon.HassModel;
|
using NetDaemon.HassModel;
|
||||||
using NetDaemon.HassModel.Integration;
|
using NetDaemon.HassModel.Integration;
|
||||||
|
using System;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
|
||||||
record PlaySongData(string? artist, string? song);
|
record PlaySongData(string? artist, string? song);
|
||||||
|
@ -23,24 +24,26 @@ public class PlaySong
|
||||||
"spotify_play_song",
|
"spotify_play_song",
|
||||||
async (e) =>
|
async (e) =>
|
||||||
{
|
{
|
||||||
var result = (await ha.CallServiceWithResponseAsync(
|
try
|
||||||
"spotifyplus",
|
|
||||||
"search_tracks",
|
|
||||||
data: new SpotifyplusSearchTracksParameters
|
|
||||||
{
|
|
||||||
Criteria = $"{e?.artist} {e?.song}",
|
|
||||||
LimitTotal = 1,
|
|
||||||
EntityId = Global.DEFAULT_ENTITY_ID,
|
|
||||||
// My Defaults
|
|
||||||
Market = "CA",
|
|
||||||
IncludeExternal = "audio",
|
|
||||||
}
|
|
||||||
)).Value.Deserialize<SpotifyplusSearchTracksResponse>(_jsonOptions);
|
|
||||||
|
|
||||||
string? uri = result?.Result?.Items?[0]?.Uri;
|
|
||||||
|
|
||||||
if (uri is not null)
|
|
||||||
{
|
{
|
||||||
|
var result = (await ha.CallServiceWithResponseAsync(
|
||||||
|
"spotifyplus",
|
||||||
|
"search_tracks",
|
||||||
|
data: new SpotifyplusSearchTracksParameters
|
||||||
|
{
|
||||||
|
Criteria = $"{e?.artist} {e?.song}",
|
||||||
|
LimitTotal = 1,
|
||||||
|
EntityId = Global.DEFAULT_ENTITY_ID,
|
||||||
|
// My Defaults
|
||||||
|
Market = "CA",
|
||||||
|
IncludeExternal = "audio",
|
||||||
|
}
|
||||||
|
)).Value.Deserialize<SpotifyplusSearchTracksResponse>(_jsonOptions);
|
||||||
|
|
||||||
|
string uri = result?.Result?.Items?[0]?.Uri ?? throw new NullReferenceException(
|
||||||
|
$"The song {e?.song}{(e?.artist is null ? "" : $" by {e?.artist}")} could not be found."
|
||||||
|
);
|
||||||
|
|
||||||
ha.CallService(
|
ha.CallService(
|
||||||
"spotifyplus",
|
"spotifyplus",
|
||||||
"player_media_play_tracks",
|
"player_media_play_tracks",
|
||||||
|
@ -55,6 +58,18 @@ public class PlaySong
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
catch (Exception error)
|
||||||
|
{
|
||||||
|
ha.CallService(
|
||||||
|
"notify",
|
||||||
|
"persistent_notification",
|
||||||
|
data: new PersistentNotificationCreateParameters
|
||||||
|
{
|
||||||
|
Message = error.Message,
|
||||||
|
Title = "Erreur Spotify",
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue