First commit

This commit is contained in:
2026-03-15 22:15:34 -05:00
commit 0858a8a751
79 changed files with 6010 additions and 0 deletions
+30
View File
@@ -0,0 +1,30 @@
using Tesses.WebServer;
using Scriban;
using System.Web;
//using YouTubeMusicAPI.Models.Info;
//using Acornima.Ast;
//using YouTubeMusicAPI.Models;
//using YouTubeMusicAPI.Models.Search;
using Newtonsoft.Json;
namespace Tesses.YouTubeDownloader2025Companion
{
public class AlbumSongLink(int? songNumber,string name,string albumId, string songId, TimeSpan dur) {
public string Songnumber => songNumber.HasValue ? songNumber.Value.ToString() : "-";
public string Duration => dur.ToString("m\\:ss");
public string Songname => HttpUtility.HtmlEncode(name);
public string Songurl => HttpUtility.HtmlAttributeEncode($"/music/song?albumId={HttpUtility.UrlEncode(albumId)}&songId={HttpUtility.UrlEncode(songId)}");
}
public static partial class Pages {
private static ReloadingScript album_info = new ReloadingScript("wwwroot/pages/music/albums/album-info.sbnhtml");
public static string AlbumInfo(string name, string id, List<AlbumSongLink> songLinks)
{
return Components.Shell($"Album info", album_info.Render(new {
Name = HttpUtility.HtmlEncode(name),
Songs = songLinks,
Addvals = HttpUtility.HtmlAttributeEncode(JsonConvert.SerializeObject(new{id}))
}),Program.DefaultLinks());
}
}
}
+27
View File
@@ -0,0 +1,27 @@
using Tesses.WebServer;
using Scriban;
using System.Web;
namespace Tesses.YouTubeDownloader2025Companion
{
public class AlbumLink(string name, string id, string thumbnail) {
public string Albumname => HttpUtility.HtmlEncode(name);
public string Albumurl => HttpUtility.HtmlAttributeEncode($"/music/album?id={HttpUtility.UrlEncode(id)}");
public string Imgurl => HttpUtility.HtmlAttributeEncode(thumbnail);
}
public static partial class Pages {
private static ReloadingScript album_listing = new ReloadingScript("wwwroot/pages/music/albums/albums.sbnhtml");
public static string AlbumListing(string query, List<AlbumLink> links,int page)
{
return Components.Shell($"Album search {query}", album_listing.Render(new {
Albums = links,
Q = HttpUtility.HtmlAttributeEncode(query),
Prev = HttpUtility.HtmlAttributeEncode($"/music/albums?q={HttpUtility.UrlEncode(query)}&page={(page == 1 ? 1 : page - 1)}"),
Current = page,
Next = HttpUtility.HtmlAttributeEncode($"/music/albums?q={HttpUtility.UrlEncode(query)}&page={page + 1}")
}),Program.DefaultLinks());
}
}
}
+25
View File
@@ -0,0 +1,25 @@
using Tesses.WebServer;
using Scriban;
using System.Web;
//using YouTubeMusicAPI.Models.Info;
namespace Tesses.YouTubeDownloader2025Companion
{
public class ArtistAlbumLink(string name, string id, string thumbnail) {
public string Albumname => HttpUtility.HtmlEncode(name);
public string Albumurl => HttpUtility.HtmlAttributeEncode($"/music/album?id={HttpUtility.UrlEncode(id)}");
public string Imgurl => HttpUtility.HtmlAttributeEncode(thumbnail);
}
public static partial class Pages {
private static ReloadingScript artist_album_listing = new ReloadingScript("wwwroot/pages/music/artists/artist-album-list.sbnhtml");
public static string ArtistAlbumListing(Guid id, List<AlbumLink> albums, int page)
{
return Components.Shell("Albums", artist_album_listing.Render(new {
Albums = albums,
Prev = HttpUtility.HtmlAttributeEncode($"/music/artist?id={HttpUtility.UrlEncode(id.ToString())}&page={(page == 1 ? 1 : page - 1)}"),
Current = page,
Next = HttpUtility.HtmlAttributeEncode($"/music/artist?id={HttpUtility.UrlEncode(id.ToString())}&page={page + 1}")
}),Program.DefaultLinks());
}
}
}
+26
View File
@@ -0,0 +1,26 @@
using Tesses.WebServer;
using Scriban;
using System.Web;
namespace Tesses.YouTubeDownloader2025Companion
{
public class ArtistLink(string name, string id, string thumbnail) {
public string Artistname => HttpUtility.HtmlEncode(name);
public string Artisturl => HttpUtility.HtmlAttributeEncode($"/music/artist?id={HttpUtility.UrlEncode(id)}");
public string Imgurl => HttpUtility.HtmlAttributeEncode(thumbnail);
}
public static partial class Pages {
private static ReloadingScript artist_listing = new ReloadingScript("wwwroot/pages/music/artists/artists.sbnhtml");
public static string ArtistListing(string query, List<ArtistLink> links, int page)
{
return Components.Shell($"Artist search {query}", artist_listing.Render(new {
Artists = links,
Q = HttpUtility.HtmlAttributeEncode(query),
Prev = HttpUtility.HtmlAttributeEncode($"/music/artists?q={HttpUtility.UrlEncode(query)}&page={(page == 1 ? 1 : page - 1)}"),
Current = page,
Next = HttpUtility.HtmlAttributeEncode($"/music/artists?q={HttpUtility.UrlEncode(query)}&page={page + 1}")
}),Program.DefaultLinks());
}
}
}
+37
View File
@@ -0,0 +1,37 @@
using Tesses.WebServer;
using Scriban;
using System.Web;
//using YouTubeMusicAPI.Models.Info;
//using Acornima.Ast;
//using YouTubeMusicAPI.Models;
//using YouTubeMusicAPI.Models.Search;
using Newtonsoft.Json;
namespace Tesses.YouTubeDownloader2025Companion
{
public class MyAlbumSongLink(int? songNumber,string name, string albumId, string songId, TimeSpan dur, string btn) {
public string Songnumber => songNumber.HasValue ? songNumber.Value.ToString() : "-";
public string Duration => dur.ToString(
"m\\:ss"
);
public string Songname => HttpUtility.HtmlEncode(name);
public string Songurl => HttpUtility.HtmlAttributeEncode($"/music/mysong?albumId={HttpUtility.UrlEncode(albumId)}&songId={HttpUtility.UrlEncode(songId)}");
public string Btn => btn;
}
public static partial class Pages {
private static ReloadingScript myalbum_info = new ReloadingScript("wwwroot/pages/music/myalbums/album-info.sbnhtml");
public static string MyAlbumInfo(string name, string id, List<MyAlbumSongLink> songLinks, bool hasAny, string artists)
{
return Components.Shell($"Album info", myalbum_info.Render(new {
Name = HttpUtility.HtmlEncode(name),
Songs = songLinks,
Addvals = HttpUtility.HtmlAttributeEncode(JsonConvert.SerializeObject(new{id})),
Hasanysongs = hasAny,
Zipurl = HttpUtility.HtmlAttributeEncode($"/api/v1/album.zip?albumId={HttpUtility.UrlEncode(id)}"),
Artists = artists
}),Program.DefaultLinks());
}
}
}
+23
View File
@@ -0,0 +1,23 @@
using Tesses.WebServer;
using Scriban;
using System.Web;
namespace Tesses.YouTubeDownloader2025Companion
{
public static partial class Pages {
private static ReloadingScript myalbum_listing = new ReloadingScript("wwwroot/pages/music/myalbums/albums.sbnhtml");
public static string MyAlbumListing(string query, List<MyAlbumLink> links,int page)
{
return Components.Shell($"Album search {query}", myalbum_listing.Render(new {
Albums = links,
Q = HttpUtility.HtmlAttributeEncode(query),
Prev = HttpUtility.HtmlAttributeEncode($"/music/myalbums?q={HttpUtility.UrlEncode(query)}&page={(page == 1 ? 1 : page - 1)}"),
Current = page,
Next = HttpUtility.HtmlAttributeEncode($"/music/myalbums?q={HttpUtility.UrlEncode(query)}&page={page + 1}")
}),Program.DefaultLinks());
}
}
}
@@ -0,0 +1,27 @@
using Tesses.WebServer;
using Scriban;
using System.Web;
//using YouTubeMusicAPI.Models.Info;
namespace Tesses.YouTubeDownloader2025Companion
{
public class MyAlbumLink(string name, string id, string thumbnail) {
public string Albumname => HttpUtility.HtmlEncode(name);
public string Albumurl => HttpUtility.HtmlAttributeEncode($"/music/myalbum?id={HttpUtility.UrlEncode(id)}");
public string Imgurl => HttpUtility.HtmlAttributeEncode(thumbnail);
}
public static partial class Pages {
private static ReloadingScript myartist_album_listing = new ReloadingScript("wwwroot/pages/music/myartists/artist-album-list.sbnhtml");
public static string MyArtistAlbumListing(Guid id,string query, List<MyAlbumLink> albums, int page)
{
return Components.Shell("Albums", myartist_album_listing.Render(new {
Searchurl = $"/music/myartist?id={id.ToString()}",
Q = HttpUtility.HtmlAttributeEncode(query),
Albums = albums,
Prev = HttpUtility.HtmlAttributeEncode($"/music/myartist?q={HttpUtility.UrlEncode(query)}&id={HttpUtility.UrlEncode(id.ToString())}&page={(page == 1 ? 1 : page - 1)}"),
Current = page,
Next = HttpUtility.HtmlAttributeEncode($"/music/myartist?q={HttpUtility.UrlEncode(query)}&id={HttpUtility.UrlEncode(id.ToString())}&page={page + 1}")
}),Program.DefaultLinks());
}
}
}
+26
View File
@@ -0,0 +1,26 @@
using Tesses.WebServer;
using Scriban;
using System.Web;
namespace Tesses.YouTubeDownloader2025Companion
{
public class MyArtistLink(string name, string id, string thumbnail) {
public string Artistname => HttpUtility.HtmlEncode(name);
public string Artisturl => HttpUtility.HtmlAttributeEncode($"/music/myartist?id={HttpUtility.UrlEncode(id)}");
public string Imgurl => HttpUtility.HtmlAttributeEncode(thumbnail);
}
public static partial class Pages {
private static ReloadingScript myartist_listing = new ReloadingScript("wwwroot/pages/music/myartists/artists.sbnhtml");
public static string MyArtistListing(string query, List<MyArtistLink> links, int page)
{
return Components.Shell($"Artist search {query}", myartist_listing.Render(new {
Artists = links,
Q = HttpUtility.HtmlAttributeEncode(query),
Prev = HttpUtility.HtmlAttributeEncode($"/music/myartists?q={HttpUtility.UrlEncode(query)}&page={(page == 1 ? 1 : page - 1)}"),
Current = page,
Next = HttpUtility.HtmlAttributeEncode($"/music/myartists?q={HttpUtility.UrlEncode(query)}&page={page + 1}")
}),Program.DefaultLinks());
}
}
}
+55
View File
@@ -0,0 +1,55 @@
using Tesses.WebServer;
using Scriban;
using System.Web;
using System.Text;
namespace Tesses.YouTubeDownloader2025Companion
{
public static partial class Pages {
private static ReloadingScript mysong = new ReloadingScript("wwwroot/pages/music/mysongs/song.sbnhtml");
private static ReloadingScript isnt_correct = new ReloadingScript("wwwroot/components/music/mysongs/isntcorrect.sbnhtml");
public static string IsntCorrect(string songId, string albumId, string query)
{
return isnt_correct.Render(new {
Cancelurl = HttpUtility.HtmlAttributeEncode($"/music/mysong?songId={HttpUtility.UrlEncode(songId)}&albumId={HttpUtility.UrlEncode(albumId)}"),
Albumid = HttpUtility.HtmlAttributeEncode(albumId),
Songid = HttpUtility.HtmlAttributeEncode(songId),
Searchurl = query == "" ? "" : HttpUtility.HtmlAttributeEncode($"/search_dialog?q={HttpUtility.UrlEncode(query)}")
});
}
public static string MySong(Song song, Album album, SongVideo video, string tytdEndpoint,bool downloaded, int trackIndex, TimeSpan ts, List<Artist> contributingArtists)
{
StringBuilder builder=new StringBuilder();
for(int i = 0; i < contributingArtists.Count; i++)
{
string link = $"<a hx-target=\"body\" hx-push-url=\"true\" hx-get=\"{HttpUtility.HtmlAttributeEncode($"/music/myartist?id={HttpUtility.UrlEncode(contributingArtists[i].ArtistId)}")}\" href=\"{HttpUtility.HtmlAttributeEncode($"/music/myartist?id={HttpUtility.UrlEncode(contributingArtists[i].ArtistId)}")}\">{HttpUtility.HtmlEncode(contributingArtists[i].ArtistName)}</a>";
if(i == 0)
builder.Append(link);
else if(i == 1)
builder.Append($" feat {link}");
else
builder.Append($", {link}");
}
return Components.Shell("", mysong.Render(new {
Songname = HttpUtility.HtmlEncode(song.SongName),
Albumurl = HttpUtility.HtmlAttributeEncode($"/music/myalbum?id={HttpUtility.UrlEncode(album.AlbumId)}"),
Albumname = HttpUtility.HtmlEncode(album.AlbumName),
Trackindex = trackIndex.ToString("D2"),
Duration = ts.ToString("m\\:ss"),
Albumart = HttpUtility.HtmlAttributeEncode($"/api/v1/album-thumbnail?id={HttpUtility.UrlEncode(album.AlbumId)}"),
Artists = builder.ToString(),
Videothumbnail = HttpUtility.HtmlAttributeEncode($"/api/v1/video-thumbnail?v={HttpUtility.UrlEncode(video.VideoId)}"),
Videotitle = HttpUtility.HtmlEncode($"{video.VideoTitle}-{video.VideoId}"),
Incorrectsongurl = HttpUtility.HtmlAttributeEncode($"/music/fix-song?songId={HttpUtility.UrlEncode(song.SongId)}&albumId={HttpUtility.UrlEncode(album.AlbumId)}"),
Tytdurl = HttpUtility.HtmlAttributeEncode($"{tytdEndpoint.TrimEnd('/')}/watch?v={HttpUtility.UrlEncode(video.VideoId)}"),
Dlbtn = downloaded ? $"<a class=\"button\" href=\"/api/v1/song?albumId={HttpUtility.UrlEncode(album.AlbumId)}&songId={HttpUtility.UrlEncode(song.SongId)}\"><i>download</i> Download</a>" : string.IsNullOrEmpty(video.VideoId) ? "<span><i>file_download_off</i> Unavailable</span>" : "<span><i>downloading</i> Downloading</span>",
Hasvideo = !string.IsNullOrEmpty(video.VideoId)
}),Program.DefaultLinks());
}
}
}
+28
View File
@@ -0,0 +1,28 @@
using Tesses.WebServer;
using Scriban;
using System.Web;
namespace Tesses.YouTubeDownloader2025Companion
{
public class MySongLink(string name, string id, string btn) {
public string Name => HttpUtility.HtmlEncode(name);
public string Songname => HttpUtility.HtmlEncode(name);
public string Songurl => HttpUtility.HtmlAttributeEncode($"/music/mysong?songId={HttpUtility.UrlEncode(id)}");
public string Btn => btn;
}
public static partial class Pages {
private static ReloadingScript mysongs_listing = new ReloadingScript("wwwroot/pages/music/mysongs/songs.sbnhtml");
public static string MySongListing(string query, List<MySongLink> links, int page)
{
return Components.Shell($"Artist search {query}", mysongs_listing.Render(new {
Songs = links,
Q = HttpUtility.HtmlAttributeEncode(query),
Prev = HttpUtility.HtmlAttributeEncode($"/music/mysongs?q={HttpUtility.UrlEncode(query)}&page={(page == 1 ? 1 : page - 1)}"),
Current = page,
Next = HttpUtility.HtmlAttributeEncode($"/music/mysongs?q={HttpUtility.UrlEncode(query)}&page={page + 1}")
}),Program.DefaultLinks());
}
}
}