diff --git a/.forgejo/workflows/aur.yaml b/.forgejo/workflows/aur.yaml deleted file mode 100644 index 047abbb..0000000 --- a/.forgejo/workflows/aur.yaml +++ /dev/null @@ -1,63 +0,0 @@ -name: AUR Sync - -on: - push: - branches: [ master ] - -jobs: - aur-sync: - runs-on: docker - container: - image: archlinux:latest - steps: - - name: Install dependencies - run: | - pacman -Syu --noconfirm nodejs git binutils openssh sudo - - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup SSH - run: | - mkdir -p ~/.ssh - echo "${{ secrets.AUR_SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519 - chmod 600 ~/.ssh/id_ed25519 - - cat >> ~/.ssh/config <> ~/.ssh/known_hosts - - - name: Configure Git - run: | - git config --global user.name "nekohepott" - git config --global user.email "nekohepott@larpdhq.org" - - - name: Sync to AUR - run: | - chown -R nobody:nobody . - chmod -R 777 . - - git clone ssh://aur@aur.archlinux.org/gogofetch-git.git /tmp/aur - - sudo -u nobody makepkg --nodeps --nobuild --force - sudo -u nobody makepkg --printsrcinfo > .SRCINFO - - - cp PKGBUILD .SRCINFO /tmp/aur/ - - cd /tmp/aur - git config user.name "nekohepott" - git config user.email "nekohepott@larpdhq.org" - - if [[ -n $(git status -s) ]]; then - git add PKGBUILD .SRCINFO - git commit -m "Update from Codeberg CI: ${GITHUB_SHA::7}" - git push - else - echo "No changes to commit" - fi \ No newline at end of file diff --git a/README.md b/README.md index d8d3d05..a134fd6 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ to show custom image : ```bash gogofetch -l path ``` +If the custom image is a GIF, it will animate and gogofetch will keep running until you stop it (Ctrl+C). to show custom image and set custom width: ```bash gogofetch -l path -w 250 @@ -88,4 +89,3 @@ and run: ![necrokall](assets/xterm.png "xterm") xterm - diff --git a/src/main.go b/src/main.go index 43e0f25..9889cd8 100644 --- a/src/main.go +++ b/src/main.go @@ -132,6 +132,20 @@ func main() { if _, err := os.Stat(*logoPath); err == nil { if conf.Ascii || (ascii != nil && *ascii) { logoLines = providers.SplitLines(providers.PrintAsciiLogo(*logoPath)) + } else if providers.IsGif(*logoPath) { + if err := providers.RenderLogoChafaAnimated(*logoPath, uint(*width), statsLines, position); err == nil { + return + } + + parts := strings.Split(*logoPath, ".") + if len(parts) > 1 { + parts[1] = "txt" + } + *logoPath = strings.Join(parts, ".") + logoLines = providers.SplitLines(providers.PrintAsciiLogo(*logoPath)) + if strings.Contains(*logoPath, ".txt") != true { + fmt.Printf("chafa binary not found, to print images please install chafa\n") + } } else { logoLines, err = providers.RenderLogoChafa(*logoPath, uint(*width)) if err != nil { diff --git a/src/providers/logo.go b/src/providers/logo.go index a010a1f..50f998d 100644 --- a/src/providers/logo.go +++ b/src/providers/logo.go @@ -36,12 +36,25 @@ func PrintAsciiLogo(path string) string { return string(content) } -func RenderLogoChafa(path string, width uint) ([]string, error) { - cols := width / 8 - if cols == 0 { +func IsGif(path string) bool { + return strings.EqualFold(filepath.Ext(path), ".gif") +} + +func logoGrid(width uint) (int, int) { + cols := int(width / 8) + if cols < 1 { cols = 1 } - sizeArg := fmt.Sprintf("--size=%dx%d", cols, cols/2) + rows := cols / 2 + if rows < 1 { + rows = 1 + } + return cols, rows +} + +func RenderLogoChafa(path string, width uint) ([]string, error) { + cols, rows := logoGrid(width) + sizeArg := fmt.Sprintf("--size=%dx%d", cols, rows) cmd := exec.Command("chafa", path, "--format", "symbols", sizeArg, "--symbols=half") out, err := cmd.Output() if err != nil { @@ -50,6 +63,50 @@ func RenderLogoChafa(path string, width uint) ([]string, error) { return SplitLines(string(out)), err } +func RenderLogoChafaAnimated(path string, width uint, statsLines []string, position string) error { + cols, rows := logoGrid(width) + statsWidth := maxLineLen(statsLines) + logoPad := strings.Repeat(" ", cols) + lineCount := len(statsLines) + if rows > lineCount { + lineCount = rows + } + const gap = " " + + for i := 0; i < lineCount; i++ { + stats := "" + if i < len(statsLines) { + stats = statsLines[i] + } + if position == "left" { + fmt.Printf("%s%s%s\n", logoPad, gap, stats) + continue + } + fmt.Printf("%s%s%s\n", padRightVisible(stats, statsWidth), gap, logoPad) + } + + fmt.Print("\x1b7") + defer func() { + fmt.Print("\x1b8\n") + }() + + fmt.Printf("\x1b[%dA", lineCount) + fmt.Print("\r") + if position == "right" { + startCol := statsWidth + len(gap) + if startCol > 0 { + fmt.Printf("\x1b[%dC", startCol) + } + } + + sizeArg := fmt.Sprintf("--size=%dx%d", cols, rows) + cmd := exec.Command("chafa", "--format", "symbols", sizeArg, "--symbols=half", "--animate=on", "--duration=inf", "--relative=on", path) + cmd.Stdout = os.Stdout + cmd.Stdin = os.Stdin + cmd.Stderr = os.Stderr + return cmd.Run() +} + func NormalizeLogoPosition(pos string) string { value := strings.ToLower(strings.TrimSpace(pos)) if value == "left" || value == "right" {