Browse Source

rename to ersatztv legacy (#2842)

* remove stale issue workflow [no ci]

* rename and cleanup (#1)

* rename artifacts; remove github changelog

* update dependencies

* remove unused markdown view

* fix app name in macos scripts

* fix unit tests

* more dependency updates (#2)
pull/2849/head
Jason Dove 1 month ago committed by GitHub
parent
commit
1e5c0b1218
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 20
      .github/workflows/artifacts.yml
  2. 4
      .github/workflows/ci.yml
  3. 24
      .github/workflows/docker.yml
  4. 27
      .github/workflows/issue-stale.yml
  5. 4
      .github/workflows/release.yml
  6. 10
      ErsatzTV.Application/ErsatzTV.Application.csproj
  7. 22
      ErsatzTV.Core.Tests/ErsatzTV.Core.Tests.csproj
  8. 24
      ErsatzTV.Core/ErsatzTV.Core.csproj
  9. 7
      ErsatzTV.Core/Interfaces/GitHub/IGitHubApiClient.cs
  10. 8
      ErsatzTV.FFmpeg.Tests/ErsatzTV.FFmpeg.Tests.csproj
  11. 6
      ErsatzTV.FFmpeg/ErsatzTV.FFmpeg.csproj
  12. 2
      ErsatzTV.Infrastructure.MySql/ErsatzTV.Infrastructure.MySql.csproj
  13. 6
      ErsatzTV.Infrastructure.Sqlite/ErsatzTV.Infrastructure.Sqlite.csproj
  14. 10
      ErsatzTV.Infrastructure.Tests/ErsatzTV.Infrastructure.Tests.csproj
  15. 20
      ErsatzTV.Infrastructure/ErsatzTV.Infrastructure.csproj
  16. 34
      ErsatzTV.Infrastructure/GitHub/GitHubApiClient.cs
  17. 14
      ErsatzTV.Infrastructure/GitHub/IGitHubApi.cs
  18. 6
      ErsatzTV.Infrastructure/GitHub/Models/GitHubTag.cs
  19. 10
      ErsatzTV.Scanner.Tests/ErsatzTV.Scanner.Tests.csproj
  20. 14
      ErsatzTV.Scanner/ErsatzTV.Scanner.csproj
  21. 6
      ErsatzTV.Tests/ErsatzTV.Tests.csproj
  22. 21
      ErsatzTV/ErsatzTV.csproj
  23. 2
      ErsatzTV/Locals/Shared/MainLayout.resx
  24. 82
      ErsatzTV/Pages/Index.razor
  25. 2
      ErsatzTV/Pages/_Host.cshtml
  26. 1
      ErsatzTV/Shared/MarkdownView.razor
  27. 69
      ErsatzTV/Shared/MarkdownView.razor.cs
  28. 10
      ErsatzTV/Startup.cs
  29. 2
      scripts/macOS/bundle.sh
  30. 2
      scripts/macOS/sign.sh

20
.github/workflows/artifacts.yml

@ -74,7 +74,7 @@ jobs:
- name: Calculate Release Name - name: Calculate Release Name
shell: bash shell: bash
run: | run: |
release_name="ErsatzTV-${{ inputs.release_version }}-${{ matrix.target }}" release_name="ErsatzTV-Legacy-${{ inputs.release_version }}-${{ matrix.target }}"
echo "RELEASE_NAME=${release_name}" >> $GITHUB_ENV echo "RELEASE_NAME=${release_name}" >> $GITHUB_ENV
- name: Build - name: Build
@ -101,7 +101,7 @@ jobs:
run: | run: |
brew install create-dmg brew install create-dmg
create-dmg \ create-dmg \
--volname "ErsatzTV" \ --volname "ErsatzTV-Legacy" \
--volicon "artwork/ErsatzTV.icns" \ --volicon "artwork/ErsatzTV.icns" \
--window-pos 200 120 \ --window-pos 200 120 \
--window-size 800 400 \ --window-size 800 400 \
@ -111,21 +111,21 @@ jobs:
--app-drop-link 600 185 \ --app-drop-link 600 185 \
--skip-jenkins \ --skip-jenkins \
--no-internet-enable \ --no-internet-enable \
"ErsatzTV.dmg" \ "ErsatzTV-Legacy.dmg" \
"ErsatzTV.app/" "ErsatzTV-Legacy.app/"
- name: Notarize - name: Notarize
shell: bash shell: bash
run: | run: |
xcrun notarytool submit ErsatzTV.dmg --apple-id "${{ secrets.ac_username }}" --password "${{ secrets.ac_password }}" --team-id 32MB98Q32R --wait xcrun notarytool submit ErsatzTV-Legacy.dmg --apple-id "${{ secrets.ac_username }}" --password "${{ secrets.ac_password }}" --team-id 32MB98Q32R --wait
xcrun stapler staple ErsatzTV.dmg xcrun stapler staple ErsatzTV-Legacy.dmg
- name: Cleanup - name: Cleanup
shell: bash shell: bash
run: | run: |
mv ErsatzTV.dmg "${{ env.RELEASE_NAME }}.dmg" mv ErsatzTV-Legacy.dmg "${{ env.RELEASE_NAME }}.dmg"
rm -r publish rm -r publish
rm -r ErsatzTV.app rm -r ErsatzTV-Legacy.app
- name: Delete old release assets - name: Delete old release assets
uses: mknejp/delete-release-assets@v1 uses: mknejp/delete-release-assets@v1
@ -184,7 +184,7 @@ jobs:
shell: bash shell: bash
run: | run: |
# Define some variables for things we need # Define some variables for things we need
release_name="ErsatzTV-${{ inputs.release_version }}-${{ matrix.target }}" release_name="ErsatzTV-Legacy-${{ inputs.release_version }}-${{ matrix.target }}"
echo "RELEASE_NAME=${release_name}" >> $GITHUB_ENV echo "RELEASE_NAME=${release_name}" >> $GITHUB_ENV
# Build everything # Build everything
@ -301,7 +301,7 @@ jobs:
- name: Package artifacts - name: Package artifacts
shell: bash shell: bash
run: | run: |
release_name="ErsatzTV-${{ inputs.release_version }}-win-x64" release_name="ErsatzTV-Legacy-${{ inputs.release_version }}-win-x64"
echo "RELEASE_NAME=${release_name}" >> $GITHUB_ENV echo "RELEASE_NAME=${release_name}" >> $GITHUB_ENV
mkdir "$release_name" mkdir "$release_name"

4
.github/workflows/ci.yml

@ -34,7 +34,7 @@ jobs:
artifacts_version: ${{ env.ARTIFACTS_VERSION }} artifacts_version: ${{ env.ARTIFACTS_VERSION }}
info_version: ${{ env.INFO_VERSION }} info_version: ${{ env.INFO_VERSION }}
build_and_upload: build_and_upload:
uses: ersatztv/ersatztv/.github/workflows/artifacts.yml@main uses: ersatztv/legacy/.github/workflows/artifacts.yml@main
needs: calculate_version needs: calculate_version
with: with:
release_tag: develop release_tag: develop
@ -51,7 +51,7 @@ jobs:
azure_subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} azure_subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
build_images: build_images:
uses: ersatztv/ersatztv/.github/workflows/docker.yml@main uses: ersatztv/legacy/.github/workflows/docker.yml@main
needs: calculate_version needs: calculate_version
with: with:
base_version: develop base_version: develop

24
.github/workflows/docker.yml

@ -80,8 +80,8 @@ jobs:
build-args: | build-args: |
INFO_VERSION=${{ inputs.info_version }}-docker${{ matrix.suffix }} INFO_VERSION=${{ inputs.info_version }}-docker${{ matrix.suffix }}
outputs: | outputs: |
type=image,name=jasongdove/ersatztv,name-canonical=true,push-by-digest=true type=image,name=ersatztv/legacy,name-canonical=true,push-by-digest=true
type=image,name=ghcr.io/ersatztv/ersatztv,name-canonical=true,push-by-digest=true type=image,name=ghcr.io/ersatztv/legacy,name-canonical=true,push-by-digest=true
- name: Save digest to artifact - name: Save digest to artifact
run: echo ${{ steps.build.outputs.digest }} > digest.txt run: echo ${{ steps.build.outputs.digest }} > digest.txt
@ -122,20 +122,20 @@ jobs:
ARM32V7_HASH=$(cat digests/digest-arm32v7/digest.txt) ARM32V7_HASH=$(cat digests/digest-arm32v7/digest.txt)
ARM64_HASH=$(cat digests/digest-arm64/digest.txt) ARM64_HASH=$(cat digests/digest-arm64/digest.txt)
DOCKER_HUB_DIGESTS="jasongdove/ersatztv@${AMD64_HASH} jasongdove/ersatztv@${ARM64_HASH} jasongdove/ersatztv@${ARM32V7_HASH}" DOCKER_HUB_DIGESTS="ersatztv/legacy@${AMD64_HASH} ersatztv/legacy@${ARM64_HASH} ersatztv/legacy@${ARM32V7_HASH}"
GHCR_DIGESTS="ghcr.io/ersatztv/ersatztv@${AMD64_HASH} ghcr.io/ersatztv/ersatztv@${ARM64_HASH} ghcr.io/ersatztv/ersatztv@${ARM32V7_HASH}" GHCR_DIGESTS="ghcr.io/ersatztv/legacy@${AMD64_HASH} ghcr.io/ersatztv/legacy@${ARM64_HASH} ghcr.io/ersatztv/legacy@${ARM32V7_HASH}"
echo "docker_hub_digests=${DOCKER_HUB_DIGESTS}" >> $GITHUB_OUTPUT echo "docker_hub_digests=${DOCKER_HUB_DIGESTS}" >> $GITHUB_OUTPUT
echo "ghcr_digests=${GHCR_DIGESTS}" >> $GITHUB_OUTPUT echo "ghcr_digests=${GHCR_DIGESTS}" >> $GITHUB_OUTPUT
- name: Create and push manifests - name: Create and push manifests
run: | run: |
docker manifest create jasongdove/ersatztv:${{ inputs.base_version }} ${{ steps.digests.outputs.docker_hub_digests }} docker manifest create ersatztv/legacy:${{ inputs.base_version }} ${{ steps.digests.outputs.docker_hub_digests }}
docker manifest push jasongdove/ersatztv:${{ inputs.base_version }} docker manifest push ersatztv/legacy:${{ inputs.base_version }}
docker manifest create jasongdove/ersatztv:${{ inputs.tag_version }} ${{ steps.digests.outputs.docker_hub_digests }} docker manifest create ersatztv/legacy:${{ inputs.tag_version }} ${{ steps.digests.outputs.docker_hub_digests }}
docker manifest push jasongdove/ersatztv:${{ inputs.tag_version }} docker manifest push ersatztv/legacy:${{ inputs.tag_version }}
docker manifest create ghcr.io/ersatztv/ersatztv:${{ inputs.base_version }} ${{ steps.digests.outputs.ghcr_digests }} docker manifest create ghcr.io/ersatztv/legacy:${{ inputs.base_version }} ${{ steps.digests.outputs.ghcr_digests }}
docker manifest push ghcr.io/ersatztv/ersatztv:${{ inputs.base_version }} docker manifest push ghcr.io/ersatztv/legacy:${{ inputs.base_version }}
docker manifest create ghcr.io/ersatztv/ersatztv:${{ inputs.tag_version }} ${{ steps.digests.outputs.ghcr_digests }} docker manifest create ghcr.io/ersatztv/legacy:${{ inputs.tag_version }} ${{ steps.digests.outputs.ghcr_digests }}
docker manifest push ghcr.io/ersatztv/ersatztv:${{ inputs.tag_version }} docker manifest push ghcr.io/ersatztv/legacy:${{ inputs.tag_version }}

27
.github/workflows/issue-stale.yml

@ -1,27 +0,0 @@
name: 'Close stale issues'
on:
schedule:
- cron: '30 1 * * *'
workflow_dispatch:
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v9
with:
ascending: true
days-before-stale: 120
days-before-pr-stale: -1
days-before-close: 21
days-before-pr-close: -1
operations-per-run: 500
exempt-issue-labels: 'regression,security,roadmap,future,feature,enhancement,confirmed'
stale-issue-label: 'stale'
stale-issue-message: |-
This issue has gone 120 days without an update and will be closed within 21 days if there is no new activity. To prevent this issue from being closed, please confirm the issue has not already been fixed by providing updated examples or logs.
If you have any questions you can use one of several ways to [contact us](https://ersatztv.org).
close-issue-message: |-
This issue was closed due to inactivity.

4
.github/workflows/release.yml

@ -29,7 +29,7 @@ jobs:
artifacts_version: ${{ env.ARTIFACTS_VERSION }} artifacts_version: ${{ env.ARTIFACTS_VERSION }}
info_version: ${{ env.INFO_VERSION }} info_version: ${{ env.INFO_VERSION }}
build_and_upload: build_and_upload:
uses: ersatztv/ersatztv/.github/workflows/artifacts.yml@main uses: ersatztv/legacy/.github/workflows/artifacts.yml@main
needs: calculate_version needs: calculate_version
with: with:
release_tag: ${{ needs.calculate_version.outputs.artifacts_version }} release_tag: ${{ needs.calculate_version.outputs.artifacts_version }}
@ -45,7 +45,7 @@ jobs:
azure_tenant_id: ${{ secrets.AZURE_TENANT_ID }} azure_tenant_id: ${{ secrets.AZURE_TENANT_ID }}
azure_subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} azure_subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
build_images: build_images:
uses: ersatztv/ersatztv/.github/workflows/docker.yml@main uses: ersatztv/legacy/.github/workflows/docker.yml@main
needs: calculate_version needs: calculate_version
with: with:
base_version: latest base_version: latest

10
ErsatzTV.Application/ErsatzTV.Application.csproj

@ -10,14 +10,14 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="CliWrap" Version="3.10.0" /> <PackageReference Include="CliWrap" Version="3.10.1" />
<PackageReference Include="Humanizer.Core" Version="3.0.1" /> <PackageReference Include="Humanizer.Core" Version="3.0.10" />
<PackageReference Include="MediatR" Version="[12.5.0]" /> <PackageReference Include="MediatR" Version="[12.5.0]" />
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.2" /> <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.6" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.2" /> <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.6" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="Serilog.Formatting.Compact.Reader" Version="4.0.0" /> <PackageReference Include="Serilog.Formatting.Compact.Reader" Version="4.0.0" />
<PackageReference Include="WebMarkupMin.Core" Version="2.20.1" /> <PackageReference Include="WebMarkupMin.Core" Version="2.21.0" />
<PackageReference Include="Winista.MimeDetect" Version="1.1.0" /> <PackageReference Include="Winista.MimeDetect" Version="1.1.0" />
</ItemGroup> </ItemGroup>

22
ErsatzTV.Core.Tests/ErsatzTV.Core.Tests.csproj

@ -7,22 +7,22 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="CliWrap" Version="3.10.0" /> <PackageReference Include="CliWrap" Version="3.10.1" />
<PackageReference Include="LanguageExt.Core" Version="4.4.9" /> <PackageReference Include="LanguageExt.Core" Version="4.4.9" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.2" /> <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.6" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.2" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.6" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.2" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.6" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.2" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.6" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="10.0.2" /> <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="10.0.6" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.4.0" />
<PackageReference Include="NSubstitute" Version="5.3.0" /> <PackageReference Include="NSubstitute" Version="5.3.0" />
<PackageReference Include="NUnit" Version="4.4.0" /> <PackageReference Include="NUnit" Version="4.5.1" />
<PackageReference Include="NUnit3TestAdapter" Version="6.1.0" /> <PackageReference Include="NUnit3TestAdapter" Version="6.2.0" />
<PackageReference Include="Serilog" Version="4.3.0" /> <PackageReference Include="Serilog" Version="4.3.1" />
<PackageReference Include="Serilog.Extensions.Logging" Version="10.0.0" /> <PackageReference Include="Serilog.Extensions.Logging" Version="10.0.0" />
<PackageReference Include="Serilog.Sinks.Debug" Version="3.0.0" /> <PackageReference Include="Serilog.Sinks.Debug" Version="3.0.0" />
<PackageReference Include="Shouldly" Version="4.3.0" /> <PackageReference Include="Shouldly" Version="4.3.0" />
<PackageReference Include="Testably.Abstractions.Testing" Version="5.1.0" /> <PackageReference Include="Testably.Abstractions.Testing" Version="6.2.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

24
ErsatzTV.Core/ErsatzTV.Core.csproj

@ -10,25 +10,25 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Destructurama.Attributed" Version="5.2.0" /> <PackageReference Include="Destructurama.Attributed" Version="5.3.0" />
<PackageReference Include="Flurl" Version="4.0.0" /> <PackageReference Include="Flurl" Version="4.0.0" />
<PackageReference Include="Humanizer.Core" Version="3.0.1" /> <PackageReference Include="Humanizer.Core" Version="3.0.10" />
<PackageReference Include="LanguageExt.Core" Version="4.4.9" /> <PackageReference Include="LanguageExt.Core" Version="4.4.9" />
<PackageReference Include="LanguageExt.Transformers" Version="4.4.8" /> <PackageReference Include="LanguageExt.Transformers" Version="4.4.8" />
<PackageReference Include="MediatR" Version="[12.5.0]" /> <PackageReference Include="MediatR" Version="[12.5.0]" />
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.2" /> <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.6" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.2" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.6" />
<PackageReference Include="Microsoft.Extensions.Http" Version="10.0.2" /> <PackageReference Include="Microsoft.Extensions.Http" Version="10.0.6" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.2" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.6" />
<PackageReference Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.1" /> <PackageReference Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.1" />
<PackageReference Include="NCalcSync" Version="5.11.0" /> <PackageReference Include="NCalcSync" Version="5.12.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="Serilog" Version="4.3.0" /> <PackageReference Include="Serilog" Version="4.3.1" />
<PackageReference Include="Serilog.Sinks.Console" Version="6.1.1" /> <PackageReference Include="Serilog.Sinks.Console" Version="6.1.1" />
<PackageReference Include="SkiaSharp" Version="3.119.1" /> <PackageReference Include="SkiaSharp" Version="3.119.2" />
<PackageReference Include="SkiaSharp.NativeAssets.Linux.NoDependencies" Version="3.119.1" /> <PackageReference Include="SkiaSharp.NativeAssets.Linux.NoDependencies" Version="3.119.2" />
<PackageReference Include="System.CommandLine" Version="2.0.2" /> <PackageReference Include="System.CommandLine" Version="2.0.6" />
<PackageReference Include="Testably.Abstractions" Version="10.0.0" /> <PackageReference Include="Testably.Abstractions" Version="10.2.0" />
<PackageReference Include="TimeSpanParserUtil" Version="1.2.0" /> <PackageReference Include="TimeSpanParserUtil" Version="1.2.0" />
<PackageReference Include="YamlDotNet" Version="16.3.0" /> <PackageReference Include="YamlDotNet" Version="16.3.0" />
</ItemGroup> </ItemGroup>

7
ErsatzTV.Core/Interfaces/GitHub/IGitHubApiClient.cs

@ -1,7 +0,0 @@
namespace ErsatzTV.Core.Interfaces.GitHub;
public interface IGitHubApiClient
{
Task<Either<BaseError, string>> GetLatestReleaseNotes(CancellationToken cancellationToken);
Task<Either<BaseError, string>> GetReleaseNotes(string tag, CancellationToken cancellationToken);
}

8
ErsatzTV.FFmpeg.Tests/ErsatzTV.FFmpeg.Tests.csproj

@ -9,11 +9,11 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="[8.0.2]" /> <PackageReference Include="Microsoft.Extensions.DependencyModel" Version="[8.0.2]" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.2" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.6" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.4.0" />
<PackageReference Include="NSubstitute" Version="5.3.0" /> <PackageReference Include="NSubstitute" Version="5.3.0" />
<PackageReference Include="NUnit" Version="4.4.0" /> <PackageReference Include="NUnit" Version="4.5.1" />
<PackageReference Include="NUnit3TestAdapter" Version="6.1.0" /> <PackageReference Include="NUnit3TestAdapter" Version="6.2.0" />
<PackageReference Include="Shouldly" Version="4.3.0" /> <PackageReference Include="Shouldly" Version="4.3.0" />
<PackageReference Include="coverlet.collector" Version="6.0.4"> <PackageReference Include="coverlet.collector" Version="6.0.4">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>

6
ErsatzTV.FFmpeg/ErsatzTV.FFmpeg.csproj

@ -11,12 +11,12 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="CliWrap" Version="3.10.0" /> <PackageReference Include="CliWrap" Version="3.10.1" />
<PackageReference Include="Hardware.Info" Version="101.1.1.1" /> <PackageReference Include="Hardware.Info" Version="101.1.1.1" />
<PackageReference Include="LanguageExt.Core" Version="4.4.9" /> <PackageReference Include="LanguageExt.Core" Version="4.4.9" />
<PackageReference Include="Lennox.NvEncSharp" Version="2.0.0" /> <PackageReference Include="Lennox.NvEncSharp" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.2" /> <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.6" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.2" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.6" />
</ItemGroup> </ItemGroup>

2
ErsatzTV.Infrastructure.MySql/ErsatzTV.Infrastructure.MySql.csproj

@ -17,7 +17,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="EFCore.BulkExtensions.MySql" Version="[9.0.2,10)" /> <PackageReference Include="EFCore.BulkExtensions.MySql" Version="[9.0.2,10)" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[9.0.12,10)" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="9.0.15" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="9.0.0" /> <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="9.0.0" />
</ItemGroup> </ItemGroup>

6
ErsatzTV.Infrastructure.Sqlite/ErsatzTV.Infrastructure.Sqlite.csproj

@ -12,10 +12,10 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Dapper" Version="2.1.66" /> <PackageReference Include="Dapper" Version="2.1.72" />
<PackageReference Include="EFCore.BulkExtensions.Sqlite" Version="[9.0.2,10)" /> <PackageReference Include="EFCore.BulkExtensions.Sqlite" Version="[9.0.2,10)" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[9.0.12,10)" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="9.0.15" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="[9.0.12,10)" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.15" />
</ItemGroup> </ItemGroup>

10
ErsatzTV.Infrastructure.Tests/ErsatzTV.Infrastructure.Tests.csproj

@ -9,11 +9,11 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.4.0" />
<PackageReference Include="NSubstitute" Version="5.3.0" /> <PackageReference Include="NSubstitute" Version="5.3.0" />
<PackageReference Include="NUnit" Version="4.4.0" /> <PackageReference Include="NUnit" Version="4.5.1" />
<PackageReference Include="NUnit3TestAdapter" Version="6.1.0" /> <PackageReference Include="NUnit3TestAdapter" Version="6.2.0" />
<PackageReference Include="NUnit.Analyzers" Version="4.11.2"> <PackageReference Include="NUnit.Analyzers" Version="4.12.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
</PackageReference> </PackageReference>
@ -22,7 +22,7 @@
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Shouldly" Version="4.3.0" /> <PackageReference Include="Shouldly" Version="4.3.0" />
<PackageReference Include="Testably.Abstractions.Testing" Version="5.1.0" /> <PackageReference Include="Testably.Abstractions.Testing" Version="6.2.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

20
ErsatzTV.Infrastructure/ErsatzTV.Infrastructure.csproj

@ -13,22 +13,22 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Blurhash.SkiaSharp" Version="2.0.0" /> <PackageReference Include="Blurhash.SkiaSharp" Version="2.0.0" />
<PackageReference Include="CliWrap" Version="3.10.0" /> <PackageReference Include="CliWrap" Version="3.10.1" />
<PackageReference Include="Dapper" Version="2.1.66" /> <PackageReference Include="Dapper" Version="2.1.72" />
<PackageReference Include="EFCore.BulkExtensions" Version="[9.0.2,10)" /> <PackageReference Include="EFCore.BulkExtensions" Version="[9.0.2,10)" />
<PackageReference Include="Elastic.Clients.Elasticsearch" Version="9.3.0" /> <PackageReference Include="Elastic.Clients.Elasticsearch" Version="9.3.4" />
<PackageReference Include="Humanizer.Core" Version="3.0.1" /> <PackageReference Include="Humanizer.Core" Version="3.0.10" />
<PackageReference Include="Jint" Version="4.5.0" /> <PackageReference Include="Jint" Version="4.8.0" />
<PackageReference Include="JsonSchema.Net" Version="9.0.0" /> <PackageReference Include="JsonSchema.Net" Version="9.2.0" />
<PackageReference Include="Lucene.Net" Version="4.8.0-beta00017" /> <PackageReference Include="Lucene.Net" Version="4.8.0-beta00017" />
<PackageReference Include="Lucene.Net.Analysis.Common" Version="4.8.0-beta00017" /> <PackageReference Include="Lucene.Net.Analysis.Common" Version="4.8.0-beta00017" />
<PackageReference Include="Lucene.Net.QueryParser" Version="4.8.0-beta00017" /> <PackageReference Include="Lucene.Net.QueryParser" Version="4.8.0-beta00017" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="[9.0.12,10)" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.15" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="[9.0.12,10)"> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.15">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[9.0.12,10)" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="9.0.15" />
<PackageReference Include="Newtonsoft.Json.Schema" Version="4.0.1" /> <PackageReference Include="Newtonsoft.Json.Schema" Version="4.0.1" />
<PackageReference Include="Refit" Version="9.0.2" /> <PackageReference Include="Refit" Version="9.0.2" />
<PackageReference Include="Refit.Newtonsoft.Json" Version="9.0.2" /> <PackageReference Include="Refit.Newtonsoft.Json" Version="9.0.2" />
@ -36,7 +36,7 @@
<PackageReference Include="RichTextKit.Stbear" Version="0.4.167.3" /> <PackageReference Include="RichTextKit.Stbear" Version="0.4.167.3" />
<PackageReference Include="Scriban.Signed" Version="6.5.2" /> <PackageReference Include="Scriban.Signed" Version="6.5.2" />
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.12" /> <PackageReference Include="SixLabors.ImageSharp" Version="3.1.12" />
<PackageReference Include="SkiaSharp" Version="3.119.1" /> <PackageReference Include="SkiaSharp" Version="3.119.2" />
<PackageReference Include="TagLibSharp" Version="2.3.0" /> <PackageReference Include="TagLibSharp" Version="2.3.0" />
<PackageReference Include="TimeZoneConverter" Version="7.2.0" /> <PackageReference Include="TimeZoneConverter" Version="7.2.0" />
</ItemGroup> </ItemGroup>

34
ErsatzTV.Infrastructure/GitHub/GitHubApiClient.cs

@ -1,34 +0,0 @@
using ErsatzTV.Core;
using ErsatzTV.Core.Interfaces.GitHub;
using Refit;
namespace ErsatzTV.Infrastructure.GitHub;
public class GitHubApiClient : IGitHubApiClient
{
public async Task<Either<BaseError, string>> GetLatestReleaseNotes(CancellationToken cancellationToken)
{
try
{
IGitHubApi service = RestService.For<IGitHubApi>("https://api.github.com");
return await service.GetReleases(cancellationToken).Map(releases => releases.Head().Body);
}
catch (Exception ex)
{
return BaseError.New(ex.ToString());
}
}
public async Task<Either<BaseError, string>> GetReleaseNotes(string tag, CancellationToken cancellationToken)
{
try
{
IGitHubApi service = RestService.For<IGitHubApi>("https://api.github.com");
return await service.GetTag(tag, cancellationToken).Map(t => t.Body);
}
catch (Exception ex)
{
return BaseError.New(ex.ToString());
}
}
}

14
ErsatzTV.Infrastructure/GitHub/IGitHubApi.cs

@ -1,14 +0,0 @@
using ErsatzTV.Infrastructure.GitHub.Models;
using Refit;
namespace ErsatzTV.Infrastructure.GitHub;
[Headers("Accept: application/vnd.github.v3+json", "User-Agent: ErsatzTV/ErsatzTV")]
public interface IGitHubApi
{
[Get("/repos/ErsatzTV/ErsatzTV/releases")]
Task<List<GitHubTag>> GetReleases(CancellationToken cancellationToken);
[Get("/repos/ErsatzTV/ErsatzTV/releases/tags/{tag}")]
Task<GitHubTag> GetTag(string tag, CancellationToken cancellationToken);
}

6
ErsatzTV.Infrastructure/GitHub/Models/GitHubTag.cs

@ -1,6 +0,0 @@
namespace ErsatzTV.Infrastructure.GitHub.Models;
public class GitHubTag
{
public string Body { get; set; }
}

10
ErsatzTV.Scanner.Tests/ErsatzTV.Scanner.Tests.csproj

@ -10,11 +10,11 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="LanguageExt.Core" Version="4.4.9" /> <PackageReference Include="LanguageExt.Core" Version="4.4.9" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.4.0" />
<PackageReference Include="NSubstitute" Version="5.3.0" /> <PackageReference Include="NSubstitute" Version="5.3.0" />
<PackageReference Include="NUnit" Version="4.4.0" /> <PackageReference Include="NUnit" Version="4.5.1" />
<PackageReference Include="NUnit3TestAdapter" Version="6.1.0" /> <PackageReference Include="NUnit3TestAdapter" Version="6.2.0" />
<PackageReference Include="NUnit.Analyzers" Version="4.11.2"> <PackageReference Include="NUnit.Analyzers" Version="4.12.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
</PackageReference> </PackageReference>
@ -23,7 +23,7 @@
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Shouldly" Version="4.3.0" /> <PackageReference Include="Shouldly" Version="4.3.0" />
<PackageReference Include="Testably.Abstractions.Testing" Version="5.1.0" /> <PackageReference Include="Testably.Abstractions.Testing" Version="6.2.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

14
ErsatzTV.Scanner/ErsatzTV.Scanner.csproj

@ -21,21 +21,21 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="CliWrap" Version="3.10.0" /> <PackageReference Include="CliWrap" Version="3.10.1" />
<!-- <PackageReference Include="EntityFrameworkProfiler.Appender" Version="6.0.6049" />--> <!-- <PackageReference Include="EntityFrameworkProfiler.Appender" Version="6.0.6049" />-->
<PackageReference Include="Humanizer.Core" Version="3.0.1" /> <PackageReference Include="Humanizer.Core" Version="3.0.10" />
<PackageReference Include="LanguageExt.Core" Version="4.4.9" /> <PackageReference Include="LanguageExt.Core" Version="4.4.9" />
<PackageReference Include="MediatR" Version="[12.5.0]" /> <PackageReference Include="MediatR" Version="[12.5.0]" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.2" /> <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.6" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="10.0.2" /> <PackageReference Include="Microsoft.Extensions.Configuration" Version="10.0.6" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.2" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.6" />
<PackageReference Include="Serilog" Version="4.3.0" /> <PackageReference Include="Serilog" Version="4.3.1" />
<PackageReference Include="Serilog.AspNetCore" Version="10.0.0" /> <PackageReference Include="Serilog.AspNetCore" Version="10.0.0" />
<PackageReference Include="Serilog.Extensions.Hosting" Version="10.0.0" /> <PackageReference Include="Serilog.Extensions.Hosting" Version="10.0.0" />
<PackageReference Include="Serilog.Formatting.Compact" Version="3.0.0" /> <PackageReference Include="Serilog.Formatting.Compact" Version="3.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="6.1.1" /> <PackageReference Include="Serilog.Sinks.Console" Version="6.1.1" />
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" /> <PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
<PackageReference Include="System.CommandLine" Version="2.0.2" /> <PackageReference Include="System.CommandLine" Version="2.0.6" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

6
ErsatzTV.Tests/ErsatzTV.Tests.csproj

@ -11,12 +11,12 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="NUnit" Version="4.4.0" /> <PackageReference Include="NUnit" Version="4.5.1" />
<PackageReference Include="NUnit.Analyzers" Version="4.11.2"> <PackageReference Include="NUnit.Analyzers" Version="4.12.0">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="NUnit3TestAdapter" Version="6.1.0" /> <PackageReference Include="NUnit3TestAdapter" Version="6.2.0" />
<PackageReference Include="Shouldly" Version="4.3.0" /> <PackageReference Include="Shouldly" Version="4.3.0" />
</ItemGroup> </ItemGroup>

21
ErsatzTV/ErsatzTV.csproj

@ -31,33 +31,32 @@
<ItemGroup> <ItemGroup>
<!-- <PackageReference Include="EntityFrameworkProfiler.Appender" Version="6.0.6049" /> --> <!-- <PackageReference Include="EntityFrameworkProfiler.Appender" Version="6.0.6049" /> -->
<PackageReference Include="Blazored.FluentValidation" Version="2.2.0" /> <PackageReference Include="Blazored.FluentValidation" Version="2.2.0" />
<PackageReference Include="BlazorSortable" Version="5.2.1" /> <PackageReference Include="BlazorSortable" Version="6.0.0" />
<PackageReference Include="Chronic.Core" Version="0.4.0" /> <PackageReference Include="Chronic.Core" Version="0.4.0" />
<PackageReference Include="FluentValidation" Version="12.1.1" /> <PackageReference Include="FluentValidation" Version="12.1.1" />
<PackageReference Include="FluentValidation.AspNetCore" Version="11.3.1" /> <PackageReference Include="FluentValidation.AspNetCore" Version="11.3.1" />
<PackageReference Include="Heron.MudCalendar" Version="3.4.0" /> <PackageReference Include="Heron.MudCalendar" Version="3.4.0" />
<PackageReference Include="HtmlSanitizer" Version="9.0.892" /> <PackageReference Include="HtmlSanitizer" Version="9.0.892" />
<PackageReference Include="LanguageExt.Core" Version="4.4.9" /> <PackageReference Include="LanguageExt.Core" Version="4.4.9" />
<PackageReference Include="Markdig" Version="0.44.0" />
<PackageReference Include="MediatR.Courier.DependencyInjection" Version="5.0.0" /> <PackageReference Include="MediatR.Courier.DependencyInjection" Version="5.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="10.0.2" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="10.0.6" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="10.0.2" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="10.0.6" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="10.0.2" /> <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="10.0.6" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.0.2" /> <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.0.6" />
<PackageReference Include="Microsoft.AspNetCore.SpaServices.Extensions" Version="10.0.2" /> <PackageReference Include="Microsoft.AspNetCore.SpaServices.Extensions" Version="10.0.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="[9.0.12,10)"> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.15">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.Extensions.ApiDescription.Server" Version="10.0.2"> <PackageReference Include="Microsoft.Extensions.ApiDescription.Server" Version="10.0.6">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="MudBlazor" Version="8.15.0" /> <PackageReference Include="MudBlazor" Version="8.15.0" />
<PackageReference Include="NaturalSort.Extension" Version="4.4.1" /> <PackageReference Include="NaturalSort.Extension" Version="4.4.1" />
<PackageReference Include="Refit.HttpClientFactory" Version="9.0.2" /> <PackageReference Include="Refit.HttpClientFactory" Version="9.0.2" />
<PackageReference Include="Scalar.AspNetCore" Version="2.12.32" /> <PackageReference Include="Scalar.AspNetCore" Version="2.14.1" />
<PackageReference Include="Serilog" Version="4.3.0" /> <PackageReference Include="Serilog" Version="4.3.1" />
<PackageReference Include="Serilog.AspNetCore" Version="10.0.0" /> <PackageReference Include="Serilog.AspNetCore" Version="10.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="10.0.0" /> <PackageReference Include="Serilog.Settings.Configuration" Version="10.0.0" />
<PackageReference Include="VueCliMiddleware" Version="6.0.0" /> <PackageReference Include="VueCliMiddleware" Version="6.0.0" />

2
ErsatzTV/Locals/Shared/MainLayout.resx

@ -154,7 +154,7 @@
<value>Troubleshooting</value> <value>Troubleshooting</value>
</data> </data>
<data name="LabelErsatzTVVersion" xml:space="preserve"> <data name="LabelErsatzTVVersion" xml:space="preserve">
<value>ErsatzTV Version</value> <value>ErsatzTV Legacy Version</value>
</data> </data>
<data name="LabelSearchTargetChannel" xml:space="preserve"> <data name="LabelSearchTargetChannel" xml:space="preserve">
<value>Channel</value> <value>Channel</value>

82
ErsatzTV/Pages/Index.razor

@ -1,13 +1,8 @@
@page "/" @page "/"
@page "/system/health" @page "/system/health"
@using System.Reflection
@using ErsatzTV.Application.Health @using ErsatzTV.Application.Health
@using ErsatzTV.Core.Health @using ErsatzTV.Core.Health
@using ErsatzTV.Core.Interfaces.GitHub
@using Microsoft.Extensions.Caching.Memory
@implements IDisposable @implements IDisposable
@inject IGitHubApiClient GitHubApiClient
@inject IMemoryCache MemoryCache
@inject IMediator Mediator @inject IMediator Mediator
@inject SystemStartup SystemStartup; @inject SystemStartup SystemStartup;
@ -55,7 +50,7 @@
<MudTable Hover="true" <MudTable Hover="true"
Dense="true" Dense="true"
Breakpoint="Breakpoint.None" Breakpoint="Breakpoint.None"
ServerData="@(new Func<TableState, CancellationToken, Task<TableData<HealthCheckResult>>>(ServerReload))"> ServerData="@(ServerReload)">
<HeaderContent> <HeaderContent>
<MudTh>Check</MudTh> <MudTh>Check</MudTh>
<MudTh>Message</MudTh> <MudTh>Message</MudTh>
@ -129,24 +124,12 @@
</MudTd> </MudTd>
</RowTemplate> </RowTemplate>
</MudTable> </MudTable>
<MudCard Class="mt-6">
<MudCardHeader>
<MudText Class="mt-6">Full changelog is available on <MudLink Href="https://github.com/ErsatzTV/ErsatzTV/blob/main/CHANGELOG.md" Target="_blank">GitHub</MudLink></MudText>
</MudCardHeader>
<MudCardContent Class="release-notes mud-typography mud-typography-body1">
<MarkdownView Content="@_releaseNotes"/>
</MudCardContent>
</MudCard>
} }
</MudContainer> </MudContainer>
</div> </div>
</MudForm> </MudForm>
@code { @code {
private CancellationTokenSource _cts;
private string _releaseNotes;
protected override void OnInitialized() protected override void OnInitialized()
{ {
SystemStartup.OnDatabaseReady += OnStartupProgress; SystemStartup.OnDatabaseReady += OnStartupProgress;
@ -157,9 +140,6 @@
{ {
SystemStartup.OnDatabaseReady -= OnStartupProgress; SystemStartup.OnDatabaseReady -= OnStartupProgress;
SystemStartup.OnSearchIndexReady -= OnStartupProgress; SystemStartup.OnSearchIndexReady -= OnStartupProgress;
_cts?.Cancel();
_cts?.Dispose();
} }
private async void OnStartupProgress(object sender, EventArgs e) private async void OnStartupProgress(object sender, EventArgs e)
@ -174,66 +154,6 @@
} }
} }
protected override async Task OnParametersSetAsync()
{
_cts?.Cancel();
_cts?.Dispose();
_cts = new CancellationTokenSource();
var token = _cts.Token;
try
{
if (MemoryCache.TryGetValue("Index.ReleaseNotesHtml", out string releaseNotesHtml))
{
_releaseNotes = releaseNotesHtml;
}
else
{
var assembly = Assembly.GetEntryAssembly();
if (assembly != null)
{
string version = assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion;
if (version != null)
{
Either<BaseError, string> maybeNotes;
if (version != "develop")
{
string gitHubVersion = version.Split("-").Head();
if (!gitHubVersion.StartsWith("v"))
{
gitHubVersion = $"v{gitHubVersion}";
}
maybeNotes = await GitHubApiClient.GetReleaseNotes(gitHubVersion, token);
foreach (string notes in maybeNotes.RightToSeq())
{
_releaseNotes = notes;
}
}
else
{
maybeNotes = await GitHubApiClient.GetLatestReleaseNotes(token);
foreach (string notes in maybeNotes.RightToSeq())
{
_releaseNotes = notes;
}
}
}
}
if (_releaseNotes != null)
{
MemoryCache.Set("Index.ReleaseNotesHtml", _releaseNotes);
}
}
}
catch (Exception)
{
// ignore
}
}
private async Task<TableData<HealthCheckResult>> ServerReload(TableState state, CancellationToken cancellationToken) private async Task<TableData<HealthCheckResult>> ServerReload(TableState state, CancellationToken cancellationToken)
{ {
List<HealthCheckResult> healthCheckResults = await Mediator.Send(new GetAllHealthCheckResults(), cancellationToken); List<HealthCheckResult> healthCheckResults = await Mediator.Send(new GetAllHealthCheckResults(), cancellationToken);

2
ErsatzTV/Pages/_Host.cshtml

@ -12,7 +12,7 @@
<head> <head>
<meta charset="utf-8"/> <meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>@if (Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyConfigurationAttribute>()?.Configuration?.ToLower() != "release") { @(System.Environment.MachineName + " ") }ErsatzTV</title> <title>@if (Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyConfigurationAttribute>()?.Configuration?.ToLower() != "release") { @(System.Environment.MachineName + " ") }ErsatzTV Legacy</title>
<base href="~/"/> <base href="~/"/>
<link href="_content/MudBlazor/MudBlazor.min.css?v=@(Assembly.GetAssembly(typeof(AbstractLocalizationInterceptor))?.GetName().Version?.ToString())" rel="stylesheet"/> <link href="_content/MudBlazor/MudBlazor.min.css?v=@(Assembly.GetAssembly(typeof(AbstractLocalizationInterceptor))?.GetName().Version?.ToString())" rel="stylesheet"/>
<link href="css/site.css" asp-append-version="true" rel="stylesheet"/> <link href="css/site.css" asp-append-version="true" rel="stylesheet"/>

1
ErsatzTV/Shared/MarkdownView.razor

@ -1 +0,0 @@
@HtmlContent

69
ErsatzTV/Shared/MarkdownView.razor.cs

@ -1,69 +0,0 @@
using Ganss.Xss;
using Markdig;
using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
namespace ErsatzTV.Shared;
public partial class MarkdownView
{
private MarkupString? _markupContent;
[Inject]
public IHtmlSanitizer HtmlSanitizer { get; set; }
[Inject]
public IJSRuntime JsRuntime { get; set; }
[Parameter]
public string Content { get; set; }
public MarkupString? HtmlContent
{
get
{
if (string.IsNullOrWhiteSpace(Content))
{
return null;
}
return _markupContent ?? (_markupContent = ConvertStringToMarkupString(Content)).Value;
}
}
private MarkupString ConvertStringToMarkupString(string value)
{
if (!string.IsNullOrWhiteSpace(value))
{
// Convert markdown string to HTML
string html = Markdown.ToHtml(
value,
new MarkdownPipelineBuilder()
.UseAdvancedExtensions()
.UseSoftlineBreakAsHardlineBreak()
.Build());
// Sanitize HTML before rendering
string sanitizedHtml = HtmlSanitizer.Sanitize(html);
// Return sanitized HTML as a MarkupString that Blazor can render
return new MarkupString(sanitizedHtml);
}
return new MarkupString();
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
try
{
await JsRuntime.InvokeVoidAsync("styleMarkdown");
}
catch (Exception)
{
// ignored
}
await base.OnAfterRenderAsync(true);
}
}

10
ErsatzTV/Startup.cs

@ -21,7 +21,6 @@ using ErsatzTV.Core.Images;
using ErsatzTV.Core.Interfaces.Database; using ErsatzTV.Core.Interfaces.Database;
using ErsatzTV.Core.Interfaces.Emby; using ErsatzTV.Core.Interfaces.Emby;
using ErsatzTV.Core.Interfaces.FFmpeg; using ErsatzTV.Core.Interfaces.FFmpeg;
using ErsatzTV.Core.Interfaces.GitHub;
using ErsatzTV.Core.Interfaces.Images; using ErsatzTV.Core.Interfaces.Images;
using ErsatzTV.Core.Interfaces.Jellyfin; using ErsatzTV.Core.Interfaces.Jellyfin;
using ErsatzTV.Core.Interfaces.Locking; using ErsatzTV.Core.Interfaces.Locking;
@ -56,7 +55,6 @@ using ErsatzTV.Infrastructure.Data.Repositories;
using ErsatzTV.Infrastructure.Database; using ErsatzTV.Infrastructure.Database;
using ErsatzTV.Infrastructure.Emby; using ErsatzTV.Infrastructure.Emby;
using ErsatzTV.Infrastructure.FFmpeg; using ErsatzTV.Infrastructure.FFmpeg;
using ErsatzTV.Infrastructure.GitHub;
using ErsatzTV.Infrastructure.Health; using ErsatzTV.Infrastructure.Health;
using ErsatzTV.Infrastructure.Health.Checks; using ErsatzTV.Infrastructure.Health.Checks;
using ErsatzTV.Infrastructure.Images; using ErsatzTV.Infrastructure.Images;
@ -340,12 +338,7 @@ public class Startup
string etvVersion = Assembly.GetEntryAssembly()?.GetCustomAttribute<AssemblyInformationalVersionAttribute>() string etvVersion = Assembly.GetEntryAssembly()?.GetCustomAttribute<AssemblyInformationalVersionAttribute>()
?.InformationalVersion ?? "unknown"; ?.InformationalVersion ?? "unknown";
Log.Logger.Information("ErsatzTV version {Version}", etvVersion); Log.Logger.Information("ErsatzTV Legacy version {Version}", etvVersion);
Log.Logger.Warning(
"Report bugs to {GitHub} or contact us at {Contact}",
"https://github.com/ErsatzTV/ErsatzTV",
"https://ersatztv.org/contact");
CopyMacOsConfigFolderIfNeeded(); CopyMacOsConfigFolderIfNeeded();
@ -836,7 +829,6 @@ public class Startup
services.AddScoped<ISongVideoGenerator, SongVideoGenerator>(); services.AddScoped<ISongVideoGenerator, SongVideoGenerator>();
services.AddScoped<IMusicVideoCreditsGenerator, MusicVideoCreditsGenerator>(); services.AddScoped<IMusicVideoCreditsGenerator, MusicVideoCreditsGenerator>();
services.AddScoped<IGitHubApiClient, GitHubApiClient>();
services.AddScoped<IHtmlSanitizer, HtmlSanitizer>(_ => services.AddScoped<IHtmlSanitizer, HtmlSanitizer>(_ =>
{ {
var sanitizer = new HtmlSanitizer(); var sanitizer = new HtmlSanitizer();

2
scripts/macOS/bundle.sh

@ -3,7 +3,7 @@
SCRIPT_FOLDER=$(dirname ${BASH_SOURCE[0]}) SCRIPT_FOLDER=$(dirname ${BASH_SOURCE[0]})
REPO_ROOT=$(realpath "$SCRIPT_FOLDER/../..") REPO_ROOT=$(realpath "$SCRIPT_FOLDER/../..")
APP_NAME="$REPO_ROOT/ErsatzTV.app" APP_NAME="$REPO_ROOT/ErsatzTV-Legacy.app"
PUBLISH_OUTPUT_DIRECTORY="$REPO_ROOT/publish/." PUBLISH_OUTPUT_DIRECTORY="$REPO_ROOT/publish/."
if [ -d "$APP_NAME" ] if [ -d "$APP_NAME" ]

2
scripts/macOS/sign.sh

@ -3,7 +3,7 @@
SCRIPT_FOLDER=$(dirname ${BASH_SOURCE[0]}) SCRIPT_FOLDER=$(dirname ${BASH_SOURCE[0]})
REPO_ROOT=$(realpath "$SCRIPT_FOLDER/../..") REPO_ROOT=$(realpath "$SCRIPT_FOLDER/../..")
APP_NAME="$REPO_ROOT/ErsatzTV.app" APP_NAME="$REPO_ROOT/ErsatzTV-Legacy.app"
ENTITLEMENTS="$SCRIPT_FOLDER/ErsatzTV.entitlements" ENTITLEMENTS="$SCRIPT_FOLDER/ErsatzTV.entitlements"
SIGNING_IDENTITY="C3BBCFB2D6851FF0DCA6CAC06A3EF1ECE71F9FFF" SIGNING_IDENTITY="C3BBCFB2D6851FF0DCA6CAC06A3EF1ECE71F9FFF"

Loading…
Cancel
Save