Compare commits
92 Commits
84920cc4cf
...
v2.5
Author | SHA1 | Date | |
---|---|---|---|
|
da569b3321 | ||
|
11285e4af0 | ||
|
9fe02931d8 | ||
|
e4f9dc8c72 | ||
|
88ed1de58b | ||
|
9bc89123f8 | ||
|
9fb3da2b4a | ||
|
58bb2c22c3 | ||
|
29d9ec6ef1 | ||
|
d2224399e2 | ||
|
67fbed7f6b | ||
|
c1df3f8068 | ||
|
0aed9b51a9 | ||
|
0bd7a66086 | ||
|
2b6823a277 | ||
|
dd7ed84a6c | ||
|
2c6a5ca971 | ||
|
5bf7647cba | ||
|
f721034ae5 | ||
|
a32361fab2 | ||
|
572e489db6 | ||
|
efcb6f8bf0 | ||
|
7e367ef537 | ||
|
b9a3326a98 | ||
|
484b155a3c | ||
|
9cba4e8deb | ||
|
749d7b682e | ||
|
35850d6310 | ||
|
15db17d834 | ||
|
a0d86e884a | ||
|
acf97c8a3b | ||
|
34bf9e5160 | ||
|
4420f3a8ae | ||
|
8d2ea6cf8a | ||
|
e244237474 | ||
|
ff81c9d689 | ||
|
11d99f106e | ||
|
b8afa82a81 | ||
|
097a2da5cb | ||
|
e6d32946c1 | ||
|
fe4eaa4b8d | ||
|
48a671b285 | ||
|
011c9c7668 | ||
|
f06fc1f750 | ||
|
0e88d4284d | ||
|
1615c6869f | ||
|
800f43b299 | ||
|
15bff0a0c4 | ||
|
e1481f4aac | ||
|
7ef97ee6db | ||
|
d785fe4c5a | ||
|
5254df53dc | ||
|
7301eab99c | ||
|
ad138c3017 | ||
|
b09c95d7ea | ||
|
64611a0dd3 | ||
|
321ad7608f | ||
|
2a8b6ea935 | ||
|
e9cbea500b | ||
|
223039b2c6 | ||
|
7402dfc4e6 | ||
|
6b12715506 | ||
|
2dc58c5c8e | ||
|
0cef51c6ac | ||
|
2a4d974965 | ||
|
f71792d6a5 | ||
|
b571042c5d | ||
|
349c966c63 | ||
|
4a42b239cc | ||
|
b9b3d2350c | ||
|
b13cd85f0b | ||
|
daffd721eb | ||
|
24232d72e9 | ||
|
4983e18e23 | ||
|
e1954e4cba | ||
|
58420ae52b | ||
|
b01f71de1a | ||
|
379aaed39e | ||
|
dc20932060 | ||
|
96835ebd33 | ||
|
c896f779b5 | ||
|
5f606b1c40 | ||
|
9d5b8d99f7 | ||
|
13c047fc21 | ||
|
55751b3eb6 | ||
|
b961502a17 | ||
|
a895145586 | ||
|
5aec3b4dab | ||
|
d787060a24 | ||
|
c1a29418eb | ||
|
17847f999c | ||
|
3adcddc70c |
25
.github/actions/prepare/action.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
name: Build & Upload
|
||||||
|
inputs:
|
||||||
|
id:
|
||||||
|
description: artifact name
|
||||||
|
required: true
|
||||||
|
cmd:
|
||||||
|
description: command to run
|
||||||
|
required: true
|
||||||
|
out:
|
||||||
|
description: path to output file
|
||||||
|
required: true
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- name: compile
|
||||||
|
run: ${{ inputs.cmd }}
|
||||||
|
shell: bash
|
||||||
|
- name: archive
|
||||||
|
run: tar -cvf ${{ inputs.out }}.tar ${{ inputs.out }}
|
||||||
|
shell: bash
|
||||||
|
- name: upload
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: ${{ inputs.id }}
|
||||||
|
path: ${{ inputs.out }}.tar
|
40
.github/workflows/build-docker.yml
vendored
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
name: Publish Docker Image
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- v*
|
||||||
|
env:
|
||||||
|
REGISTRY: ghcr.io
|
||||||
|
IMAGE_NAME: nkanaev/yarr
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-push-image:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Log in to the Container registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ${{ env.REGISTRY }}
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Extract Docker metadata
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v5
|
||||||
|
with:
|
||||||
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||||
|
|
||||||
|
- name: Build and push Docker image
|
||||||
|
uses: docker/build-push-action@v6
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
file: ./etc/dockerfile
|
||||||
|
push: true
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
203
.github/workflows/build.yml
vendored
@@ -1,144 +1,143 @@
|
|||||||
name: build
|
name: Build
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
tags: ['v*', 'test*']
|
tags:
|
||||||
|
- v*
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build_macos:
|
build_macos:
|
||||||
name: Build for MacOS
|
name: Build for MacOS
|
||||||
runs-on: macos-13
|
runs-on: macos-13
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout"
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v4
|
||||||
|
- name: Setup Go
|
||||||
|
uses: actions/setup-go@v4
|
||||||
with:
|
with:
|
||||||
submodules: 'recursive'
|
go-version: '^1.23'
|
||||||
- name: "Setup Go"
|
- name: Build arm64 gui
|
||||||
uses: actions/setup-go@v2
|
uses: ./.github/actions/prepare
|
||||||
with:
|
with:
|
||||||
go-version: '^1.17'
|
id: darwin_arm64_gui
|
||||||
- name: Cache Go Modules
|
cmd: make darwin_arm64_gui
|
||||||
uses: actions/cache@v2
|
out: out/darwin_arm64_gui/yarr.app
|
||||||
|
- name: Build amd64 gui
|
||||||
|
uses: ./.github/actions/prepare
|
||||||
with:
|
with:
|
||||||
path: ~/go/pkg/mod
|
id: darwin_amd64_gui
|
||||||
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
|
cmd: make darwin_amd64_gui
|
||||||
restore-keys: |
|
out: out/darwin_amd64_gui/yarr.app
|
||||||
${{ runner.os }}-go-
|
- name: Build arm64 cli
|
||||||
- name: "Build"
|
uses: ./.github/actions/prepare
|
||||||
run: make build_macos
|
|
||||||
- name: Upload
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
with:
|
||||||
name: macos
|
id: darwin_arm64
|
||||||
path: _output/macos/yarr.app
|
cmd: make darwin_arm64
|
||||||
|
out: out/darwin_arm64/yarr
|
||||||
|
- name: Build amd64 cli
|
||||||
|
uses: ./.github/actions/prepare
|
||||||
|
with:
|
||||||
|
id: darwin_amd64
|
||||||
|
cmd: make darwin_amd64
|
||||||
|
out: out/darwin_amd64/yarr
|
||||||
|
|
||||||
build_windows:
|
build_windows:
|
||||||
name: Build for Windows
|
name: Build for Windows
|
||||||
runs-on: windows-2022
|
runs-on: windows-2022
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout"
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v4
|
||||||
|
- name: Setup Go
|
||||||
|
uses: actions/setup-go@v4
|
||||||
with:
|
with:
|
||||||
submodules: 'recursive'
|
go-version: '^1.23'
|
||||||
- name: "Setup Go"
|
- name: Build amd64 gui
|
||||||
uses: actions/setup-go@v2
|
uses: ./.github/actions/prepare
|
||||||
with:
|
with:
|
||||||
go-version: '^1.17'
|
id: windows_amd64_gui
|
||||||
- name: Cache Go Modules
|
cmd: make windows_amd64_gui
|
||||||
uses: actions/cache@v2
|
out: out/windows_amd64_gui/yarr.exe
|
||||||
|
- name: Build arm64 gui
|
||||||
|
if: false
|
||||||
|
uses: ./.github/actions/prepare
|
||||||
with:
|
with:
|
||||||
path: ~/go/pkg/mod
|
id: windows_arm64_gui
|
||||||
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
|
cmd: make windows_arm64_gui
|
||||||
restore-keys: |
|
out: out/windows_arm64_gui/yarr.exe
|
||||||
${{ runner.os }}-go-
|
|
||||||
- name: "Build"
|
|
||||||
run: make build_windows
|
|
||||||
- name: Upload
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: windows
|
|
||||||
path: _output/windows/yarr.exe
|
|
||||||
|
|
||||||
build_linux:
|
build_multi_cli:
|
||||||
name: Build for Linux
|
name: Build for Windows/MacOS/Linux CLI
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout"
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v4
|
||||||
|
- name: Setup Go
|
||||||
|
uses: actions/setup-go@v4
|
||||||
with:
|
with:
|
||||||
submodules: 'recursive'
|
go-version: '^1.23'
|
||||||
- name: "Setup Go"
|
- name: Setup Zig
|
||||||
uses: actions/setup-go@v2
|
uses: mlugg/setup-zig@v1
|
||||||
with:
|
with:
|
||||||
go-version: '^1.17'
|
version: 0.14.0
|
||||||
- name: Cache Go Modules
|
- name: Build linux/amd64
|
||||||
uses: actions/cache@v2
|
uses: ./.github/actions/prepare
|
||||||
with:
|
with:
|
||||||
path: ~/go/pkg/mod
|
id: linux_amd64
|
||||||
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
|
cmd: make linux_amd64
|
||||||
restore-keys: |
|
out: out/linux_amd64/yarr
|
||||||
${{ runner.os }}-go-
|
- name: Build linux/arm64
|
||||||
- name: "Build"
|
uses: ./.github/actions/prepare
|
||||||
run: make build_linux
|
|
||||||
- name: Upload
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
with:
|
||||||
name: linux
|
id: linux_arm64
|
||||||
path: _output/linux/yarr
|
cmd: make linux_arm64
|
||||||
|
out: out/linux_arm64/yarr
|
||||||
|
- name: Build linux/armv7
|
||||||
|
uses: ./.github/actions/prepare
|
||||||
|
with:
|
||||||
|
id: linux_armv7
|
||||||
|
cmd: make linux_armv7
|
||||||
|
out: out/linux_armv7/yarr
|
||||||
|
- name: Build windows/amd64
|
||||||
|
uses: ./.github/actions/prepare
|
||||||
|
with:
|
||||||
|
id: windows_amd64
|
||||||
|
cmd: make windows_amd64
|
||||||
|
out: out/windows_amd64/yarr
|
||||||
|
- name: Build windows/arm64
|
||||||
|
uses: ./.github/actions/prepare
|
||||||
|
with:
|
||||||
|
id: windows_arm64
|
||||||
|
cmd: make windows_arm64
|
||||||
|
out: out/windows_arm64/yarr
|
||||||
|
|
||||||
create_release:
|
create_release:
|
||||||
name: Create Release
|
name: Create Release
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
if: ${{ !contains(github.ref, 'test') }}
|
needs: [build_macos, build_windows, build_multi_cli]
|
||||||
needs: [build_macos, build_windows, build_linux]
|
|
||||||
steps:
|
steps:
|
||||||
- name: Create Release
|
|
||||||
uses: actions/create-release@v1
|
|
||||||
id: create_release
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
|
||||||
tag_name: ${{ github.ref }}
|
|
||||||
release_name: ${{ github.ref }}
|
|
||||||
draft: true
|
|
||||||
prerelease: true
|
|
||||||
- name: Download Artifacts
|
- name: Download Artifacts
|
||||||
uses: actions/download-artifact@v2
|
uses: actions/download-artifact@v4.1.7
|
||||||
with:
|
with:
|
||||||
path: .
|
path: .
|
||||||
- name: Preparation
|
- name: Preparation
|
||||||
run: |
|
run: |
|
||||||
|
set -ex
|
||||||
ls -R
|
ls -R
|
||||||
chmod u+x macos/Contents/MacOS/yarr
|
for tarfile in `ls **/*.tar`; do
|
||||||
chmod u+x linux/yarr
|
tar -xvf $tarfile
|
||||||
|
done
|
||||||
mv macos yarr.app && zip -r yarr-macos.zip yarr.app
|
for dir in out/*; do
|
||||||
mv windows/yarr.exe . && zip yarr-windows.zip yarr.exe
|
echo "Compressing: $dir"
|
||||||
mv linux/yarr . && zip yarr-linux.zip yarr
|
(test -d "$dir" && cd $dir && zip -r ../yarr_`basename $dir`.zip *)
|
||||||
- name: Upload MacOS
|
done
|
||||||
uses: actions/upload-release-asset@v1
|
ls out
|
||||||
|
- name: Upload Release
|
||||||
|
uses: softprops/action-gh-release@v2
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
with:
|
with:
|
||||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
draft: true
|
||||||
asset_path: ./yarr-macos.zip
|
prerelease: true
|
||||||
asset_name: yarr-${{ github.ref }}-macos64.zip
|
files: |
|
||||||
asset_content_type: application/zip
|
out/*.zip
|
||||||
- name: Upload Windows
|
|
||||||
uses: actions/upload-release-asset@v1
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
|
||||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
|
||||||
asset_path: ./yarr-windows.zip
|
|
||||||
asset_name: yarr-${{ github.ref }}-windows64.zip
|
|
||||||
asset_content_type: application/zip
|
|
||||||
- name: Upload Linux
|
|
||||||
uses: actions/upload-release-asset@v1
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
|
||||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
|
||||||
asset_path: ./yarr-linux.zip
|
|
||||||
asset_name: yarr-${{ github.ref }}-linux64.zip
|
|
||||||
asset_content_type: application/zip
|
|
||||||
|
19
.github/workflows/test.yml
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
name: Test
|
||||||
|
|
||||||
|
on: push
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v4
|
||||||
|
with:
|
||||||
|
go-version: '^1.18'
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: make test
|
3
.gitignore
vendored
@@ -1,5 +1,8 @@
|
|||||||
/_output
|
/_output
|
||||||
|
/out
|
||||||
/yarr
|
/yarr
|
||||||
*.db
|
*.db
|
||||||
|
*.db-shm
|
||||||
|
*.db-wal
|
||||||
*.syso
|
*.syso
|
||||||
versioninfo.rc
|
versioninfo.rc
|
||||||
|
@@ -1,48 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"flag"
|
|
||||||
"io/ioutil"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
var rsrc = `1 VERSIONINFO
|
|
||||||
FILEVERSION {VERSION_COMMA},0,0
|
|
||||||
PRODUCTVERSION {VERSION_COMMA},0,0
|
|
||||||
BEGIN
|
|
||||||
BLOCK "StringFileInfo"
|
|
||||||
BEGIN
|
|
||||||
BLOCK "080904E4"
|
|
||||||
BEGIN
|
|
||||||
VALUE "CompanyName", "Old MacDonald's Farm"
|
|
||||||
VALUE "FileDescription", "Yet another RSS reader"
|
|
||||||
VALUE "FileVersion", "{VERSION}"
|
|
||||||
VALUE "InternalName", "yarr"
|
|
||||||
VALUE "LegalCopyright", "nkanaev"
|
|
||||||
VALUE "OriginalFilename", "yarr.exe"
|
|
||||||
VALUE "ProductName", "yarr"
|
|
||||||
VALUE "ProductVersion", "{VERSION}"
|
|
||||||
END
|
|
||||||
END
|
|
||||||
BLOCK "VarFileInfo"
|
|
||||||
BEGIN
|
|
||||||
VALUE "Translation", 0x809, 1252
|
|
||||||
END
|
|
||||||
END
|
|
||||||
|
|
||||||
1 ICON "icon.ico"
|
|
||||||
`
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
var version, outfile string
|
|
||||||
flag.StringVar(&version, "version", "0.0", "")
|
|
||||||
flag.StringVar(&outfile, "outfile", "versioninfo.rc", "")
|
|
||||||
flag.Parse()
|
|
||||||
|
|
||||||
version_comma := strings.ReplaceAll(version, ".", ",")
|
|
||||||
|
|
||||||
out := strings.ReplaceAll(rsrc, "{VERSION}", version)
|
|
||||||
out = strings.ReplaceAll(out, "{VERSION_COMMA}", version_comma)
|
|
||||||
|
|
||||||
ioutil.WriteFile(outfile, []byte(out), 0644)
|
|
||||||
}
|
|
@@ -1,99 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"path"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
var plist = `<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>CFBundleName</key>
|
|
||||||
<string>yarr</string>
|
|
||||||
<key>CFBundleDisplayName</key>
|
|
||||||
<string>yarr</string>
|
|
||||||
<key>CFBundleIdentifier</key>
|
|
||||||
<string>nkanaev.yarr</string>
|
|
||||||
<key>CFBundleVersion</key>
|
|
||||||
<string>VERSION</string>
|
|
||||||
<key>CFBundlePackageType</key>
|
|
||||||
<string>APPL</string>
|
|
||||||
<key>CFBundleExecutable</key>
|
|
||||||
<string>yarr</string>
|
|
||||||
|
|
||||||
<key>CFBundleIconFile</key>
|
|
||||||
<string>icon</string>
|
|
||||||
<key>LSApplicationCategoryType</key>
|
|
||||||
<string>public.app-category.news</string>
|
|
||||||
|
|
||||||
<key>NSHighResolutionCapable</key>
|
|
||||||
<string>True</string>
|
|
||||||
|
|
||||||
<key>LSMinimumSystemVersion</key>
|
|
||||||
<string>10.13</string>
|
|
||||||
<key>LSUIElement</key>
|
|
||||||
<true/>
|
|
||||||
<key>NSHumanReadableCopyright</key>
|
|
||||||
<string>Copyright © 2020 nkanaev. All rights reserved.</string>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
`
|
|
||||||
|
|
||||||
func run(cmd ...string) {
|
|
||||||
fmt.Println(cmd)
|
|
||||||
err := exec.Command(cmd[0], cmd[1:]...).Run()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
var version, outdir string
|
|
||||||
flag.StringVar(&version, "version", "0.0", "")
|
|
||||||
flag.StringVar(&outdir, "outdir", "", "")
|
|
||||||
flag.Parse()
|
|
||||||
|
|
||||||
outfile := "yarr"
|
|
||||||
|
|
||||||
binDir := path.Join(outdir, "yarr.app", "Contents/MacOS")
|
|
||||||
resDir := path.Join(outdir, "yarr.app", "Contents/Resources")
|
|
||||||
|
|
||||||
plistFile := path.Join(outdir, "yarr.app", "Contents/Info.plist")
|
|
||||||
pkginfoFile := path.Join(outdir, "yarr.app", "Contents/PkgInfo")
|
|
||||||
|
|
||||||
os.MkdirAll(binDir, 0700)
|
|
||||||
os.MkdirAll(resDir, 0700)
|
|
||||||
|
|
||||||
f, _ := ioutil.ReadFile(path.Join(outdir, outfile))
|
|
||||||
ioutil.WriteFile(path.Join(binDir, outfile), f, 0755)
|
|
||||||
|
|
||||||
ioutil.WriteFile(plistFile, []byte(strings.Replace(plist, "VERSION", version, 1)), 0644)
|
|
||||||
ioutil.WriteFile(pkginfoFile, []byte("APPL????"), 0644)
|
|
||||||
|
|
||||||
iconFile := path.Join(outdir, "icon.png")
|
|
||||||
iconsetDir := path.Join(outdir, "icon.iconset")
|
|
||||||
os.Mkdir(iconsetDir, 0700)
|
|
||||||
|
|
||||||
for _, res := range []int{1024, 512, 256, 128, 64, 32, 16} {
|
|
||||||
outfile := fmt.Sprintf("icon_%dx%d.png", res, res)
|
|
||||||
if res == 1024 || res == 64 {
|
|
||||||
outfile = fmt.Sprintf("icon_%dx%d@2x.png", res/2, res/2)
|
|
||||||
}
|
|
||||||
cmd := []string{
|
|
||||||
"sips", "-s", "format", "png", "--resampleWidth", strconv.Itoa(res),
|
|
||||||
iconFile, "--out", path.Join(iconsetDir, outfile),
|
|
||||||
}
|
|
||||||
run(cmd...)
|
|
||||||
}
|
|
||||||
|
|
||||||
icnsFile := path.Join(resDir, "icon.icns")
|
|
||||||
run("iconutil", "-c", "icns", iconsetDir, "-o", icnsFile)
|
|
||||||
}
|
|
44
build.md
@@ -1,44 +0,0 @@
|
|||||||
## Compilation
|
|
||||||
|
|
||||||
Install `Go >= 1.17` and `GCC`. Get the source code:
|
|
||||||
|
|
||||||
git clone https://github.com/nkanaev/yarr.git
|
|
||||||
|
|
||||||
Then run one of the corresponding commands:
|
|
||||||
|
|
||||||
# create an executable for the host os
|
|
||||||
make build_macos # -> _output/macos/yarr.app
|
|
||||||
make build_linux # -> _output/linux/yarr
|
|
||||||
make build_windows # -> _output/windows/yarr.exe
|
|
||||||
|
|
||||||
# host-specific cli version (no gui)
|
|
||||||
make build_default # -> _output/yarr
|
|
||||||
|
|
||||||
# ... or start a dev server locally
|
|
||||||
make serve # starts a server at http://localhost:7070
|
|
||||||
|
|
||||||
# ... or build a docker image
|
|
||||||
docker build -t yarr .
|
|
||||||
|
|
||||||
## ARM compilation
|
|
||||||
|
|
||||||
The instructions below are to cross-compile *yarr* to `Linux/ARM*`.
|
|
||||||
|
|
||||||
Build:
|
|
||||||
|
|
||||||
docker build -t yarr.arm -f dockerfile.arm .
|
|
||||||
|
|
||||||
Test:
|
|
||||||
|
|
||||||
# inside host
|
|
||||||
docker run -it --rm yarr.arm
|
|
||||||
|
|
||||||
# then, inside container
|
|
||||||
cd /root/out
|
|
||||||
qemu-aarch64 -L /usr/aarch64-linux-gnu/ yarr.arm64
|
|
||||||
|
|
||||||
Extract files from images:
|
|
||||||
|
|
||||||
CID=$(docker create yarr.arm)
|
|
||||||
docker cp -a "$CID:/root/out" .
|
|
||||||
docker rm "$CID"
|
|
@@ -13,6 +13,7 @@ import (
|
|||||||
"github.com/nkanaev/yarr/src/platform"
|
"github.com/nkanaev/yarr/src/platform"
|
||||||
"github.com/nkanaev/yarr/src/server"
|
"github.com/nkanaev/yarr/src/server"
|
||||||
"github.com/nkanaev/yarr/src/storage"
|
"github.com/nkanaev/yarr/src/storage"
|
||||||
|
"github.com/nkanaev/yarr/src/worker"
|
||||||
)
|
)
|
||||||
|
|
||||||
var Version string = "0.0"
|
var Version string = "0.0"
|
||||||
@@ -89,12 +90,12 @@ func main() {
|
|||||||
log.SetOutput(os.Stdout)
|
log.SetOutput(os.Stdout)
|
||||||
}
|
}
|
||||||
|
|
||||||
configPath, err := os.UserConfigDir()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("Failed to get config dir: ", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if db == "" {
|
if db == "" {
|
||||||
|
configPath, err := os.UserConfigDir()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Failed to get config dir: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
storagePath := filepath.Join(configPath, "yarr")
|
storagePath := filepath.Join(configPath, "yarr")
|
||||||
if err := os.MkdirAll(storagePath, 0755); err != nil {
|
if err := os.MkdirAll(storagePath, 0755); err != nil {
|
||||||
log.Fatal("Failed to create app config dir: ", err)
|
log.Fatal("Failed to create app config dir: ", err)
|
||||||
@@ -105,6 +106,7 @@ func main() {
|
|||||||
log.Printf("using db file %s", db)
|
log.Printf("using db file %s", db)
|
||||||
|
|
||||||
var username, password string
|
var username, password string
|
||||||
|
var err error
|
||||||
if authfile != "" {
|
if authfile != "" {
|
||||||
f, err := os.Open(authfile)
|
f, err := os.Open(authfile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -131,6 +133,7 @@ func main() {
|
|||||||
log.Fatal("Failed to initialise database: ", err)
|
log.Fatal("Failed to initialise database: ", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
worker.SetVersion(Version)
|
||||||
srv := server.NewServer(store, addr)
|
srv := server.NewServer(store, addr)
|
||||||
|
|
||||||
if basepath != "" {
|
if basepath != "" {
|
56
doc/build.md
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
## Compilation
|
||||||
|
|
||||||
|
Prerequisies:
|
||||||
|
|
||||||
|
* Go >= 1.23
|
||||||
|
* C Compiler (GCC / Clang / ...)
|
||||||
|
* Zig >= 0.14.0 (optional, for cross-compiling CLI versions)
|
||||||
|
* binutils (optional, for building Windows GUI version)
|
||||||
|
|
||||||
|
Get the source code:
|
||||||
|
|
||||||
|
git clone https://github.com/nkanaev/yarr.git
|
||||||
|
|
||||||
|
Compile:
|
||||||
|
|
||||||
|
# create cli for the host OS/architecture
|
||||||
|
make host # out/yarr
|
||||||
|
|
||||||
|
# create GUI, works only in the target OS
|
||||||
|
make windows_amd64_gui # out/windows_amd64_gui/yarr.exe
|
||||||
|
make windows_arm64_gui # out/windows_arm64_gui/yarr.exe
|
||||||
|
make darwin_arm64_gui # out/darwin_arm64_gui/yarr.app
|
||||||
|
make darwin_amd64_gui # out/darwin_amd64_gui/yarr.app
|
||||||
|
|
||||||
|
# create cli, cross-compiles within any OS/architecture
|
||||||
|
make linux_amd64
|
||||||
|
make linux_arm64
|
||||||
|
make linux_armv7
|
||||||
|
make windows_amd64
|
||||||
|
make windows_arm64
|
||||||
|
|
||||||
|
# ... or build a docker image
|
||||||
|
docker build -t yarr -f etc/dockerfile .
|
||||||
|
|
||||||
|
## ARM compilation
|
||||||
|
|
||||||
|
The instructions below are to cross-compile *yarr* to `Linux/ARM*`.
|
||||||
|
|
||||||
|
Build:
|
||||||
|
|
||||||
|
docker build -t yarr.arm -f etc/dockerfile.arm .
|
||||||
|
|
||||||
|
Test:
|
||||||
|
|
||||||
|
# inside host
|
||||||
|
docker run -it --rm yarr.arm
|
||||||
|
|
||||||
|
# then, inside container
|
||||||
|
cd /root/out
|
||||||
|
qemu-aarch64 -L /usr/aarch64-linux-gnu/ yarr.arm64
|
||||||
|
|
||||||
|
Extract files from images:
|
||||||
|
|
||||||
|
CID=$(docker create yarr.arm)
|
||||||
|
docker cp -a "$CID:/root/out" .
|
||||||
|
docker rm "$CID"
|
@@ -1,9 +1,22 @@
|
|||||||
# upcoming
|
# upcoming
|
||||||
|
|
||||||
- (new) Fever API support (thanks to @icefed)
|
- (new) Fever API support (thanks to @icefed)
|
||||||
|
- (new) editable feed link (thanks to @adaszko)
|
||||||
|
- (new) switch to feed by clicking the title in the article page (thanks to @tarasglek for suggestion)
|
||||||
|
- (new) support multiple media links
|
||||||
- (fix) duplicate articles caused by the same feed addition (thanks to @adaszko)
|
- (fix) duplicate articles caused by the same feed addition (thanks to @adaszko)
|
||||||
- (fix) relative article links (thanks to @adazsko for the report)
|
- (fix) relative article links (thanks to @adazsko for the report)
|
||||||
- (fix) atom article links stored in id element (thanks to @adazsko for the report)
|
- (fix) atom article links stored in id element (thanks to @adazsko for the report)
|
||||||
|
- (fix) parsing atom feed titles (thanks to @wnh)
|
||||||
|
- (fix) sorting same-day batch articles (thanks to @lamescholar for the report)
|
||||||
|
- (fix) showing login page in the selected theme (thanks to @feddiriko for the report)
|
||||||
|
- (fix) parsing atom feeds with html elements (thanks to @tillcash & @toBeOfUse for the report, @krkk for the fix)
|
||||||
|
- (fix) parsing feeds with missing guids (thanks to @hoyii for the report)
|
||||||
|
- (fix) sending actual client version to servers (thanks to @aidanholm)
|
||||||
|
- (fix) error caused by missing config dir (thanks to @timster)
|
||||||
|
- (etc) load external images with no-referrer policy (thanks to @tillcash for the report)
|
||||||
|
- (etc) open external links with no-referrer policy (thanks to @donovanglover)
|
||||||
|
- (etc) show article content in the list if title is missing (thanks to @asimpson for suggestion)
|
||||||
|
|
||||||
# v2.4 (2023-08-15)
|
# v2.4 (2023-08-15)
|
||||||
|
|
||||||
|
68
doc/samples.yml
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
- site: https://vimeo.com/channels/staffpicks/videos
|
||||||
|
feed: https://vimeo.com/channels/staffpicks/videos/rss
|
||||||
|
tags: [vimeo, image]
|
||||||
|
|
||||||
|
- site: https://www.youtube.com/@everyframeapainting/videos
|
||||||
|
feed: https://www.youtube.com/feeds/videos.xml?channel_id=UCjFqcJQXGZ6T6sxyFB-5i6A"
|
||||||
|
tags: [youtube, image]
|
||||||
|
|
||||||
|
- site: https://iwdrm.tumblr.com/
|
||||||
|
feed: https://iwdrm.tumblr.com/rss
|
||||||
|
tags: [tumblr, image]
|
||||||
|
|
||||||
|
- site: https://falseknees.tumblr.com/
|
||||||
|
feed: https://falseknees.tumblr.com/rss
|
||||||
|
tags: [tumblr, image]
|
||||||
|
|
||||||
|
- site: https://accidentallyquadratic.tumblr.com/
|
||||||
|
feed: https://accidentallyquadratic.tumblr.com/rss
|
||||||
|
info: text blog with code sections
|
||||||
|
tags: [tumblr, text, code]
|
||||||
|
|
||||||
|
- site: https://www.flickr.com/photos/maratsafin/
|
||||||
|
feed: https://www.flickr.com/services/feeds/photos_public.gne?id=59021497@N07&lang=en-us&format=atom
|
||||||
|
tags: [flickr, image]
|
||||||
|
|
||||||
|
- site: https://www.reddit.com/r/comics
|
||||||
|
feed: https://www.reddit.com/r/comics.rss
|
||||||
|
tags: [reddit, image]
|
||||||
|
|
||||||
|
- site: https://www.reddit.com/r/AITAH
|
||||||
|
feed: https://www.reddit.com/r/AITAH.rss
|
||||||
|
tags: [reddit, text]
|
||||||
|
|
||||||
|
- site: https://idothei.wordpress.com/
|
||||||
|
feed: https://idothei.wordpress.com/feed/
|
||||||
|
tags: [wordpress, text]
|
||||||
|
|
||||||
|
- site: https://www.vidarholen.net/contents/blog/
|
||||||
|
feed: https://www.vidarholen.net/contents/blog/?feed=rss2
|
||||||
|
tags: [wordpress, text]
|
||||||
|
|
||||||
|
- site: https://blog.posthaven.com/
|
||||||
|
feed: https://blog.posthaven.com/posts.atom
|
||||||
|
tags: [posthaven, text]
|
||||||
|
|
||||||
|
- site: https://medium.com/@dailynewsletter
|
||||||
|
feed: https://medium.com/feed/@dailynewsletter
|
||||||
|
tags: [medium, text]
|
||||||
|
|
||||||
|
- site: https://thereveal.substack.com/
|
||||||
|
feed: https://thereveal.substack.com/feed
|
||||||
|
tags: [substack, text]
|
||||||
|
|
||||||
|
- site: https://tema.livejournal.com/
|
||||||
|
feed: https://tema.livejournal.com/data/rss
|
||||||
|
tags: [livejournal, text]
|
||||||
|
|
||||||
|
- site: https://mametter.hatenablog.com/
|
||||||
|
feed: https://mametter.hatenablog.com/feed
|
||||||
|
tags: [hatena, text]
|
||||||
|
|
||||||
|
- site: https://juliepowell.blogspot.com/
|
||||||
|
feed: https://juliepowell.blogspot.com/feeds/posts/default
|
||||||
|
tags: [blogger, text]
|
||||||
|
|
||||||
|
- site: https://micro.blog/val
|
||||||
|
feed: https://micro.blog/posts/val
|
||||||
|
tags: [json, microblog]
|
12
dockerfile
@@ -1,12 +0,0 @@
|
|||||||
FROM golang:alpine AS build
|
|
||||||
RUN apk add build-base git
|
|
||||||
WORKDIR /src
|
|
||||||
COPY . .
|
|
||||||
RUN make build_linux
|
|
||||||
|
|
||||||
FROM alpine:latest
|
|
||||||
RUN apk add --no-cache ca-certificates && \
|
|
||||||
update-ca-certificates
|
|
||||||
COPY --from=build /src/_output/linux/yarr /usr/local/bin/yarr
|
|
||||||
EXPOSE 7070
|
|
||||||
CMD ["/usr/local/bin/yarr", "-addr", "0.0.0.0:7070", "-db", "/data/yarr.db"]
|
|
14
etc/dockerfile
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
FROM golang:alpine3.21 AS build
|
||||||
|
RUN apk add build-base git
|
||||||
|
WORKDIR /src
|
||||||
|
COPY . .
|
||||||
|
RUN --mount=type=cache,target=/root/.cache/go-build \
|
||||||
|
--mount=type=cache,target=/root/go/pkg \
|
||||||
|
make host
|
||||||
|
|
||||||
|
FROM alpine:latest
|
||||||
|
RUN apk add --no-cache ca-certificates && update-ca-certificates
|
||||||
|
COPY --from=build /src/out/yarr /usr/local/bin/yarr
|
||||||
|
EXPOSE 7070
|
||||||
|
ENTRYPOINT ["/usr/local/bin/yarr"]
|
||||||
|
CMD ["-addr", "0.0.0.0:7070", "-db", "/data/yarr.db"]
|
@@ -12,9 +12,9 @@ RUN env DEBIAN_FRONTEND=noninteractive \
|
|||||||
apt install -y qemu-user qemu-user-static
|
apt install -y qemu-user qemu-user-static
|
||||||
|
|
||||||
# Install Golang
|
# Install Golang
|
||||||
RUN wget --quiet https://go.dev/dl/go1.18.2.linux-amd64.tar.gz && \
|
RUN wget --quiet https://go.dev/dl/go1.24.1.linux-amd64.tar.gz && \
|
||||||
rm -rf /usr/local/go && \
|
rm -rf /usr/local/go && \
|
||||||
tar -C /usr/local -xzf go1.18.2.linux-amd64.tar.gz
|
tar -C /usr/local -xzf go1.24.1.linux-amd64.tar.gz
|
||||||
ENV PATH=$PATH:/usr/local/go/bin
|
ENV PATH=$PATH:/usr/local/go/bin
|
||||||
|
|
||||||
# Copy source code
|
# Copy source code
|
||||||
@@ -27,18 +27,12 @@ RUN env \
|
|||||||
CC=aarch64-linux-gnu-gcc \
|
CC=aarch64-linux-gnu-gcc \
|
||||||
CGO_ENABLED=1 \
|
CGO_ENABLED=1 \
|
||||||
GOOS=linux GOARCH=arm64 \
|
GOOS=linux GOARCH=arm64 \
|
||||||
go build \
|
make host && mv out/yarr /root/out/yarr.arm64
|
||||||
-tags "sqlite_foreign_keys release linux" \
|
|
||||||
-ldflags="-s -w" \
|
|
||||||
-o /root/out/yarr.arm64 src/main.go
|
|
||||||
|
|
||||||
RUN env \
|
RUN env \
|
||||||
CC=arm-linux-gnueabihf-gcc \
|
CC=arm-linux-gnueabihf-gcc \
|
||||||
CGO_ENABLED=1 \
|
CGO_ENABLED=1 \
|
||||||
GOOS=linux GOARCH=arm GOARM=7 \
|
GOOS=linux GOARCH=arm GOARM=7 \
|
||||||
go build \
|
make host && mv out/yarr /root/out/yarr.armv7
|
||||||
-tags "sqlite_foreign_keys release linux" \
|
|
||||||
-ldflags="-s -w" \
|
|
||||||
-o /root/out/yarr.arm7 src/main.go
|
|
||||||
|
|
||||||
CMD ["/bin/bash"]
|
CMD ["/bin/bash"]
|
BIN
etc/icon.icns
Normal file
BIN
etc/icon_macos.png
Normal file
After Width: | Height: | Size: 54 KiB |
@@ -1,5 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [[ ! -d "$HOME/.local/share/applications" ]]; then
|
||||||
|
mkdir -p "$HOME/.local/share/applications"
|
||||||
|
fi
|
||||||
|
|
||||||
cat >"$HOME/.local/share/applications/yarr.desktop" <<END
|
cat >"$HOME/.local/share/applications/yarr.desktop" <<END
|
||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Name=yarr
|
Name=yarr
|
||||||
@@ -9,6 +13,10 @@ Type=Application
|
|||||||
Categories=Internet;
|
Categories=Internet;
|
||||||
END
|
END
|
||||||
|
|
||||||
|
if [[ ! -d "$HOME/.local/share/icons" ]]; then
|
||||||
|
mkdir -p "$HOME/.local/share/icons"
|
||||||
|
fi
|
||||||
|
|
||||||
cat >"$HOME/.local/share/icons/yarr.svg" <<END
|
cat >"$HOME/.local/share/icons/yarr.svg" <<END
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-anchor-favicon">
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-anchor-favicon">
|
||||||
|
62
etc/macos_package.sh
Executable file
@@ -0,0 +1,62 @@
|
|||||||
|
#/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "usage: $0 VERSION path/to/icon.icns path/to/binary output/dir"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ $# -eq 0 ]; then
|
||||||
|
usage
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
VERSION=$1
|
||||||
|
ICNFILE=$2
|
||||||
|
BINFILE=$3
|
||||||
|
OUTPATH=$4
|
||||||
|
|
||||||
|
mkdir -p $OUTPATH/yarr.app/Contents/MacOS
|
||||||
|
mkdir -p $OUTPATH/yarr.app/Contents/Resources
|
||||||
|
|
||||||
|
mv $BINFILE $OUTPATH/yarr.app/Contents/MacOS/yarr
|
||||||
|
cp $ICNFILE $OUTPATH/yarr.app/Contents/Resources/icon.icns
|
||||||
|
|
||||||
|
chmod u+x $OUTPATH/yarr.app/Contents/MacOS/yarr
|
||||||
|
|
||||||
|
echo -n 'APPL????' >$OUTPATH/yarr.app/Contents/PkgInfo
|
||||||
|
cat <<EOF >$OUTPATH/yarr.app/Contents/Info.plist
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>yarr</string>
|
||||||
|
<key>CFBundleDisplayName</key>
|
||||||
|
<string>yarr</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>nkanaev.yarr</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>$VERSION</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>APPL</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>yarr</string>
|
||||||
|
|
||||||
|
<key>CFBundleIconFile</key>
|
||||||
|
<string>icon</string>
|
||||||
|
<key>LSApplicationCategoryType</key>
|
||||||
|
<string>public.app-category.news</string>
|
||||||
|
|
||||||
|
<key>NSHighResolutionCapable</key>
|
||||||
|
<string>True</string>
|
||||||
|
|
||||||
|
<key>LSMinimumSystemVersion</key>
|
||||||
|
<string>10.13</string>
|
||||||
|
<key>LSUIElement</key>
|
||||||
|
<true/>
|
||||||
|
<key>NSHumanReadableCopyright</key>
|
||||||
|
<string>Copyright © 2020 nkanaev. All rights reserved.</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
|
EOF
|
89
etc/windows_versioninfo.sh
Executable file
@@ -0,0 +1,89 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Function to display usage information
|
||||||
|
usage() {
|
||||||
|
echo "Usage: $0 [-version VERSION] [-outfile FILENAME]"
|
||||||
|
echo " -version VERSION Set the version number (default: 0.0)"
|
||||||
|
echo " -outfile FILENAME Set the output file name (default: versioninfo.rc)"
|
||||||
|
echo ""
|
||||||
|
echo "This script generates a Windows resource file with version information."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Default values
|
||||||
|
version="0.0"
|
||||||
|
outfile="versioninfo.rc"
|
||||||
|
|
||||||
|
# Check if help is requested
|
||||||
|
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $# -eq 0 ]; then
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Parse command-line options
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
-version)
|
||||||
|
if [[ -z "$2" || "$2" == -* ]]; then
|
||||||
|
echo "Error: Missing value for -version parameter"
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
version="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-outfile)
|
||||||
|
if [[ -z "$2" || "$2" == -* ]]; then
|
||||||
|
echo "Error: Missing value for -outfile parameter"
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
outfile="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Error: Unknown parameter: $1"
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Replace dots with commas for version_comma
|
||||||
|
version_comma="${version//./,}"
|
||||||
|
|
||||||
|
# Use a here document for the template with ENDFILE delimiter
|
||||||
|
cat <<ENDFILE > "$outfile"
|
||||||
|
1 VERSIONINFO
|
||||||
|
FILEVERSION $version_comma,0,0
|
||||||
|
PRODUCTVERSION $version_comma,0,0
|
||||||
|
BEGIN
|
||||||
|
BLOCK "StringFileInfo"
|
||||||
|
BEGIN
|
||||||
|
BLOCK "080904E4"
|
||||||
|
BEGIN
|
||||||
|
VALUE "CompanyName", "Old MacDonald's Farm"
|
||||||
|
VALUE "FileDescription", "Yet another RSS reader"
|
||||||
|
VALUE "FileVersion", "$version"
|
||||||
|
VALUE "InternalName", "yarr"
|
||||||
|
VALUE "LegalCopyright", "nkanaev"
|
||||||
|
VALUE "OriginalFilename", "yarr.exe"
|
||||||
|
VALUE "ProductName", "yarr"
|
||||||
|
VALUE "ProductVersion", "$version"
|
||||||
|
END
|
||||||
|
END
|
||||||
|
BLOCK "VarFileInfo"
|
||||||
|
BEGIN
|
||||||
|
VALUE "Translation", 0x809, 1252
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
||||||
|
1 ICON "icon.ico"
|
||||||
|
ENDFILE
|
||||||
|
|
||||||
|
# Set the correct permissions
|
||||||
|
chmod 644 "$outfile"
|
||||||
|
|
||||||
|
echo "Generated $outfile with version $version"
|
12
go.mod
@@ -1,11 +1,13 @@
|
|||||||
module github.com/nkanaev/yarr
|
module github.com/nkanaev/yarr
|
||||||
|
|
||||||
go 1.17
|
go 1.23.0
|
||||||
|
|
||||||
|
toolchain go1.23.5
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/mattn/go-sqlite3 v1.14.7
|
github.com/mattn/go-sqlite3 v1.14.24
|
||||||
golang.org/x/net v0.8.0
|
golang.org/x/net v0.37.0
|
||||||
golang.org/x/sys v0.6.0
|
golang.org/x/sys v0.31.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require golang.org/x/text v0.8.0 // indirect
|
require golang.org/x/text v0.23.0 // indirect
|
||||||
|
53
go.sum
@@ -1,39 +1,14 @@
|
|||||||
github.com/mattn/go-sqlite3 v1.14.7 h1:fxWBnXkxfM6sRiuH3bqJ4CfzZojMOLVc0UTsTglEghA=
|
github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM=
|
||||||
github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I=
|
||||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c=
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
|
||||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
|
||||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
|
||||||
golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
|
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
|
||||||
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
|
||||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
|
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
|
||||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
|
||||||
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
|
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|
||||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
|
||||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
|
||||||
golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
|
|
||||||
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
|
||||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
|
98
makefile
@@ -1,33 +1,89 @@
|
|||||||
VERSION=2.4
|
VERSION=2.5
|
||||||
GITHASH=$(shell git rev-parse --short=8 HEAD)
|
GITHASH=$(shell git rev-parse --short=8 HEAD)
|
||||||
|
|
||||||
CGO_ENABLED=1
|
GO_TAGS = sqlite_foreign_keys sqlite_json
|
||||||
|
GO_LDFLAGS = -s -w -X 'main.Version=$(VERSION)' -X 'main.GitHash=$(GITHASH)'
|
||||||
|
|
||||||
GO_LDFLAGS = -s -w
|
GO_FLAGS = -tags "$(GO_TAGS)" -ldflags="$(GO_LDFLAGS)"
|
||||||
GO_LDFLAGS := $(GO_LDFLAGS) -X 'main.Version=$(VERSION)' -X 'main.GitHash=$(GITHASH)'
|
GO_FLAGS_GUI = -tags "$(GO_TAGS) gui" -ldflags="$(GO_LDFLAGS)"
|
||||||
|
GO_FLAGS_GUI_WIN = -tags "$(GO_TAGS) gui" -ldflags="$(GO_LDFLAGS) -H windowsgui"
|
||||||
|
|
||||||
build_default:
|
export CGO_ENABLED=1
|
||||||
mkdir -p _output
|
|
||||||
go build -tags "sqlite_foreign_keys release" -ldflags="$(GO_LDFLAGS)" -o _output/yarr src/main.go
|
|
||||||
|
|
||||||
build_macos:
|
default: test host
|
||||||
mkdir -p _output/macos
|
|
||||||
GOOS=darwin GOARCH=amd64 go build -tags "sqlite_foreign_keys release macos" -ldflags="$(GO_LDFLAGS)" -o _output/macos/yarr src/main.go
|
|
||||||
cp src/platform/icon.png _output/macos/icon.png
|
|
||||||
go run bin/package_macos.go -outdir _output/macos -version "$(VERSION)"
|
|
||||||
|
|
||||||
build_linux:
|
# platform-specific files
|
||||||
mkdir -p _output/linux
|
|
||||||
GOOS=linux GOARCH=amd64 go build -tags "sqlite_foreign_keys release linux" -ldflags="$(GO_LDFLAGS)" -o _output/linux/yarr src/main.go
|
|
||||||
|
|
||||||
build_windows:
|
etc/icon.icns: etc/icon_macos.png
|
||||||
mkdir -p _output/windows
|
mkdir -p etc/icon.iconset
|
||||||
go run bin/generate_versioninfo.go -version "$(VERSION)" -outfile src/platform/versioninfo.rc
|
sips -s format png --resampleWidth 1024 etc/icon_macos.png --out etc/icon.iconset/icon_512x512@2x.png
|
||||||
|
sips -s format png --resampleWidth 512 etc/icon_macos.png --out etc/icon.iconset/icon_512x512.png
|
||||||
|
sips -s format png --resampleWidth 256 etc/icon_macos.png --out etc/icon.iconset/icon_256x256.png
|
||||||
|
sips -s format png --resampleWidth 128 etc/icon_macos.png --out etc/icon.iconset/icon_128x128.png
|
||||||
|
sips -s format png --resampleWidth 64 etc/icon_macos.png --out etc/icon.iconset/icon_32x32@2x.png
|
||||||
|
sips -s format png --resampleWidth 32 etc/icon_macos.png --out etc/icon.iconset/icon_32x32.png
|
||||||
|
sips -s format png --resampleWidth 16 etc/icon_macos.png --out etc/icon.iconset/icon_16x16.png
|
||||||
|
iconutil -c icns etc/icon.iconset -o etc/icon.icns
|
||||||
|
|
||||||
|
src/platform/versioninfo.rc:
|
||||||
|
./etc/windows_versioninfo.sh -version "$(VERSION)" -outfile src/platform/versioninfo.rc
|
||||||
windres -i src/platform/versioninfo.rc -O coff -o src/platform/versioninfo.syso
|
windres -i src/platform/versioninfo.rc -O coff -o src/platform/versioninfo.syso
|
||||||
GOOS=windows GOARCH=amd64 go build -tags "sqlite_foreign_keys release windows" -ldflags="$(GO_LDFLAGS) -H windowsgui" -o _output/windows/yarr.exe src/main.go
|
|
||||||
|
# build targets
|
||||||
|
|
||||||
|
host:
|
||||||
|
go build $(GO_FLAGS) -o out/yarr ./cmd/yarr
|
||||||
|
|
||||||
|
darwin_amd64:
|
||||||
|
# cross-compilation not supported: CC="zig cc -target x86_64-macos-none"
|
||||||
|
GOOS=darwin GOARCH=arm64 go build $(GO_FLAGS) -o out/$@/yarr ./cmd/yarr
|
||||||
|
|
||||||
|
darwin_arm64:
|
||||||
|
# cross-compilation not supported: CC="zig cc -target aarch64-macos-none"
|
||||||
|
GOOS=darwin GOARCH=arm64 go build $(GO_FLAGS) -o out/$@/yarr ./cmd/yarr
|
||||||
|
|
||||||
|
linux_amd64:
|
||||||
|
CC="zig cc -target x86_64-linux-musl -O2 -g0" CGO_CFLAGS="-D_LARGEFILE64_SOURCE" GOOS=linux GOARCH=amd64 \
|
||||||
|
go build $(GO_FLAGS) -o out/$@/yarr ./cmd/yarr
|
||||||
|
|
||||||
|
linux_arm64:
|
||||||
|
CC="zig cc -target aarch64-linux-musl -O2 -g0" CGO_CFLAGS="-D_LARGEFILE64_SOURCE" GOOS=linux GOARCH=arm64 \
|
||||||
|
go build $(GO_FLAGS) -o out/$@/yarr ./cmd/yarr
|
||||||
|
|
||||||
|
linux_armv7:
|
||||||
|
CC="zig cc -target arm-linux-musleabihf -O2 -g0" CGO_CFLAGS="-D_LARGEFILE64_SOURCE" GOOS=linux GOARCH=arm GOARM=7 \
|
||||||
|
go build $(GO_FLAGS) -o out/$@/yarr ./cmd/yarr
|
||||||
|
|
||||||
|
windows_amd64:
|
||||||
|
CC="zig cc -target x86_64-windows-gnu" GOOS=windows GOARCH=amd64 go build $(GO_FLAGS) -o out/$@/yarr ./cmd/yarr
|
||||||
|
|
||||||
|
windows_arm64:
|
||||||
|
CC="zig cc -target aarch64-windows-gnu" GOOS=windows GOARCH=arm64 go build $(GO_FLAGS) -o out/$@/yarr ./cmd/yarr
|
||||||
|
|
||||||
|
darwin_arm64_gui: etc/icon.icns
|
||||||
|
GOOS=darwin GOARCH=arm64 go build $(GO_FLAGS_GUI) -o out/$@/yarr ./cmd/yarr
|
||||||
|
./etc/macos_package.sh $(VERSION) etc/icon.icns out/$@/yarr out/$@
|
||||||
|
|
||||||
|
darwin_amd64_gui: etc/icon.icns
|
||||||
|
GOOS=darwin GOARCH=amd64 go build $(GO_FLAGS_GUI) -o out/$@/yarr ./cmd/yarr
|
||||||
|
./etc/macos_package.sh $(VERSION) etc/icon.icns out/$@/yarr out/$@
|
||||||
|
|
||||||
|
windows_amd64_gui: src/platform/versioninfo.rc
|
||||||
|
GOOS=windows GOARCH=amd64 go build $(GO_FLAGS_GUI_WIN) -o out/$@/yarr.exe ./cmd/yarr
|
||||||
|
|
||||||
|
windows_arm64_gui: src/platform/versioninfo.rc
|
||||||
|
GOOS=windows GOARCH=arm64 go build $(GO_FLAGS_GUI_WIN) -o out/$@/yarr.exe ./cmd/yarr
|
||||||
|
|
||||||
serve:
|
serve:
|
||||||
go run -tags "sqlite_foreign_keys" src/main.go -db local.db
|
go run $(GO_FLAGS) ./cmd/yarr -db local.db
|
||||||
|
|
||||||
test:
|
test:
|
||||||
cd src && go test -tags "sqlite_foreign_keys release" ./...
|
go test $(GO_FLAGS) ./...
|
||||||
|
|
||||||
|
.PHONY: \
|
||||||
|
host \
|
||||||
|
darwin_amd64 darwin_amd64_gui \
|
||||||
|
darwin_arm64 darwin_arm64_gui \
|
||||||
|
windows_amd64 windows_amd64_gui \
|
||||||
|
windows_arm64 windows_arm64_gui \
|
||||||
|
serve test
|
||||||
|
30
readme.md
@@ -10,27 +10,29 @@ The app is a single binary with an embedded database (SQLite).
|
|||||||
## usage
|
## usage
|
||||||
|
|
||||||
The latest prebuilt binaries for Linux/MacOS/Windows AMD64 are available
|
The latest prebuilt binaries for Linux/MacOS/Windows AMD64 are available
|
||||||
[here](https://github.com/nkanaev/yarr/releases/latest).
|
[here](https://github.com/nkanaev/yarr/releases/latest). Installation instructions:
|
||||||
|
|
||||||
### macos
|
* MacOS
|
||||||
|
|
||||||
Download `yarr-*-macos64.zip`, unzip it, place `yarr.app` in `/Applications` folder, [open the app][macos-open], click the anchor menu bar icon, select "Open".
|
Download `yarr-*-macos64.zip`, unzip it, place `yarr.app` in `/Applications` folder, [open the app][macos-open], click the anchor menu bar icon, select "Open".
|
||||||
|
|
||||||
|
* Windows
|
||||||
|
|
||||||
|
Download `yarr-*-windows64.zip`, unzip it, open `yarr.exe`, click the anchor system tray icon, select "Open".
|
||||||
|
|
||||||
|
* Linux
|
||||||
|
|
||||||
|
Download `yarr-*-linux64.zip`, unzip it, place `yarr` in `$HOME/.local/bin`
|
||||||
|
and run [the script](etc/install-linux.sh).
|
||||||
|
|
||||||
[macos-open]: https://support.apple.com/en-gb/guide/mac-help/mh40616/mac
|
[macos-open]: https://support.apple.com/en-gb/guide/mac-help/mh40616/mac
|
||||||
|
|
||||||
### windows
|
|
||||||
|
|
||||||
Download `yarr-*-windows64.zip`, unzip it, open `yarr.exe`, click the anchor system tray icon, select "Open".
|
|
||||||
|
|
||||||
### linux
|
|
||||||
|
|
||||||
Download `yarr-*-linux64.zip`, unzip it, place `yarr` in `$HOME/.local/bin`
|
|
||||||
and run [the script](etc/install-linux.sh).
|
|
||||||
|
|
||||||
For self-hosting, see `yarr -h` for auth, tls & server configuration flags.
|
For self-hosting, see `yarr -h` for auth, tls & server configuration flags.
|
||||||
For building from source code, see [build.md](build.md)
|
|
||||||
|
|
||||||
For Fever API support, see [fever.md](fever.md).
|
See more:
|
||||||
|
|
||||||
|
* [Building from source code](doc/build.md)
|
||||||
|
* [Fever API support](doc/fever.md)
|
||||||
|
|
||||||
## credits
|
## credits
|
||||||
|
|
||||||
|
@@ -1,6 +1,3 @@
|
|||||||
//go:build release
|
|
||||||
// +build release
|
|
||||||
|
|
||||||
package assets
|
package assets
|
||||||
|
|
||||||
import "embed"
|
import "embed"
|
||||||
@@ -9,7 +6,6 @@ import "embed"
|
|||||||
//go:embed graphicarts
|
//go:embed graphicarts
|
||||||
//go:embed javascripts
|
//go:embed javascripts
|
||||||
//go:embed stylesheets
|
//go:embed stylesheets
|
||||||
//go:embed manifest.json
|
|
||||||
var embedded embed.FS
|
var embedded embed.FS
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
Before Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 8.3 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 515 B |
Before Width: | Height: | Size: 7.0 KiB |
Before Width: | Height: | Size: 7.6 KiB |
Before Width: | Height: | Size: 8.3 KiB |
Before Width: | Height: | Size: 699 B |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 939 B |
Before Width: | Height: | Size: 1010 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 69 KiB |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 75 KiB |
Before Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 8.0 KiB |
Before Width: | Height: | Size: 8.2 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 602 B |
Before Width: | Height: | Size: 715 B |
Before Width: | Height: | Size: 722 B |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 602 B |
Before Width: | Height: | Size: 715 B |
Before Width: | Height: | Size: 722 B |
Before Width: | Height: | Size: 13 KiB |