Detach FFmpeg downloading script from the build process

This commit is contained in:
Tyrrrz 2024-08-23 02:23:18 +03:00
parent 593673cd4b
commit 5f5686e6a0
3 changed files with 54 additions and 37 deletions

View File

@ -53,6 +53,11 @@ jobs:
bundle-ffmpeg: bundle-ffmpeg:
- true - true
- false - false
include:
- bundle-ffmpeg: true
artifact-name-base: YoutubeDownloader
- bundle-ffmpeg: false
artifact-name-base: YoutubeDownloader.Bare
exclude: exclude:
# FFmpeg builds for these platforms are not easily available # FFmpeg builds for these platforms are not easily available
- bundle-ffmpeg: true - bundle-ffmpeg: true
@ -76,7 +81,8 @@ jobs:
- name: Download FFmpeg - name: Download FFmpeg
if: ${{ matrix.bundle-ffmpeg }} if: ${{ matrix.bundle-ffmpeg }}
run: dotnet build YoutubeDownloader -t:DownloadFFmpeg shell: pwsh
run: YoutubeDownloader/DownloadFFmpeg.ps1 -platform ${{ matrix.rid }}
- name: Publish app - name: Publish app
run: > run: >
@ -91,7 +97,7 @@ jobs:
- name: Upload artifacts - name: Upload artifacts
uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4.3.4 uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4.3.4
with: with:
name: ${{ matrix.bundle-ffmpeg && 'YoutubeDownloader' || 'YoutubeDownloader.Bare' }}.${{ matrix.rid }} name: ${{ matrix.artifact-name-base }}.${{ matrix.rid }}
path: YoutubeDownloader/bin/publish path: YoutubeDownloader/bin/publish
if-no-files-found: error if-no-files-found: error
@ -135,6 +141,11 @@ jobs:
bundle-ffmpeg: bundle-ffmpeg:
- true - true
- false - false
include:
- bundle-ffmpeg: true
artifact-name-base: YoutubeDownloader
- bundle-ffmpeg: false
artifact-name-base: YoutubeDownloader.Bare
exclude: exclude:
# FFmpeg builds for these platforms are not easily available # FFmpeg builds for these platforms are not easily available
- bundle-ffmpeg: true - bundle-ffmpeg: true
@ -151,26 +162,28 @@ jobs:
- name: Download artifacts - name: Download artifacts
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with: with:
name: ${{ matrix.bundle-ffmpeg && 'YoutubeDownloader' || 'YoutubeDownloader.Bare' }}.${{ matrix.rid }} name: ${{ matrix.artifact-name-base }}.${{ matrix.rid }}
path: YoutubeDownloader/ path: YoutubeDownloader/
- name: Set permissions - name: Set permissions (app)
if: ${{ !startsWith(matrix.rid, 'win-') }} if: ${{ !startsWith(matrix.rid, 'win-') }}
run: | run: chmod +x YoutubeDownloader/YoutubeDownloader
chmod +x YoutubeDownloader/YoutubeDownloader
${{ matrix.bundle-ffmpeg && 'chmod +x YoutubeDownloader/ffmpeg' || '' }} - name: Set permissions (FFmpeg)
if: ${{ !startsWith(matrix.rid, 'win-') && matrix.bundle-ffmpeg }}
run: chmod +x YoutubeDownloader/ffmpeg
- name: Create package - name: Create package
# Change into the artifacts directory to avoid including the directory itself in the zip archive # Change into the artifacts directory to avoid including the directory itself in the zip archive
working-directory: YoutubeDownloader/ working-directory: YoutubeDownloader/
run: zip -r ../${{ matrix.bundle-ffmpeg && 'YoutubeDownloader' || 'YoutubeDownloader.Bare' }}.${{ matrix.rid }}.zip . run: zip -r ../${{ matrix.artifact-name-base }}.${{ matrix.rid }}.zip .
- name: Upload release asset - name: Upload release asset
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: > run: >
gh release upload ${{ github.ref_name }} gh release upload ${{ github.ref_name }}
${{ matrix.bundle-ffmpeg && 'YoutubeDownloader' || 'YoutubeDownloader.Bare' }}.${{ matrix.rid }}.zip ${{ matrix.artifact-name-base }}.${{ matrix.rid }}.zip
--repo ${{ github.event.repository.full_name }} --repo ${{ github.event.repository.full_name }}
notify: notify:

View File

