@@ -387,8 +387,7 @@ jobs:
387387
388388 - name : Install build dependencies
389389 run : |
390- sudo dnf install @development-tools -y
391- sudo dnf install -y \
390+ sudo dnf install -y @development-tools \
392391 clang cmake ninja-build pkg-config \
393392 gtk3-devel xz-devel libstdc++-devel \
394393 rpm-build desktop-file-utils hicolor-icon-theme jq which
@@ -405,7 +404,7 @@ jobs:
405404 channel : stable
406405 cache : true
407406
408- - name : Download dummy binaries
407+ - name : Download binaries
409408 uses : actions/download-artifact@v4
410409 with :
411410 name : binaries
@@ -414,14 +413,25 @@ jobs:
414413 - name : Get Flutter dependencies
415414 run : flutter pub get
416415
416+ - name : Get version
417+ run : |
418+ echo "VERSION=$(grep '^version:' pubspec.yaml | sed 's/version: //;s/+.*//')" >> $GITHUB_ENV
419+
417420 - name : Build Linux (release)
418421 run : flutter build linux --release --dart-define=PORTABLE=false
419422
423+ - name : Inject binaries
424+ run : |
425+ mkdir -p build/linux/x64/release/bundle/bin
426+ cp assets/binaries/linux/ffmpeg build/linux/x64/release/bundle/bin/
427+ cp assets/binaries/linux/yt-dlp build/linux/x64/release/bundle/bin/
428+ chmod +x build/linux/x64/release/bundle/bin/*
429+
420430 # rpm package
421431 - name : Build .rpm package
422432 run : |
423433 VERSION="${{ env.VERSION }}"
424- BUNDLE="build/linux/x64/release/bundle"
434+ BUNDLE="$GITHUB_WORKSPACE/ build/linux/x64/release/bundle"
425435
426436 mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
427437
@@ -437,16 +447,13 @@ jobs:
437447 EXE_NAME=$(basename "$EXE")
438448 if [ "$EXE_NAME" != "frameextractor" ]; then
439449 mv "$EXE" "$BUILDROOT/opt/frameextractor/frameextractor"
440- echo "Renamed $EXE_NAME → frameextractor"
441450 fi
442451 chmod +x "$BUILDROOT/opt/frameextractor/frameextractor"
443452 chmod +x "$BUILDROOT/opt/frameextractor/bin/ffmpeg" 2>/dev/null || true
444- chmod +x "$BUILDROOT/opt/frameextractor/bin/yt-dlp" 2>/dev/null || true
453+ chmod +x "$BUILDROOT/opt/frameextractor/bin/yt-dlp" 2>/dev/null || true
445454
446- # Symlink
447455 ln -s /opt/frameextractor/frameextractor "$BUILDROOT/usr/bin/frameextractor"
448456
449- # Desktop entry
450457 cat > "$BUILDROOT/usr/share/applications/frameextractor.desktop" << 'DESKTOP'
451458 [Desktop Entry]
452459 Version=1.0
@@ -456,22 +463,20 @@ jobs:
456463 Comment=Extract frames from video files using ffmpeg
457464 Exec=/opt/frameextractor/frameextractor
458465 Icon=frameextractor
459- Categories=Video;AudioVideo;
466+ Categories=Video;AudioVideo;FrameExtraction;FrameExtractor;
460467 Terminal=false
461468 StartupWMClass=frameextractor
462469 DESKTOP
463470
464- if [ -f "assets/icons/icon_256.png" ]; then
465- cp "assets/icons/icon_256.png" \
471+ if [ -f "$GITHUB_WORKSPACE/ assets/icons/icon_256.png" ]; then
472+ cp "$GITHUB_WORKSPACE/ assets/icons/icon_256.png" \
466473 "$BUILDROOT/usr/share/icons/hicolor/256x256/apps/frameextractor.png"
467474 fi
468475
469- # Generate file list for %files section (everything under BUILDROOT)
470476 FILES=$(find "$BUILDROOT" \( -type f -o -type l \) \
471477 | sed "s|$BUILDROOT||" \
472478 | sort)
473479
474- # Write .spec
475480 cat > ~/rpmbuild/SPECS/frameextractor.spec << SPEC
476481 Name: frameextractor
477482 Version: ${VERSION}
@@ -480,32 +485,32 @@ jobs:
480485 License: GPLv3
481486 URL: https://github.com/nokarin-dev/frameextractor
482487 BuildArch: x86_64
483-
484488 Requires: gtk3, xz-libs
485489
486490 %description
487491 FrameExtractor is a modern, cross-platform video frame extractor
488492 with a clean UI built with Flutter, powered by ffmpeg and yt-dlp.
489- Supports local video files and direct YouTube URL extraction.
490493
491494 %install
492495 exit 0
493496
494497 %post
495498 chmod +x /opt/frameextractor/frameextractor 2>/dev/null || true
496- chmod +x /opt/frameextractor/bin/ffmpeg 2>/dev/null || true
497- chmod +x /opt/frameextractor/bin/yt-dlp 2>/dev/null || true
499+ chmod +x /opt/frameextractor/bin/ffmpeg 2>/dev/null || true
500+ chmod +x /opt/frameextractor/bin/yt-dlp 2>/dev/null || true
498501 update-desktop-database /usr/share/applications 2>/dev/null || true
499- /usr/bin/gtk-update-icon-cache \
500- /usr/share/icons/hicolor 2>/dev/null || true
502+ /usr/bin/gtk-update-icon-cache /usr/share/icons/hicolor 2>/dev/null || true
501503 exit 0
502504
503505 %postun
504506 update-desktop-database /usr/share/applications 2>/dev/null || true
505- /usr/bin/gtk-update-icon-cache \
506- /usr/share/icons/hicolor 2>/dev/null || true
507+ /usr/bin/gtk-update-icon-cache /usr/share/icons/hicolor 2>/dev/null || true
507508 exit 0
508509
510+ %changelog
511+ * $(date "+%a %b %d %Y") Builder <build@nokarin.my.id> - ${VERSION}-1
512+ - Release ${VERSION}
513+
509514 %files
510515 $(echo "$FILES" | sed 's|^/usr/bin/frameextractor|%attr(0755,root,root) /usr/bin/frameextractor|')
511516 SPEC
@@ -517,16 +522,13 @@ jobs:
517522 ~/rpmbuild/SPECS/frameextractor.spec
518523
519524 RPM_FILE=$(find ~/rpmbuild/RPMS/x86_64 -name "*.rpm" | head -1)
520- if [ -z "$RPM_FILE" ]; then
521- echo "✗ RPM not found!" && exit 1
522- fi
523- cp "$RPM_FILE" "FrameExtractor-linux-installer.rpm"
524- echo "✓ .rpm built: FrameExtractor-linux-installer.rpm"
525- rpm -qip "FrameExtractor-linux-installer.rpm"
525+ [ -z "$RPM_FILE" ] && echo "✗ RPM not found!" && exit 1
526+ cp "$RPM_FILE" "$GITHUB_WORKSPACE/FrameExtractor-linux-installer.rpm"
527+ echo "✓ RPM built"
526528
527529 - uses : actions/upload-artifact@v4
528530 with :
529- name : linux-fedora -build
531+ name : linux-rpm -build
530532 path : FrameExtractor-linux-installer.rpm
531533
532534 # Android
@@ -607,7 +609,7 @@ jobs:
607609 # Create GitHub Release
608610 release :
609611 name : Create Release
610- needs : [build-windows, build-linux, build-android]
612+ needs : [build-windows, build-linux, build-linux-rpm, build- android]
611613 runs-on : ubuntu-latest
612614 steps :
613615 - uses : actions/checkout@v4
0 commit comments