summaryrefslogtreecommitdiff
path: root/README.md
blob: 2cf8a748b7c4184e92f98f8b80590422a4d674ed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# бирка-тян: электронная доска объявлений

_В вашем деле нет пометки об этом!_

бирка-тян (birka-tyan) is a lightweight Danbooru-style imageboard engine for the
purposes of self-hosting a tagged image gallery. It lacks many of the features
one would expect of such an application (particularly use rauthentication), so
if you have a use case other than being able to search through your pictures
when you are not at home, you would be better off looking at an established
solution such as [Danbooru](https://github.com/danbooru/danbooru).

## Features

- A command-line tool for interacting with the tag database.

## Usage

### Command-Line

There are two ways of interacting with бирка-тян: through the `birka-cli`
command-line tool (i), and through the web interface (ii).

The inclusion of (i) is in consideration for this being, essentially, a personal
image gallery. One likely has a loosely-organized collection of images already;
the command-line tool enables her to import images en masse with the full
capabilities of the Unix shell at her fingertips. A brief summary of the
command-line interface follows.

In бирка-тян's tag database, every image is identified by a signed 64-bit
integer. The command-line tool operates on these internal identifiers, so it is
often helpful to obtain the identifier for an image in the filesystem.

```sh
$ birka-cli id_for Cat.jpeg
2
```

But, of course, the tag database must be populated with this "Cat.jpeg" before
this command is to work. Images are introduced to the database with the `add`
command, which takes zero or more tags.

```sh
$ birka-cli add Cat.jpeg animal cat cute
```

Ah, drat. We should have tagged that image with "photograph", too.

```sh
$ birka-cli add_tags $(birka-cli id_for Cat.jpeg) photograph
```

On second thought, that wasn't a particularly cute picture.

```sh
$ birka-cli remove_tags $(birka-cli id_for Cat.jpeg) cute
```

Now, let's see all of the photographs in the tag database tagged with
"photograph".

```sh
$ birka-cli query photograph
1,Kww+tPLv/BsbU7M7qqW59ph54v6CSEiUPNpW4XbA0cpoyrrAZsAmT5Ptm30M+hATM71mimoo7PTaS8DEAq57cQ==,/home/jakob/Camera/Cat.jpeg
```

The `query` command outputs CSV; the first field is the internal identifier you
would see from `id_for`, the second is a base64-encoded BLAKE2b hash for the
image, and the third is the absolute path of the image.

### Web-Interface (API)

The web interface for бирка-тян exposes a RESTful API for remotely interacting
with the tag database. At the time of writing, this API is __not__ stabilized.
Expect to rewrite any code depending on this API in the near future, in part
because these will all be put behind a `/v1/` specifier.

Suppose we denote the following shape of JSON object as a `ImageResult`.

```
{
  "id": number,
  "filename": string,
  "thumb_filename": string,
  "orig_filename": string,
  "tags": [string, ...],
}
```

The images in the tag database can be enumerated with the 'posts' endpoint,
which takes two parameters: `tags`, a comma-separated list of zero or more
strings, and `last`, which is the last `ImageResult` identifier which was seen.
This endpoint will return, at most, 50 entries, which is why the `last`
parameter is necessary.

```
GET /api/posts?last=number,tags=[string, ...]

[zero or more ImageResult]
```

Information about a specific image in the database can be obtained with the
following endpoint, where `id` is the identifier (number) of the image in the
database:

```
GET /api/posts/[id]

ImageResult
```

To upload an image to the database, post a multipart/form-data encoded message
to the following endpoint with the following fields: `tags`, a comma-separated
list of tags for the files, and `image`, the file to be uploaded.

```
POST /api/posts/[filename]
```