mirror of
https://github.com/gen2brain/cbconvert
synced 2026-06-30 09:11:54 +02:00
Compare commits
103 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 903a8bbcfc | |||
| e938b140f0 | |||
| 0a3f4d6992 | |||
| c5902fb131 | |||
| d6ece90041 | |||
| c34b4d0a98 | |||
| f0e2232e51 | |||
| 0ba0337ef8 | |||
| 6e97d977ae | |||
| 685b6bf153 | |||
| 14f2e87525 | |||
| cd2f7501e0 | |||
| 69b0b51010 | |||
| c5494af60b | |||
| f447c618de | |||
| 54261d8528 | |||
| f92125643f | |||
| 7b6c766dcc | |||
| dfea3dc6a3 | |||
| 16d01e292e | |||
| 6fe10f5bdb | |||
| 547a3937a8 | |||
| d47c1c1464 | |||
| 5befff07ae | |||
| d4abc99239 | |||
| f1804ce13c | |||
| a74034d669 | |||
| 64fb152c36 | |||
| 7082e3db90 | |||
| 943cd9bb95 | |||
| ec2c321ff3 | |||
| a0ed277971 | |||
| b5b4457088 | |||
| c24d7b7e18 | |||
| 8ba065e68b | |||
| 9cd5616b48 | |||
| 13a3b6e23e | |||
| 9a047d1977 | |||
| d6e7248112 | |||
| 9eb20db167 | |||
| 04d2dd79d5 | |||
| 2b2788ed6e | |||
| 164e7bfd75 | |||
| 27da60ed76 | |||
| 0963cb1762 | |||
| 443c4e6aaa | |||
| 9da5b97f15 | |||
| adbb86f9f7 | |||
| efb8b776fb | |||
| fa954fce1a | |||
| 7d80f5238e | |||
| 56e07aae23 | |||
| 3c3123a50d | |||
| 2e03350437 | |||
| 1fdc1610f5 | |||
| a5e796d017 | |||
| cffd119eba | |||
| cda03e0122 | |||
| 6a73f6f20e | |||
| 5df10a58ee | |||
| 081736ee04 | |||
| 50f1edb843 | |||
| 2c5bc9e21d | |||
| d9cdf2e197 | |||
| 68e868944b | |||
| 3a84012005 | |||
| 23802d2d00 | |||
| 17e598bb3b | |||
| 2fd32c30e3 | |||
| b930b06a7d | |||
| c8d472e576 | |||
| 6701bfcfb0 | |||
| 6cea1aa441 | |||
| a05b46e6b8 | |||
| d77d2c0ce7 | |||
| bc8520d825 | |||
| 3619ed6c0d | |||
| 28ef6910e4 | |||
| 35b8bc340f | |||
| a5a45306c6 | |||
| b063367110 | |||
| 7831e487e6 | |||
| ce32d48469 | |||
| 4d1e0a44d2 | |||
| 574e364954 | |||
| 97aae5e0c7 | |||
| bbcaf0f9dd | |||
| d70de9f4db | |||
| d7be2f4d5e | |||
| 82e8a6cbac | |||
| 85818eec5f | |||
| 0c6b9fcaa8 | |||
| 55b53efcca | |||
| 4abf99a644 | |||
| ca4f13ebfe | |||
| a4c7b87dc0 | |||
| dd4c3a2dbf | |||
| 8e3f7962d1 | |||
| 1c3421028b | |||
| 5ddb4d92aa | |||
| b1e9763b0b | |||
| 14bfaf7b6e | |||
| 3dcfc1dd5e |
@@ -1,95 +1,191 @@
|
|||||||
CBconvert
|
## CBconvert
|
||||||
=========
|
|
||||||
|
|
||||||
Introduction
|
### Introduction
|
||||||
------------
|
|
||||||
|
|
||||||
CBconvert is a [Comic Book](http://en.wikipedia.org/wiki/Comic_Book_Archive_file) convert tool.
|
CBconvert is a [Comic Book](http://en.wikipedia.org/wiki/Comic_Book_Archive_file) converter.
|
||||||
|
|
||||||
|
It can convert comics to different formats to fit your various devices.
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* reads RAR, ZIP, 7Z, CBR, CBZ, CB7, CBT, PDF, EPUB, MOBI and plain directory
|
||||||
|
* saves processed comics in CBZ (ZIP) archive format or CBT (TAR)
|
||||||
|
* images can be converted to JPEG, PNG, TIFF, WEBP, AVIF, or 4-Bit BMP (16 colors) file format
|
||||||
|
* rotate, flip, adjust brightness/contrast, adjust levels (Photoshop-like) or grayscale images
|
||||||
|
* resize algorithms (NearestNeighbor, Box, Linear, MitchellNetravali, CatmullRom, Gaussian, Lanczos)
|
||||||
|
* export covers from comics
|
||||||
|
* create thumbnails from covers by [FreeDesktop](http://specifications.freedesktop.org/thumbnail-spec/thumbnail-spec-latest.html) specification
|
||||||
|
|
||||||
|
### Download
|
||||||
|
|
||||||
|
* [Windows x86_64](https://github.com/gen2brain/cbconvert/releases/latest/download/cbconvert-0.8.3-windows-x86_64.zip)
|
||||||
|
* [Linux x86_64](https://github.com/gen2brain/cbconvert/releases/latest/download/cbconvert-0.8.3-linux-x86_64.tar.gz)
|
||||||
|
* [Linux aarch64](https://github.com/gen2brain/cbconvert/releases/latest/download/cbconvert-0.8.3-linux-aarch64.tar.gz)
|
||||||
|
* [macOS x86_64](https://github.com/gen2brain/cbconvert/releases/latest/download/cbconvert-0.8.3-darwin-x86_64.zip)
|
||||||
|
* [macOS aarch64](https://github.com/gen2brain/cbconvert/releases/latest/download/cbconvert-0.8.3-darwin-aarch64.zip)
|
||||||
|
|
||||||
|
### Using cbconvert in file managers to generate FreeDesktop thumbnails
|
||||||
|
|
||||||
|
Copy cbconvert cli binary to your PATH and create file ~/.local/share/thumbnailers/cbconvert.thumbnailer:
|
||||||
|
|
||||||
|
```
|
||||||
|
[Thumbnailer Entry]
|
||||||
|
TryExec=cbconvert
|
||||||
|
Exec=cbconvert thumbnail --quiet --width %s --outfile %o %i
|
||||||
|
MimeType=application/pdf;application/x-cb7;application/x-cbt;application/epub+zip;application/vnd.comicbook-rar;application/vnd.comicbook+zip;application/x-mobipocket-ebook;
|
||||||
|
```
|
||||||
|
|
||||||
|
This is what it looks like in the PCManFM file manager:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
Features
|
### Using command line app
|
||||||
--------
|
|
||||||
|
|
||||||
- reads rar, zip, 7z, gz, bz2, cbr, cbz, cb7, cbt, pdf and plain directory
|
```
|
||||||
- always saves processed comic in cbz (zip) format
|
Usage: cbconvert <command> [<flags>] [file1 dir1 ... fileOrDirN]
|
||||||
- images can be converted to JPEG, PNG or 4-Bit BMP (16 colors) format
|
|
||||||
- choose resize algorithm (NearestNeighbor, Bilinear, Bicubic, MitchellNetravali, Lanczos2/3)
|
|
||||||
- export covers from comics
|
|
||||||
- create thumbnails from covers by [freedesktop](http://www.freedesktop.org/wiki/) specification
|
|
||||||
|
|
||||||
Download
|
|
||||||
--------
|
|
||||||
|
|
||||||
- [Windows static build](https://github.com/gen2brain/cbconvert/releases/download/0.1.0/cbconvert-0.1.0.zip)
|
|
||||||
- [Linux 64bit build](https://github.com/gen2brain/cbconvert/releases/download/0.1.0/cbconvert-0.1.0.tar.gz)
|
|
||||||
|
|
||||||
Compile
|
|
||||||
-------
|
|
||||||
|
|
||||||
Install poppler, poppler-glib, cairo and imagemagick dev packages:
|
|
||||||
|
|
||||||
apt-get install libpoppler-glib-dev libcairo2-dev libmagickcore-dev libmagickwand-dev
|
|
||||||
|
|
||||||
Install go package:
|
|
||||||
|
|
||||||
go get github.com/gen2brain/cbconvert
|
|
||||||
go install github.com/gen2brain/cbconvert && cbconvert
|
|
||||||
|
|
||||||
Dependencies
|
|
||||||
------------
|
|
||||||
|
|
||||||
go get github.com/cheggaaa/go-poppler
|
|
||||||
go get github.com/cheggaaa/pb
|
|
||||||
go get github.com/gen2brain/go-unarr
|
|
||||||
go get github.com/gographics/imagick/imagick
|
|
||||||
go get github.com/hotei/bmp
|
|
||||||
go get github.com/nfnt/resize
|
|
||||||
go get github.com/skarademir/naturalsort
|
|
||||||
go get github.com/ungerik/go-cairo
|
|
||||||
go get gopkg.in/alecthomas/kingpin.v2
|
|
||||||
|
|
||||||
Using
|
|
||||||
-----
|
|
||||||
|
|
||||||
usage: cbconvert [<flags>] <args>...
|
|
||||||
|
|
||||||
Comic Book convert tool.
|
|
||||||
|
|
||||||
Flags:
|
|
||||||
--help Show context-sensitive help (also try --help-long and --help-man).
|
|
||||||
--version Show application version.
|
|
||||||
-p, --png encode images to PNG instead of JPEG
|
|
||||||
-b, --bmp encode images to 4-Bit BMP instead of JPEG
|
|
||||||
-w, --width=0 image width
|
|
||||||
-h, --height=0 image height
|
|
||||||
-q, --quality=75 JPEG image quality
|
|
||||||
-n, --norgb do not convert images with RGB colorspace
|
|
||||||
-i, --interpolation=1 0=NearestNeighbor, 1=Bilinear, 2=Bicubic, 3=MitchellNetravali, 4=Lanczos2, 5=Lanczos3
|
|
||||||
-s, --suffix=SUFFIX add suffix to file basename
|
|
||||||
-c, --cover extract cover
|
|
||||||
-t, --thumbnail extract cover thumbnail (freedesktop spec.)
|
|
||||||
-o, --outdir="." output directory
|
|
||||||
-m, --size=0 process only files larger then size (in MB)
|
|
||||||
-r, --recursive process subdirectories recursively
|
|
||||||
-Q, --quiet hide console output
|
|
||||||
|
|
||||||
Args:
|
|
||||||
<args> filename or directory
|
|
||||||
|
|
||||||
|
|
||||||
Examples
|
Commands:
|
||||||
--------
|
|
||||||
|
|
||||||
Rescale images to 1200px for all supported files found in directory with size larger then 60MB:
|
convert
|
||||||
|
Convert archive or document
|
||||||
|
|
||||||
cbconvert --recursive --width 1200 --size 60 /media/comics/Thorgal/
|
--width
|
||||||
|
Image width (default "0")
|
||||||
|
--height
|
||||||
|
Image height (default "0")
|
||||||
|
--fit
|
||||||
|
Best fit for required width and height (default "false")
|
||||||
|
--format
|
||||||
|
Image format, valid values are jpeg, png, tiff, bmp, webp, avif (default "jpeg")
|
||||||
|
--archive
|
||||||
|
Archive format, valid values are zip, tar (default "zip")
|
||||||
|
--quality
|
||||||
|
Image quality (default "75")
|
||||||
|
--lossless
|
||||||
|
Lossless compression (avif) (default "false")
|
||||||
|
--filter
|
||||||
|
0=NearestNeighbor, 1=Box, 2=Linear, 3=MitchellNetravali, 4=CatmullRom, 6=Gaussian, 7=Lanczos (default "2")
|
||||||
|
--no-cover
|
||||||
|
Do not convert the cover image (default "false")
|
||||||
|
--no-rgb
|
||||||
|
Do not convert images that have RGB colorspace (default "false")
|
||||||
|
--no-nonimage
|
||||||
|
Remove non-image files from the archive (default "false")
|
||||||
|
--no-convert
|
||||||
|
Do not transform or convert images (default "false")
|
||||||
|
--grayscale
|
||||||
|
Convert images to grayscale (monochromatic) (default "false")
|
||||||
|
--rotate
|
||||||
|
Rotate images, valid values are 0, 90, 180, 270 (default "0")
|
||||||
|
--flip
|
||||||
|
Flip images, valid values are none, horizontal, vertical (default "none")
|
||||||
|
--brightness
|
||||||
|
Adjust the brightness of the images, must be in the range (-100, 100) (default "0")
|
||||||
|
--contrast
|
||||||
|
Adjust the contrast of the images, must be in the range (-100, 100) (default "0")
|
||||||
|
--suffix
|
||||||
|
Add suffix to file basename (default "")
|
||||||
|
--levels-inmin
|
||||||
|
Shadow input value (default "0")
|
||||||
|
--levels-gamma
|
||||||
|
Midpoint/Gamma (default "1")
|
||||||
|
--levels-inmax
|
||||||
|
Highlight input value (default "255")
|
||||||
|
--levels-outmin
|
||||||
|
Shadow output value (default "0")
|
||||||
|
--levels-outmax
|
||||||
|
Highlight output value (default "255")
|
||||||
|
--outdir
|
||||||
|
Output directory (default ".")
|
||||||
|
--size
|
||||||
|
Process only files larger than size (in MB) (default "0")
|
||||||
|
--recursive
|
||||||
|
Process subdirectories recursively (default "false")
|
||||||
|
--quiet
|
||||||
|
Hide console output (default "false")
|
||||||
|
|
||||||
Convert all images in archive to 4bit BMP image and save result in ~/comics directory:
|
cover
|
||||||
|
Extract cover
|
||||||
|
|
||||||
cbconvert --bmp --outdir ~/comics /media/comics/Garfield/Garfield_01.cbz
|
--width
|
||||||
|
Image width (default "0")
|
||||||
|
--height
|
||||||
|
Image height (default "0")
|
||||||
|
--fit
|
||||||
|
Best fit for required width and height (default "false")
|
||||||
|
--format
|
||||||
|
Image format, valid values are jpeg, png, tiff, bmp, webp, avif (default "jpeg")
|
||||||
|
--quality
|
||||||
|
Image quality (default "75")
|
||||||
|
--filter
|
||||||
|
0=NearestNeighbor, 1=Box, 2=Linear, 3=MitchellNetravali, 4=CatmullRom, 6=Gaussian, 7=Lanczos (default "2")
|
||||||
|
--outdir
|
||||||
|
Output directory (default ".")
|
||||||
|
--size
|
||||||
|
Process only files larger than size (in MB) (default "0")
|
||||||
|
--recursive
|
||||||
|
Process subdirectories recursively (default "false")
|
||||||
|
--quiet
|
||||||
|
Hide console output (default "false")
|
||||||
|
|
||||||
[BMP](http://en.wikipedia.org/wiki/BMP_file_format) format is uncompressed, for black&white pages very good choice. Archive size can be smaller 2-3x and file will be readable by comic readers.
|
thumbnail
|
||||||
|
Extract cover thumbnail (freedesktop spec.)
|
||||||
|
|
||||||
Generate thumbnails by freedesktop specification in ~/.thumbnails/normal directory, Lanczos3 algorithm is used for resizing:
|
--width
|
||||||
|
Image width (default "0")
|
||||||
|
--height
|
||||||
|
Image height (default "0")
|
||||||
|
--fit
|
||||||
|
Best fit for required width and height (default "false")
|
||||||
|
--filter
|
||||||
|
0=NearestNeighbor, 1=Box, 2=Linear, 3=MitchellNetravali, 4=CatmullRom, 6=Gaussian, 7=Lanczos (default "2")
|
||||||
|
--outdir
|
||||||
|
Output directory (default ".")
|
||||||
|
--outfile
|
||||||
|
Output file (default "")
|
||||||
|
--size
|
||||||
|
Process only files larger than size (in MB) (default "0")
|
||||||
|
--recursive
|
||||||
|
Process subdirectories recursively (default "false")
|
||||||
|
--quiet
|
||||||
|
Hide console output (default "false")
|
||||||
|
|
||||||
cbconvert --interpolation=5 --outdir ~/.thumbnails/normal --thumbnail /media/comics/GrooTheWanderer/
|
meta
|
||||||
|
CBZ metadata
|
||||||
|
|
||||||
|
--cover
|
||||||
|
Print cover name (default "false")
|
||||||
|
--comment
|
||||||
|
Print zip comment (default "false")
|
||||||
|
--comment-body
|
||||||
|
Set zip comment (default "")
|
||||||
|
--file-add
|
||||||
|
Add file to archive (default "")
|
||||||
|
--file-remove
|
||||||
|
Remove file(s) from archive (glob pattern, i.e. *.xml) (default "")
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
Rescale images to 1200px for all supported files found in a directory with a size larger than 60MB:
|
||||||
|
|
||||||
|
`cbconvert --recursive --width 1200 --size 60 /media/comics/Thorgal/`
|
||||||
|
|
||||||
|
Convert all images in pdf to 4bit BMP images and save the result in ~/comics directory:
|
||||||
|
|
||||||
|
`cbconvert --bmp --outdir ~/comics /media/comics/Garfield/Garfield_01.pdf`
|
||||||
|
|
||||||
|
[BMP](http://en.wikipedia.org/wiki/BMP_file_format) format is a very good choice for black&white pages. Archive size can be smaller 2-3x and the file will be readable by comic readers.
|
||||||
|
|
||||||
|
Extract covers to ~/covers dir for all supported files found in the directory, Lanczos algorithm is used for resizing:
|
||||||
|
|
||||||
|
`cbconvert cover --outdir ~/covers --filter=7 /media/comics/GrooTheWanderer/`
|
||||||
|
|
||||||
|
### Compile
|
||||||
|
|
||||||
|
Install ImageMagick7 and libheif (with libaom) libraries and headers and then install to GOBIN:
|
||||||
|
|
||||||
|
`go install github.com/gen2brain/cbconvert/cmd/cbconvert@latest`
|
||||||
|
|||||||
+1577
-634
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,29 @@
|
|||||||
|
module github.com/gen2brain/cbconvert/cmd/cbconvert
|
||||||
|
|
||||||
|
go 1.21
|
||||||
|
|
||||||
|
toolchain go1.21.0
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/gen2brain/cbconvert v0.0.0-20230824094314-e938b140f074
|
||||||
|
github.com/schollz/progressbar/v3 v3.10.0
|
||||||
|
github.com/spf13/pflag v1.0.5
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/chai2010/webp v1.1.1 // indirect
|
||||||
|
github.com/disintegration/imaging v1.6.2 // indirect
|
||||||
|
github.com/fvbommel/sortorder v1.1.0 // indirect
|
||||||
|
github.com/gen2brain/go-fitz v1.23.1 // indirect
|
||||||
|
github.com/gen2brain/go-unarr v0.1.7 // indirect
|
||||||
|
github.com/hotei/bmp v0.0.0-20150430041436-f620cebab0c7 // indirect
|
||||||
|
github.com/mattn/go-runewidth v0.0.13 // indirect
|
||||||
|
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect
|
||||||
|
github.com/rivo/uniseg v0.3.4 // indirect
|
||||||
|
github.com/strukturag/libheif v1.15.2 // indirect
|
||||||
|
golang.org/x/image v0.11.0 // indirect
|
||||||
|
golang.org/x/sync v0.3.0 // indirect
|
||||||
|
golang.org/x/sys v0.5.0 // indirect
|
||||||
|
golang.org/x/term v0.5.0 // indirect
|
||||||
|
gopkg.in/gographics/imagick.v3 v3.4.3 // indirect
|
||||||
|
)
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
github.com/chai2010/webp v1.1.1 h1:jTRmEccAJ4MGrhFOrPMpNGIJ/eybIgwKpcACsrTEapk=
|
||||||
|
github.com/chai2010/webp v1.1.1/go.mod h1:0XVwvZWdjjdxpUEIf7b9g9VkHFnInUSYujwqTLEuldU=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c=
|
||||||
|
github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=
|
||||||
|
github.com/fvbommel/sortorder v1.1.0 h1:fUmoe+HLsBTctBDoaBwpQo5N+nrCp8g/BjKb/6ZQmYw=
|
||||||
|
github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
|
||||||
|
github.com/gen2brain/cbconvert v0.0.0-20230824094314-e938b140f074 h1:fUW60MgEEH44Y4ZNpi4Y4GwHeUzNayvJy+bJ5J1QiJI=
|
||||||
|
github.com/gen2brain/cbconvert v0.0.0-20230824094314-e938b140f074/go.mod h1:8eCyHuxeUYNvyYr1nCS+M7zL0fjnb3CO5R5JIOgG4Tk=
|
||||||
|
github.com/gen2brain/go-fitz v1.23.1 h1:x69/szWZXpI3jZ57mMqCg7WqqvtYnQG0lXts3L6M1Fc=
|
||||||
|
github.com/gen2brain/go-fitz v1.23.1/go.mod h1:HU04vc+RisUh/kvEd2pB0LAxmK1oyXdN4ftyshUr9rQ=
|
||||||
|
github.com/gen2brain/go-unarr v0.1.7 h1:mEE7bPShJIsmAX67t6BW2ibpEUO7j5WK152KgNM9NbQ=
|
||||||
|
github.com/gen2brain/go-unarr v0.1.7/go.mod h1:MK9a3hddpaIxjEtrE1f/LA5yJ7gA34cS7Oyr325sY9s=
|
||||||
|
github.com/hotei/bmp v0.0.0-20150430041436-f620cebab0c7 h1:NlUATi3cllRJhpM4mfR9BxiLRXT83bcSLcOa+S8lrME=
|
||||||
|
github.com/hotei/bmp v0.0.0-20150430041436-f620cebab0c7/go.mod h1:Hku3FQ2laCEwSv7Z8YkC0er38jLaUycUCbsFkWMr+z4=
|
||||||
|
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw=
|
||||||
|
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||||
|
github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
|
||||||
|
github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||||
|
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ=
|
||||||
|
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||||
|
github.com/rivo/uniseg v0.3.4 h1:3Z3Eu6FGHZWSfNKJTOUiPatWwfc7DzJRU04jFUqJODw=
|
||||||
|
github.com/rivo/uniseg v0.3.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
||||||
|
github.com/schollz/progressbar/v3 v3.10.0 h1:pOab0roS2jf6zkEBKAe9EyEdmRKJvhbbuxqVp9/Qjyw=
|
||||||
|
github.com/schollz/progressbar/v3 v3.10.0/go.mod h1:0N6zRwbDVLFCFy5chxuukVlRkoHWYFFLzlxQrw/sf3M=
|
||||||
|
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||||
|
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
github.com/strukturag/libheif v1.15.2 h1:pgdcpDHqtLKRXL9ETSTeht0CsJODB3BojpTsb3S/3Wg=
|
||||||
|
github.com/strukturag/libheif v1.15.2/go.mod h1:E/PNRlmVtrtj9j2AvBZlrO4dsBDu6KfwDZn7X1Ce8Ks=
|
||||||
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
|
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
|
golang.org/x/image v0.11.0 h1:ds2RoQvBvYTiJkwpSFDwCcDFNX7DqjL2WsUgTNk0Ooo=
|
||||||
|
golang.org/x/image v0.11.0/go.mod h1:bglhjqbqVuEb9e9+eNR45Jfu7D+T4Qan+NhQk8Ck2P8=
|
||||||
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
|
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
|
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
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/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
|
||||||
|
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
||||||
|
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.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
|
||||||
|
golang.org/x/sys v0.5.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.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
|
golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY=
|
||||||
|
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||||
|
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.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||||
|
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=
|
||||||
|
gopkg.in/gographics/imagick.v3 v3.4.3 h1:9plKFE/Us913jBN6KohtLG9FNW8LPvfpjiGAORIiEHg=
|
||||||
|
gopkg.in/gographics/imagick.v3 v3.4.3/go.mod h1:+Q9nyA2xRZXrDyTtJ/eko+8V/5E7bWYs08ndkZp8UmA=
|
||||||
@@ -0,0 +1,301 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"path/filepath"
|
||||||
|
"syscall"
|
||||||
|
|
||||||
|
"github.com/gen2brain/cbconvert"
|
||||||
|
pb "github.com/schollz/progressbar/v3"
|
||||||
|
flag "github.com/spf13/pflag"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
opts, args := parseFlags()
|
||||||
|
conv := cbconvert.New(opts)
|
||||||
|
|
||||||
|
c := make(chan os.Signal, 2)
|
||||||
|
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
|
||||||
|
go func() {
|
||||||
|
for range c {
|
||||||
|
fmt.Println("\naborting")
|
||||||
|
if err := os.RemoveAll(conv.Workdir); err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
if _, err := os.Stat(opts.Outdir); err != nil {
|
||||||
|
if err := os.MkdirAll(opts.Outdir, 0775); err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
conv.Initialize()
|
||||||
|
defer conv.Terminate()
|
||||||
|
|
||||||
|
files, err := conv.Files(args)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
var bar *pb.ProgressBar
|
||||||
|
if opts.Cover || opts.Thumbnail || opts.Meta {
|
||||||
|
if !opts.Quiet {
|
||||||
|
bar = pb.NewOptions(conv.Nfiles,
|
||||||
|
pb.OptionShowCount(),
|
||||||
|
pb.OptionClearOnFinish(),
|
||||||
|
pb.OptionUseANSICodes(true),
|
||||||
|
pb.OptionSetPredictTime(false),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
conv.OnStart = func() {
|
||||||
|
if !opts.Quiet {
|
||||||
|
bar = pb.NewOptions(conv.Ncontents,
|
||||||
|
pb.OptionShowCount(),
|
||||||
|
pb.OptionClearOnFinish(),
|
||||||
|
pb.OptionUseANSICodes(true),
|
||||||
|
pb.OptionSetDescription(fmt.Sprintf("Converting %d of %d:", conv.CurrFile, conv.Nfiles)),
|
||||||
|
pb.OptionSetPredictTime(false),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
conv.OnProgress = func() {
|
||||||
|
if !opts.Quiet {
|
||||||
|
_ = bar.Add(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
conv.OnCompress = func() {
|
||||||
|
if !opts.Quiet {
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "Compressing %d of %d...\r", conv.CurrFile, conv.Nfiles)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, file := range files {
|
||||||
|
stat, err := os.Stat(file)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case opts.Meta:
|
||||||
|
ret, err := conv.Meta(file)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
if opts.Cover {
|
||||||
|
fmt.Println(ret)
|
||||||
|
} else if opts.Comment {
|
||||||
|
fmt.Println(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
continue
|
||||||
|
case opts.Cover:
|
||||||
|
if err := conv.Cover(file, stat); err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
continue
|
||||||
|
case opts.Thumbnail:
|
||||||
|
if err = conv.Thumbnail(file, stat); err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := conv.Convert(file, stat); err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "\r")
|
||||||
|
}
|
||||||
|
|
||||||
|
// parseFlags parses command line flags.
|
||||||
|
func parseFlags() (cbconvert.Options, []string) {
|
||||||
|
opts := cbconvert.Options{}
|
||||||
|
var args []string
|
||||||
|
|
||||||
|
convert := flag.NewFlagSet("convert", flag.ExitOnError)
|
||||||
|
convert.SortFlags = false
|
||||||
|
convert.IntVar(&opts.Width, "width", 0, "Image width")
|
||||||
|
convert.IntVar(&opts.Height, "height", 0, "Image height")
|
||||||
|
convert.BoolVar(&opts.Fit, "fit", false, "Best fit for required width and height")
|
||||||
|
convert.StringVar(&opts.Format, "format", "jpeg", "Image format, valid values are jpeg, png, tiff, bmp, webp, avif")
|
||||||
|
convert.StringVar(&opts.Archive, "archive", "zip", "Archive format, valid values are zip, tar")
|
||||||
|
convert.IntVar(&opts.Quality, "quality", 75, "Image quality")
|
||||||
|
convert.BoolVar(&opts.Lossless, "lossless", false, "Lossless compression (avif)")
|
||||||
|
convert.IntVar(&opts.Filter, "filter", 2, "0=NearestNeighbor, 1=Box, 2=Linear, 3=MitchellNetravali, 4=CatmullRom, 6=Gaussian, 7=Lanczos")
|
||||||
|
convert.BoolVar(&opts.NoCover, "no-cover", false, "Do not convert the cover image")
|
||||||
|
convert.BoolVar(&opts.NoRGB, "no-rgb", false, "Do not convert images that have RGB colorspace")
|
||||||
|
convert.BoolVar(&opts.NoNonImage, "no-nonimage", false, "Remove non-image files from the archive")
|
||||||
|
convert.BoolVar(&opts.NoConvert, "no-convert", false, "Do not transform or convert images")
|
||||||
|
convert.BoolVar(&opts.Grayscale, "grayscale", false, "Convert images to grayscale (monochromatic)")
|
||||||
|
convert.IntVar(&opts.Rotate, "rotate", 0, "Rotate images, valid values are 0, 90, 180, 270")
|
||||||
|
convert.StringVar(&opts.Flip, "flip", "none", "Flip images, valid values are none, horizontal, vertical")
|
||||||
|
convert.Float64Var(&opts.Brightness, "brightness", 0, "Adjust the brightness of the images, must be in the range (-100, 100)")
|
||||||
|
convert.Float64Var(&opts.Contrast, "contrast", 0, "Adjust the contrast of the images, must be in the range (-100, 100)")
|
||||||
|
convert.StringVar(&opts.Suffix, "suffix", "", "Add suffix to file basename")
|
||||||
|
convert.Float64Var(&opts.LevelsInMin, "levels-inmin", 0, "Shadow input value")
|
||||||
|
convert.Float64Var(&opts.LevelsGamma, "levels-gamma", 1.0, "Midpoint/Gamma")
|
||||||
|
convert.Float64Var(&opts.LevelsInMax, "levels-inmax", 255, "Highlight input value")
|
||||||
|
convert.Float64Var(&opts.LevelsOutMin, "levels-outmin", 0, "Shadow output value")
|
||||||
|
convert.Float64Var(&opts.LevelsOutMax, "levels-outmax", 255, "Highlight output value")
|
||||||
|
convert.StringVar(&opts.Outdir, "outdir", ".", "Output directory")
|
||||||
|
convert.Int64Var(&opts.Size, "size", 0, "Process only files larger than size (in MB)")
|
||||||
|
convert.BoolVar(&opts.Recursive, "recursive", false, "Process subdirectories recursively")
|
||||||
|
convert.BoolVar(&opts.Quiet, "quiet", false, "Hide console output")
|
||||||
|
|
||||||
|
cover := flag.NewFlagSet("cover", flag.ExitOnError)
|
||||||
|
cover.SortFlags = false
|
||||||
|
cover.IntVar(&opts.Width, "width", 0, "Image width")
|
||||||
|
cover.IntVar(&opts.Height, "height", 0, "Image height")
|
||||||
|
cover.BoolVar(&opts.Fit, "fit", false, "Best fit for required width and height")
|
||||||
|
cover.StringVar(&opts.Format, "format", "jpeg", "Image format, valid values are jpeg, png, tiff, bmp, webp, avif")
|
||||||
|
cover.IntVar(&opts.Quality, "quality", 75, "Image quality")
|
||||||
|
cover.IntVar(&opts.Filter, "filter", 2, "0=NearestNeighbor, 1=Box, 2=Linear, 3=MitchellNetravali, 4=CatmullRom, 6=Gaussian, 7=Lanczos")
|
||||||
|
cover.StringVar(&opts.Outdir, "outdir", ".", "Output directory")
|
||||||
|
cover.Int64Var(&opts.Size, "size", 0, "Process only files larger than size (in MB)")
|
||||||
|
cover.BoolVar(&opts.Recursive, "recursive", false, "Process subdirectories recursively")
|
||||||
|
cover.BoolVar(&opts.Quiet, "quiet", false, "Hide console output")
|
||||||
|
|
||||||
|
thumbnail := flag.NewFlagSet("thumbnail", flag.ExitOnError)
|
||||||
|
thumbnail.SortFlags = false
|
||||||
|
thumbnail.IntVar(&opts.Width, "width", 0, "Image width")
|
||||||
|
thumbnail.IntVar(&opts.Height, "height", 0, "Image height")
|
||||||
|
thumbnail.BoolVar(&opts.Fit, "fit", false, "Best fit for required width and height")
|
||||||
|
thumbnail.IntVar(&opts.Filter, "filter", 2, "0=NearestNeighbor, 1=Box, 2=Linear, 3=MitchellNetravali, 4=CatmullRom, 6=Gaussian, 7=Lanczos")
|
||||||
|
thumbnail.StringVar(&opts.Outdir, "outdir", ".", "Output directory")
|
||||||
|
thumbnail.StringVar(&opts.Outfile, "outfile", "", "Output file")
|
||||||
|
thumbnail.Int64Var(&opts.Size, "size", 0, "Process only files larger than size (in MB)")
|
||||||
|
thumbnail.BoolVar(&opts.Recursive, "recursive", false, "Process subdirectories recursively")
|
||||||
|
thumbnail.BoolVar(&opts.Quiet, "quiet", false, "Hide console output")
|
||||||
|
|
||||||
|
meta := flag.NewFlagSet("meta", flag.ExitOnError)
|
||||||
|
meta.SortFlags = false
|
||||||
|
meta.BoolVar(&opts.Cover, "cover", false, "Print cover name")
|
||||||
|
meta.BoolVar(&opts.Comment, "comment", false, "Print zip comment")
|
||||||
|
meta.StringVar(&opts.CommentBody, "comment-body", "", "Set zip comment")
|
||||||
|
meta.StringVar(&opts.FileAdd, "file-add", "", "Add file to archive")
|
||||||
|
meta.StringVar(&opts.FileRemove, "file-remove", "", "Remove file from archive (glob pattern, i.e. *.xml)")
|
||||||
|
|
||||||
|
convert.Usage = func() {
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "Usage: %s <command> [<flags>] [file1 dir1 ... fileOrDirN]\n\n", filepath.Base(os.Args[0]))
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "\nCommands:\n")
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "\n convert\n \tConvert archive or document\n\n")
|
||||||
|
convert.VisitAll(func(f *flag.Flag) {
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, " --%s", f.Name)
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "\n \t")
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "%v (default %q)\n", f.Usage, f.DefValue)
|
||||||
|
})
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "\n cover\n \tExtract cover\n\n")
|
||||||
|
cover.VisitAll(func(f *flag.Flag) {
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, " --%s", f.Name)
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "\n \t")
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "%v (default %q)\n", f.Usage, f.DefValue)
|
||||||
|
})
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "\n thumbnail\n \tExtract cover thumbnail (freedesktop spec.)\n\n")
|
||||||
|
thumbnail.VisitAll(func(f *flag.Flag) {
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, " --%s", f.Name)
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "\n \t")
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "%v (default %q)\n", f.Usage, f.DefValue)
|
||||||
|
})
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "\n meta\n \tCBZ metadata\n\n")
|
||||||
|
meta.VisitAll(func(f *flag.Flag) {
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, " --%s", f.Name)
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "\n \t")
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "%v (default %q)\n", f.Usage, f.DefValue)
|
||||||
|
})
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(os.Args) < 2 {
|
||||||
|
convert.Usage()
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "no command\n")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
pipe := piped()
|
||||||
|
if pipe {
|
||||||
|
args = lines(os.Stdin)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch os.Args[1] {
|
||||||
|
case "convert":
|
||||||
|
_ = convert.Parse(os.Args[2:])
|
||||||
|
if !pipe {
|
||||||
|
args = convert.Args()
|
||||||
|
}
|
||||||
|
case "cover":
|
||||||
|
opts.Cover = true
|
||||||
|
_ = cover.Parse(os.Args[2:])
|
||||||
|
if !pipe {
|
||||||
|
args = cover.Args()
|
||||||
|
}
|
||||||
|
case "thumbnail":
|
||||||
|
opts.Thumbnail = true
|
||||||
|
_ = thumbnail.Parse(os.Args[2:])
|
||||||
|
if !pipe {
|
||||||
|
args = thumbnail.Args()
|
||||||
|
}
|
||||||
|
case "meta":
|
||||||
|
opts.Meta = true
|
||||||
|
_ = meta.Parse(os.Args[2:])
|
||||||
|
if !pipe {
|
||||||
|
args = meta.Args()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(args) == 0 {
|
||||||
|
convert.Usage()
|
||||||
|
_, _ = fmt.Fprintf(os.Stderr, "no arguments\n")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
return opts, args
|
||||||
|
}
|
||||||
|
|
||||||
|
// piped checks if we have a piped stdin.
|
||||||
|
func piped() bool {
|
||||||
|
f, err := os.Stdin.Stat()
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if f.Mode()&os.ModeNamedPipe == 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// lines returns slice of lines from reader.
|
||||||
|
func lines(r io.Reader) []string {
|
||||||
|
data := make([]string, 0)
|
||||||
|
scanner := bufio.NewScanner(r)
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
text := scanner.Text()
|
||||||
|
data = append(data, text)
|
||||||
|
}
|
||||||
|
|
||||||
|
return data
|
||||||
|
}
|
||||||
Executable
+86
@@ -0,0 +1,86 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
GLIBC_x86_64="/usr/x86_64-pc-linux-gnu-static"
|
||||||
|
MUSL_x86_64="/usr/x86_64-pc-linux-musl"
|
||||||
|
MUSL_aarch64="/usr/aarch64-pc-linux-musl"
|
||||||
|
MINGW_x86_64="/usr/x86_64-w64-mingw32"
|
||||||
|
MACOS_x86_64="/usr/x86_64-apple-darwin"
|
||||||
|
MACOS_aarch64="/usr/aarch64-apple-darwin"
|
||||||
|
|
||||||
|
VERSION="`git --git-dir ../../.git describe --tags --abbrev=0 2>/dev/null || echo '0.0.0'`"
|
||||||
|
|
||||||
|
BUILDDIR="cbconvert-${VERSION}"; mkdir -p ${BUILDDIR}
|
||||||
|
CC=x86_64-pc-linux-gnu-gcc \
|
||||||
|
PKG_CONFIG="x86_64-pc-linux-gnu-pkg-config" \
|
||||||
|
PKG_CONFIG_PATH="$GLIBC_x86_64/usr/lib64/pkgconfig" \
|
||||||
|
PKG_CONFIG_LIBDIR="$GLIBC_x86_64/usr/lib64/pkgconfig" \
|
||||||
|
CGO_CFLAGS="-I$GLIBC_x86_64/usr/include" \
|
||||||
|
CGO_LDFLAGS="-L$GLIBC_x86_64/usr/lib64" \
|
||||||
|
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 \
|
||||||
|
go build -trimpath -tags 'extlib pkgconfig' -v -o ${BUILDDIR}/cbconvert -ldflags "-linkmode external -s -w '-extldflags=-static'" && \
|
||||||
|
cp ../../README.md ../../AUTHORS ../../COPYING ${BUILDDIR} && tar -czf "${BUILDDIR}-linux-x86_64.tar.gz" ${BUILDDIR}
|
||||||
|
rm -rf ${BUILDDIR}
|
||||||
|
|
||||||
|
#BUILDDIR="cbconvert-${VERSION}"; mkdir -p ${BUILDDIR}
|
||||||
|
#CC=x86_64-pc-linux-musl-gcc \
|
||||||
|
#PKG_CONFIG="x86_64-pc-linux-musl-pkg-config" \
|
||||||
|
#PKG_CONFIG_PATH="$MUSL_x86_64/usr/lib/pkgconfig" \
|
||||||
|
#PKG_CONFIG_LIBDIR="$MUSL_x86_64/usr/lib/pkgconfig" \
|
||||||
|
#CGO_CFLAGS="-I$MUSL_x86_64/usr/include" \
|
||||||
|
#CGO_LDFLAGS="-L$MUSL_x86_64/usr/lib" \
|
||||||
|
#CGO_ENABLED=1 GOOS=linux GOARCH=amd64 \
|
||||||
|
#go build -trimpath -tags 'extlib pkgconfig' -v -o ${BUILDDIR}/cbconvert -ldflags "-linkmode external -s -w '-extldflags=-static'" && \
|
||||||
|
#cp ../../README.md ../../AUTHORS ../../COPYING ${BUILDDIR} && tar -czf "${BUILDDIR}-linux-x86_64.tar.gz" ${BUILDDIR}
|
||||||
|
#rm -rf ${BUILDDIR}
|
||||||
|
|
||||||
|
BUILDDIR="cbconvert-${VERSION}"; mkdir -p ${BUILDDIR}
|
||||||
|
CC=aarch64-pc-linux-musl-gcc \
|
||||||
|
PKG_CONFIG="aarch64-pc-linux-musl-pkg-config" \
|
||||||
|
PKG_CONFIG_PATH="$MUSL_aarch64/usr/lib/pkgconfig" \
|
||||||
|
PKG_CONFIG_LIBDIR="$MUSL_aarch64/usr/lib/pkgconfig" \
|
||||||
|
CGO_CFLAGS="-I$MUSL_aarch64/usr/include" \
|
||||||
|
CGO_LDFLAGS="-L$MUSL_aarch64/usr/lib" \
|
||||||
|
CGO_ENABLED=1 GOOS=linux GOARCH=arm64 \
|
||||||
|
go build -trimpath -tags 'extlib pkgconfig' -v -o ${BUILDDIR}/cbconvert -ldflags "-linkmode external -s -w '-extldflags=-static'" && \
|
||||||
|
cp ../../README.md ../../AUTHORS ../../COPYING ${BUILDDIR} && tar -czf "${BUILDDIR}-linux-aarch64.tar.gz" ${BUILDDIR}
|
||||||
|
rm -rf ${BUILDDIR}
|
||||||
|
|
||||||
|
BUILDDIR="cbconvert-${VERSION}"; mkdir -p ${BUILDDIR}
|
||||||
|
CC=x86_64-w64-mingw32-gcc \
|
||||||
|
PKG_CONFIG="/usr/bin/x86_64-w64-mingw32-pkg-config" \
|
||||||
|
PKG_CONFIG_PATH="$MINGW_x86_64/usr/lib/pkgconfig" \
|
||||||
|
PKG_CONFIG_LIBDIR="$MINGW_x86_64/usr/lib/pkgconfig" \
|
||||||
|
CGO_CFLAGS="-I$MINGW_x86_64/usr/include" \
|
||||||
|
CGO_LDFLAGS="-L$MINGW_x86_64/usr/lib" \
|
||||||
|
CGO_ENABLED=1 GOOS=windows GOARCH=amd64 \
|
||||||
|
go build -trimpath -tags 'extlib pkgconfig' -v -o ${BUILDDIR}/cbconvert.exe -ldflags "-s -w '-extldflags=-static -Wl,--allow-multiple-definition'" && \
|
||||||
|
cp ../../README.md ../../AUTHORS ../../COPYING ${BUILDDIR} && zip -rq "${BUILDDIR}-windows-x86_64.zip" ${BUILDDIR}
|
||||||
|
rm -rf ${BUILDDIR}
|
||||||
|
|
||||||
|
export OSXCROSS_PKG_CONFIG_USE_NATIVE_VARIABLES=1
|
||||||
|
BUILDDIR="cbconvert-${VERSION}"; mkdir -p ${BUILDDIR}
|
||||||
|
PATH=${PATH}:${MACOS_x86_64}/bin \
|
||||||
|
CC=x86_64-apple-darwin21.1-clang \
|
||||||
|
PKG_CONFIG="x86_64-apple-darwin21.1-pkg-config" \
|
||||||
|
PKG_CONFIG_PATH="$MACOS_x86_64/SDK/MacOSX12.1.sdk/usr/lib/pkgconfig" \
|
||||||
|
PKG_CONFIG_LIBDIR="$MACOS_x86_64/SDK/MacOSX12.1.sdk/usr/lib/pkgconfig" \
|
||||||
|
CGO_CFLAGS="-I$MACOS_x86_64/usr/include -I$MACOS_x86_64/macports/pkgs/opt/local/include" \
|
||||||
|
CGO_LDFLAGS="-L$MACOS_x86_64/SDK/MacOSX12.1.sdk/usr/lib -L$MACOS_x86_64/macports/pkgs/opt/local/lib -mmacosx-version-min=10.13" \
|
||||||
|
CGO_ENABLED=1 GOOS=darwin GOARCH=amd64 \
|
||||||
|
go build -trimpath -tags 'extlib pkgconfig' -v -o ${BUILDDIR}/cbconvert -ldflags "-linkmode external -s -w" && \
|
||||||
|
cp ../../README.md ../../AUTHORS ../../COPYING ${BUILDDIR} && zip -rq "${BUILDDIR}-darwin-x86_64.zip" ${BUILDDIR}
|
||||||
|
rm -rf ${BUILDDIR}
|
||||||
|
|
||||||
|
export OSXCROSS_PKG_CONFIG_USE_NATIVE_VARIABLES=1
|
||||||
|
BUILDDIR="cbconvert-${VERSION}"; mkdir -p ${BUILDDIR}
|
||||||
|
PATH=${PATH}:${MACOS_aarch64}/bin \
|
||||||
|
CC=aarch64-apple-darwin21.1-clang \
|
||||||
|
PKG_CONFIG="aarch64-apple-darwin21.1-pkg-config" \
|
||||||
|
PKG_CONFIG_PATH="$MACOS_aarch64/SDK/MacOSX12.1.sdk/usr/lib/pkgconfig" \
|
||||||
|
PKG_CONFIG_LIBDIR="$MACOS_aarch64/SDK/MacOSX12.1.sdk/usr/lib/pkgconfig" \
|
||||||
|
CGO_CFLAGS="-I$MACOS_aarch64/usr/include -I$MACOS_aarch64/macports/pkgs/opt/local/include" \
|
||||||
|
CGO_LDFLAGS="-L$MACOS_aarch64/SDK/MacOSX12.1.sdk/usr/lib -L$MACOS_aarch64/macports/pkgs/opt/local/lib -mmacosx-version-min=10.13" \
|
||||||
|
CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 \
|
||||||
|
go build -trimpath -tags 'extlib pkgconfig' -v -o ${BUILDDIR}/cbconvert -ldflags "-linkmode external -s -w" && \
|
||||||
|
cp ../../README.md ../../AUTHORS ../../COPYING ${BUILDDIR} && zip -rq "${BUILDDIR}-darwin-aarch64.zip" ${BUILDDIR}
|
||||||
|
rm -rf ${BUILDDIR}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
module github.com/gen2brain/cbconvert
|
||||||
|
|
||||||
|
go 1.21
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/chai2010/webp v1.1.1
|
||||||
|
github.com/disintegration/imaging v1.6.2
|
||||||
|
github.com/fvbommel/sortorder v1.1.0
|
||||||
|
github.com/gen2brain/go-fitz v1.23.1
|
||||||
|
github.com/gen2brain/go-unarr v0.1.7
|
||||||
|
github.com/hotei/bmp v0.0.0-20150430041436-f620cebab0c7
|
||||||
|
github.com/strukturag/libheif v1.15.2
|
||||||
|
golang.org/x/image v0.11.0
|
||||||
|
golang.org/x/sync v0.3.0
|
||||||
|
gopkg.in/gographics/imagick.v3 v3.4.3
|
||||||
|
)
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
github.com/chai2010/webp v1.1.1 h1:jTRmEccAJ4MGrhFOrPMpNGIJ/eybIgwKpcACsrTEapk=
|
||||||
|
github.com/chai2010/webp v1.1.1/go.mod h1:0XVwvZWdjjdxpUEIf7b9g9VkHFnInUSYujwqTLEuldU=
|
||||||
|
github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c=
|
||||||
|
github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=
|
||||||
|
github.com/fvbommel/sortorder v1.1.0 h1:fUmoe+HLsBTctBDoaBwpQo5N+nrCp8g/BjKb/6ZQmYw=
|
||||||
|
github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
|
||||||
|
github.com/gen2brain/go-fitz v1.23.1 h1:x69/szWZXpI3jZ57mMqCg7WqqvtYnQG0lXts3L6M1Fc=
|
||||||
|
github.com/gen2brain/go-fitz v1.23.1/go.mod h1:HU04vc+RisUh/kvEd2pB0LAxmK1oyXdN4ftyshUr9rQ=
|
||||||
|
github.com/gen2brain/go-unarr v0.1.7 h1:mEE7bPShJIsmAX67t6BW2ibpEUO7j5WK152KgNM9NbQ=
|
||||||
|
github.com/gen2brain/go-unarr v0.1.7/go.mod h1:MK9a3hddpaIxjEtrE1f/LA5yJ7gA34cS7Oyr325sY9s=
|
||||||
|
github.com/hotei/bmp v0.0.0-20150430041436-f620cebab0c7 h1:NlUATi3cllRJhpM4mfR9BxiLRXT83bcSLcOa+S8lrME=
|
||||||
|
github.com/hotei/bmp v0.0.0-20150430041436-f620cebab0c7/go.mod h1:Hku3FQ2laCEwSv7Z8YkC0er38jLaUycUCbsFkWMr+z4=
|
||||||
|
github.com/strukturag/libheif v1.15.2 h1:pgdcpDHqtLKRXL9ETSTeht0CsJODB3BojpTsb3S/3Wg=
|
||||||
|
github.com/strukturag/libheif v1.15.2/go.mod h1:E/PNRlmVtrtj9j2AvBZlrO4dsBDu6KfwDZn7X1Ce8Ks=
|
||||||
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
|
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
|
golang.org/x/image v0.11.0 h1:ds2RoQvBvYTiJkwpSFDwCcDFNX7DqjL2WsUgTNk0Ooo=
|
||||||
|
golang.org/x/image v0.11.0/go.mod h1:bglhjqbqVuEb9e9+eNR45Jfu7D+T4Qan+NhQk8Ck2P8=
|
||||||
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
|
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
|
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
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/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
|
||||||
|
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
||||||
|
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/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/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.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||||
|
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=
|
||||||
|
gopkg.in/gographics/imagick.v3 v3.4.3 h1:9plKFE/Us913jBN6KohtLG9FNW8LPvfpjiGAORIiEHg=
|
||||||
|
gopkg.in/gographics/imagick.v3 v3.4.3/go.mod h1:+Q9nyA2xRZXrDyTtJ/eko+8V/5E7bWYs08ndkZp8UmA=
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
mkdir -p build
|
|
||||||
|
|
||||||
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o build/cbconvert
|
|
||||||
strip build/cbconvert
|
|
||||||
|
|
||||||
CGO_LDFLAGS="-L/usr/i686-pc-mingw32/usr/lib" \
|
|
||||||
CGO_CFLAGS="-I/usr/i686-pc-mingw32/usr/include -I/usr/i686-pc-mingw32/usr/include/poppler/glib -I/usr/i686-pc-mingw32/usr/include/glib-2.0 -I/usr/i686-pc-mingw32/usr/include/cairo" \
|
|
||||||
CGO_CXXFLAGS="-I/usr/i686-pc-mingw32/usr/include -I/usr/i686-pc-mingw32/usr/include/poppler/glib -I/usr/i686-pc-mingw32/usr/include/glib-2.0 -I/usr/i686-pc-mingw32/usr/include/cairo" \
|
|
||||||
CGO_CPPFLAGS="-I/usr/i686-pc-mingw32/usr/include -I/usr/i686-pc-mingw32/usr/include/poppler/glib -I/usr/i686-pc-mingw32/usr/include/glib-2.0 -I/usr/i686-pc-mingw32/usr/include/cairo" \
|
|
||||||
PKG_CONFIG=/usr/bin/i686-pc-mingw32-pkg-config \
|
|
||||||
PKG_CONFIG_PATH=/usr/i686-pc-mingw32/usr/lib/pkgconfig \
|
|
||||||
PKG_CONFIG_LIBDIR=/usr/i686-pc-mingw32/usr/lib/pkgconfig \
|
|
||||||
CC="i686-pc-mingw32-gcc" CXX="i686-pc-mingw32-g++" \
|
|
||||||
CC_FOR_TARGET=i686-pc-mingw32-gcc CXX_FOR_TARGET=i686-pc-mingw32-g++ \
|
|
||||||
CGO_ENABLED=1 GOOS=windows GOARCH=386 go build -x -work -o build/cbconvert.exe -ldflags "-linkmode external -extldflags -static"
|
|
||||||
i686-pc-mingw32-strip build/cbconvert.exe
|
|
||||||
Reference in New Issue
Block a user