@ -1,6 +1,3 @@
# This script is called from inside an MSBuild task to download FFmpeg binaries:
# dotnet build -t:DownloadFFmpeg
param ( param (
[string]$platform, [string]$platform,
[string]$outputPath [string]$outputPath
@ -8,11 +5,37 @@ param (
$ErrorActionPreference = "Stop" $ErrorActionPreference = "Stop"
# If the platform is not specified, use the current OS/arch
if (-not $platform) {
$arch = [Runtime.InteropServices.RuntimeInformation]::OSArchitecture
if ($isWindows) {
$platform = "windows-$arch"
} elseif ($isLinux) {
$platform = "linux-$arch"
} elseif ($isMacOS) {
$platform = "osx-$arch"
} else {
throw "Unsupported platform"
}
}
# Normalize platform identifier # Normalize platform identifier
$platform = $platform.ToLower().Replace("win-", "windows-") $platform = $platform.ToLower().Replace("win-", "windows-")
# If the output path is not specified, use the current directory
if (-not $outputPath) {
$fileName = if ($platform.Contains("windows-")) { "ffmpeg.exe" } else { "ffmpeg" }
$outputPath = "$PSScriptRoot/$fileName"
}
# Delete the existing file if it exists
if (Test-Path $outputPath) {
Remove-Item $outputPath
}
# Download the archive # Download the archive
Write-Host "Downloading FFmpeg..." Write-Host "Downloading FFmpeg for $platform..."
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$http = New-Object System.Net.WebClient $http = New-Object System.Net.WebClient
try { try {

View File

@ -14,6 +14,11 @@
<AvaloniaResource Include="..\favicon.ico" Link="favicon.ico" /> <AvaloniaResource Include="..\favicon.ico" Link="favicon.ico" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Include="ffmpeg.exe" CopyToOutputDirectory="PreserveNewest" Condition="Exists('ffmpeg.exe')" />
<None Include="ffmpeg" CopyToOutputDirectory="PreserveNewest" Condition="Exists('ffmpeg')" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="AsyncImageLoader.Avalonia" Version="3.2.1" /> <PackageReference Include="AsyncImageLoader.Avalonia" Version="3.2.1" />
<PackageReference Include="Avalonia" Version="11.1.3" /> <PackageReference Include="Avalonia" Version="11.1.3" />
@ -53,28 +58,4 @@
<TrimmerRootAssembly Include="WebView.Core" /> <TrimmerRootAssembly Include="WebView.Core" />
</ItemGroup> </ItemGroup>
<!-- Task to download FFmpeg -->
<PropertyGroup>
<FFmpegPlatform>$(RuntimeIdentifier)</FFmpegPlatform>
<FFmpegPlatform Condition="'$(FFmpegPlatform)' == '' AND $([MSBuild]::IsOsPlatform('Windows')) AND '$([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture)' == 'Arm64'">win-arm64</FFmpegPlatform>
<FFmpegPlatform Condition="'$(FFmpegPlatform)' == '' AND $([MSBuild]::IsOsPlatform('Windows')) AND '$([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture)' == 'X86'">win-x86</FFmpegPlatform>
<FFmpegPlatform Condition="'$(FFmpegPlatform)' == '' AND $([MSBuild]::IsOsPlatform('Windows')) AND '$([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture)' == 'X64'">win-x64</FFmpegPlatform>
<FFmpegPlatform Condition="'$(FFmpegPlatform)' == '' AND $([MSBuild]::IsOsPlatform('Linux')) AND '$([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture)' == 'Arm64'">linux-arm64</FFmpegPlatform>
<FFmpegPlatform Condition="'$(FFmpegPlatform)' == '' AND $([MSBuild]::IsOsPlatform('Linux')) AND '$([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture)' == 'X86'">linux-x86</FFmpegPlatform>
<FFmpegPlatform Condition="'$(FFmpegPlatform)' == '' AND $([MSBuild]::IsOsPlatform('Linux')) AND '$([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture)' == 'X64'">linux-x64</FFmpegPlatform>
<FFmpegPlatform Condition="'$(FFmpegPlatform)' == '' AND $([MSBuild]::IsOsPlatform('OSX')) AND '$([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture)' == 'Arm64'">osx-arm64</FFmpegPlatform>
<FFmpegPlatform Condition="'$(FFmpegPlatform)' == '' AND $([MSBuild]::IsOsPlatform('OSX')) AND '$([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture)' == 'X64'">osx-x64</FFmpegPlatform>
<FFmpegFileName Condition="$(FFmpegPlatform.StartsWith('win-'))">ffmpeg.exe</FFmpegFileName>
<FFmpegFileName Condition="'$(FFmpegFileName)' == ''">ffmpeg</FFmpegFileName>
</PropertyGroup>
<Target Name="DownloadFFmpeg">
<Exec Command="pwsh -ExecutionPolicy Bypass -File &quot;$(ProjectDir)/DownloadFFmpeg.ps1&quot; -Platform $(FFmpegPlatform) -OutputPath &quot;$(ProjectDir)/$(FFmpegFileName)&quot;" LogStandardErrorAsError="true" />
</Target>
<ItemGroup>
<None Include="ffmpeg.exe" CopyToOutputDirectory="PreserveNewest" Condition="Exists('ffmpeg.exe')" />
<None Include="ffmpeg" CopyToOutputDirectory="PreserveNewest" Condition="Exists('ffmpeg')" />
</ItemGroup>
</Project> </Project>