Compare commits

..

2 Commits

Author SHA1 Message Date
T.v.Dein
450d44d129 Dev (#8)
* fixed conf parsing: variables can now be omitted from the config
* fix newlines: use CRLF on windows
* bump version

---------

Co-authored-by: Thomas von Dein <tom@vondein.org>
2023-12-18 20:18:37 +01:00
T.v.Dein
18f7e0fe49 added proper install instructions (#7)
Co-authored-by: Thomas von Dein <tom@vondein.org>
2023-12-18 09:48:00 +01:00
4 changed files with 65 additions and 16 deletions

View File

@@ -15,13 +15,51 @@ directory, each ad into its own subdirectory. The backup will contain
a textfile `Adlisting.txt` which contains the ad contents as the a textfile `Adlisting.txt` which contains the ad contents as the
title, body, price etc. All images will be downloaded as well. title, body, price etc. All images will be downloaded as well.
## Installation
The tool doesn't need authentication and doesn't have any The tool doesn't need authentication and doesn't have any
dependencies. Just download the binary for your platform from the dependencies. Just download the binary for your platform from the
releases page and you're good to go. releases page and you're good to go.
The releases also include a handy tarball which you can use to install ### Installation using a pre-compiled binary
the tool system-wide including the manual page. Just extract it and
type: `make install`. Go to the [latest release
page](https://github.com/TLINDEN/kleingebaeck/releases/latest) and
look for your OS and platform. There are two options to install the binary:
1. Directly download the binary for your platoform,
e.g. `kleingebaeck-linux-amd64-0.0.5`, rename it to `kleingebaeck`
(or whatever you like more!) and put it into your bin dir
(e.g. `$HOME/bin` or as root to `/usr/local/bin`).
Be sure to verify the signature of the binary file. For this also download the matching `kleingebaeck-linux-amd64-0.0.5.sha256` file and:
```shell
cat kleingebaeck-linux-amd64-0.0.5.sha25 && sha256sum kleingebaeck-linux-amd64-0.0.5
```
You should see the same SHA256 hash.
2. You may also download a binary tarball for your platform,
e.g. `kleingebaeck-linux-amd64-0.0.5.tar.gz`, unpack and install
it. GNU Make is required for this:
```shell
tar xvfz kleingebaeck-linux-amd64-0.0.5.tar.gz
cd kleingebaeck-linux-amd64-0.0.5
sudo make install
```
### Installation from source
You will need the Golang toolchain in order to build from source. GNU
Make will also help but is not strictly neccessary.
If you want to compile the tool yourself, use `git clone` to clone the
repository. Then execute `go mod tidy` to install all
dependencies. Then just enter `go build` or - if you have GNU Make
installed - `make`.
To install after building either copy the binary or execute `sudo make install`.
## Commandline options: ## Commandline options:

View File

@@ -23,21 +23,23 @@ import (
) )
const ( const (
VERSION string = "0.0.5" VERSION string = "0.0.6"
Baseuri string = "https://www.kleinanzeigen.de" Baseuri string = "https://www.kleinanzeigen.de"
Listuri string = "/s-bestandsliste.html" Listuri string = "/s-bestandsliste.html"
Defaultdir string = "." Defaultdir string = "."
DefaultTemplate string = "Title: {{.Title}}\nPrice: {{.Price}}\nId: {{.Id}}\n" + DefaultTemplate string = "Title: {{.Title}}\nPrice: {{.Price}}\nId: {{.Id}}\n" +
"Category: {{.Category}}\nCondition: {{.Condition}}\nCreated: {{.Created}}\n\n{{.Text}}\n" "Category: {{.Category}}\nCondition: {{.Condition}}\nCreated: {{.Created}}\n\n{{.Text}}\n"
DefaultTemplateWin string = "Title: {{.Title}}\r\nPrice: {{.Price}}\r\nId: {{.Id}}\r\n" +
"Category: {{.Category}}\r\nCondition: {{.Condition}}\r\nCreated: {{.Created}}\r\n\r\n{{.Text}}\r\n"
Useragent string = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + Useragent string = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " +
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
) )
type Config struct { type Config struct {
Verbose bool `hcl:"verbose"` Verbose *bool `hcl:"verbose"`
User int `hcl:"user"` User *int `hcl:"user"`
Outdir string `hcl:"outdir"` Outdir *string `hcl:"outdir"`
Template string `hcl:"template"` Template *string `hcl:"template"`
} }
func ParseConfigfile(file string) (*Config, error) { func ParseConfigfile(file string) (*Config, error) {

18
main.go
View File

@@ -22,6 +22,7 @@ import (
"fmt" "fmt"
"log/slog" "log/slog"
"os" "os"
"runtime"
"runtime/debug" "runtime/debug"
"github.com/lmittmann/tint" "github.com/lmittmann/tint"
@@ -109,7 +110,7 @@ func Main() int {
return Die(err) return Die(err)
} }
if enableverbose || conf.Verbose { if enableverbose || *conf.Verbose {
logLevel.Set(slog.LevelInfo) logLevel.Set(slog.LevelInfo)
} }
@@ -135,8 +136,8 @@ func Main() int {
slog.Debug("config", "conf", conf) slog.Debug("config", "conf", conf)
if len(dir) == 0 { if len(dir) == 0 {
if len(conf.Outdir) > 0 { if len(*conf.Outdir) > 0 {
dir = conf.Outdir dir = *conf.Outdir
} else { } else {
dir = Defaultdir dir = Defaultdir
} }
@@ -150,8 +151,11 @@ func Main() int {
// which template to use // which template to use
template := DefaultTemplate template := DefaultTemplate
if len(conf.Template) > 0 { if runtime.GOOS == "windows" {
template = conf.Template template = DefaultTemplateWin
}
if len(*conf.Template) > 0 {
template = *conf.Template
} }
// directly backup ad listing[s] // directly backup ad listing[s]
@@ -167,8 +171,8 @@ func Main() int {
} }
// backup all ads of the given user (via config or cmdline) // backup all ads of the given user (via config or cmdline)
if uid == 0 && conf.User > 0 { if uid == 0 && *conf.User > 0 {
uid = conf.User uid = *conf.User
} }
if uid > 0 { if uid > 0 {

View File

@@ -22,6 +22,7 @@ import (
"log/slog" "log/slog"
"os" "os"
"path/filepath" "path/filepath"
"runtime"
"strings" "strings"
tpl "text/template" tpl "text/template"
) )
@@ -41,7 +42,11 @@ func WriteAd(dir string, ad *Ad, template string) error {
return err return err
} }
ad.Text = strings.ReplaceAll(ad.Text, "<br/>", "\n") if runtime.GOOS == "windows" {
ad.Text = strings.ReplaceAll(ad.Text, "<br/>", "\r\n")
} else {
ad.Text = strings.ReplaceAll(ad.Text, "<br/>", "\n")
}
tmpl, err := tpl.New("adlisting").Parse(template) tmpl, err := tpl.New("adlisting").Parse(template)
if err != nil { if err != nil {