377 Commits

Author SHA1 Message Date
Thanh Nguyen
841c342fcc Merge e9676491ee into 5aec3b4dab 2023-09-24 00:53:39 +02:00
nkanaev
5aec3b4dab Update readme.md 2023-09-23 21:44:41 +01:00
Nazar Kanaev
d787060a24 move files 2023-09-23 21:39:53 +01:00
Nazar Kanaev
c1a29418eb reorganise bin files 2023-09-23 21:32:32 +01:00
Nazar Kanaev
17847f999c update changelog 2023-09-23 21:10:21 +01:00
Will Harding
3adcddc70c Pull atom xhtml title from nested elements
The Atom spec says that any title marked with a type of "xhtml" should be
contained in a div element[1] so we need to use the full XML text when
extracting the text.

[1] https://www.rfc-editor.org/rfc/rfc4287#section-3.1
2023-09-23 21:08:22 +01:00
Thanh Nguyen
e9676491ee Fix edge case where HTTP Auth is used 2023-09-23 03:01:36 +07:00
Thanh Nguyen
1a545bb2a1 Fix links in index.html 2023-09-23 02:58:53 +07:00
Thanh Nguyen
1e128a7cd8 Add manifest.json to static assets 2023-09-23 02:51:50 +07:00
Thanh Nguyen
5dbb6a710c Add manifest.json to index.html 2023-09-23 02:38:02 +07:00
Thanh Nguyen
dadadeb066 Remove handling /manifest.json 2023-09-23 02:37:31 +07:00
nkanaev
c76ff26bd6 Update readme.md 2023-09-14 13:44:35 +01:00
icefed
50f8648f64 update readme 2023-09-14 13:42:57 +01:00
icefed
5f82a9e339 add fever doc & fix fever issues 2023-09-14 13:42:57 +01:00
nkanaev
3278ba4eac Update changelog.txt 2023-09-11 13:56:58 +01:00
icefed
9fc72f8b68 update 2023-09-11 13:56:11 +01:00
icefed
b7b707bd43 update 2023-09-11 13:56:11 +01:00
icefed
7cf27e0fde fix review 2023-09-11 13:56:11 +01:00
icefed
66f2a973a3 fever api support
Fever API spec: https://github.com/DigitalDJ/tinytinyrss-fever-plugin/blob/master/fever-api.md
2023-09-11 13:56:11 +01:00
Nazar Kanaev
7ecbbff18a update changelog 2023-09-07 18:21:31 +01:00
Nazar Kanaev
850ce195a0 fix atom links 2023-09-07 18:19:17 +01:00
Nazar Kanaev
479aebd023 update changelog 2023-09-01 17:40:13 +01:00
Nazar Kanaev
9b178d1fb3 fix relative article links 2023-09-01 17:38:37 +01:00
Nazar Kanaev
3ab098db5c update changelog 2023-08-21 10:39:19 +01:00
Nazar Kanaev
6d16e93008 fix sqlite conflict handling for feeds/folders 2023-08-19 21:51:05 +01:00
Nazar Kanaev
98934daee4 update docs 2023-08-15 14:35:42 +01:00
Nazar Kanaev
259474cae9 v2.4 2023-08-15 14:13:12 +01:00
Nazar Kanaev
1e65a7951b ui fixes 2023-08-14 22:01:13 +01:00
Nazar Kanaev
bed5640366 fix base font size 2023-08-14 21:25:47 +01:00
Hannes Braun
57ea83cf4f Use more recent images for GitHub Actions 2023-08-13 22:29:41 +01:00
Hannes Braun
219842d723 Update minimum required Go version to 1.17 2023-08-13 22:29:41 +01:00
Nazar Kanaev
a96fc101f2 paragraph margins 2023-08-06 12:40:54 +01:00
Nazar Kanaev
81a77ce0a4 update changelog 2023-05-22 22:28:15 +01:00
Adam Szkoda
9ed359f964 Protect a read from a map with a mutex 2023-05-22 22:24:57 +01:00
Nazar Kanaev
bc18557820 handle isPermalink in rss feeds 2023-05-20 23:26:22 +01:00
Nazar Kanaev
7d99edab8d update changelog 2023-05-16 11:12:54 +01:00
x2cf
32ca121520 fix item order 2023-05-16 11:09:57 +01:00
nkanaev
9f1a0534a3 Update readme.md 2023-04-18 14:59:39 +01:00
Nazar Kanaev
d2678be96d update dependencies 2023-03-18 20:48:10 +00:00
nkanaev
95ebbb9d13 update changelog 2023-02-10 09:41:50 +00:00
Kaloyan Petrov
0f6d4d639d Firefox uses altKey to switch tabs 2023-02-10 09:40:03 +00:00
Kaloyan Petrov
795a5d2cb4 Use JS event.code to support different language layouts 2023-02-10 09:39:45 +00:00
Nazar Kanaev
dd5f760606 update docs 2023-02-09 21:37:56 +00:00
Nazar Kanaev
58d6a46e36 increase hidden input height
this allows to show the whole selectgroup area
when scrolled via arrow keys.

as a side effect it makes pagination to work with arrow keys as well.
2023-02-09 21:34:23 +00:00
Nazar Kanaev
a8d7b86cdc do not render root folder input 2023-02-06 11:37:16 +00:00
Nazar Kanaev
aac3de7ca2 make active toolbar buttons prominent 2023-02-02 22:40:41 +00:00
Nazar Kanaev
de24659bae update changelog 2023-02-02 22:09:13 +00:00
Nazar Kanaev
632412c10e go fmt 2023-02-02 22:06:27 +00:00
Nazar Kanaev
012b58bbe4 make newly added feed searchable 2023-02-02 22:05:58 +00:00
nkanaev
c092842ee4 Update changelog.txt 2023-01-30 22:11:00 +00:00
Aaron Bieber
e4c1d01915 Add manifest.json for better mobile integration
manifest.json allows yarr to run in a more app-like mode on mobile
devices.

More info here: https://developer.mozilla.org/en-US/docs/Web/Manifest
2023-01-30 22:05:33 +00:00
Nazar Kanaev
ce07ddea92 update changelog 2023-01-29 14:30:36 +00:00
Nazar Kanaev
bd6322e533 set article view width limit 2023-01-29 14:28:43 +00:00
nkanaev
91da774286 Create todo.txt 2022-11-16 10:21:55 +00:00
nkanaev
e62906e63d fix readability edge case 2022-11-14 15:11:05 +00:00
nkanaev
56e5625adc Update readme.md 2022-09-27 19:53:29 +01:00
Jake Bauer
1ecf4b0bb4 fix linux download instruction
The instruction for downloading yarr for linux told the user to download yar-*-windows which is incorrect. The Linux package on the releases page is yarr-*-linux64.zip.
2022-09-27 19:42:08 +01:00
Nazar Kanaev
57d9421c7f update readme.md 2022-09-09 22:16:41 +01:00
nkanaev
a73188944d Update readme.md 2022-09-09 22:14:37 +01:00
Nazar Kanaev
97904cc0f3 linux installation script 2022-09-09 22:13:55 +01:00
Nazar Kanaev
f28f354992 update changelog 2022-08-21 13:32:18 +01:00
Nazar Kanaev
698f5d6d06 handle google url redirect in page crawler 2022-08-21 13:31:18 +01:00
nkanaev
b935a1c511 Update changelog.txt 2022-08-01 23:20:09 +01:00
Pierre Prinetti
10e6bfa5a0 Set auth without authfile
With this patch, it is possible to pass username and password directly
on the command line with:

```shell
yarr --auth 'username:password'
```

The corresponding environment variable comes handy with containers:
```shell
YARR_AUTH='username:password' yarr
```
2022-07-06 15:21:41 +01:00
nkanaev
f030a4075b refactoring 2022-07-04 16:03:50 +01:00
Pierre Prinetti
c9dd977600 Allow passwords with column
Before this patch, an `authfile` with multiple column symbols was not
valid.

After this patch, all characters after the first `:` constitute the
password, until EOL.
2022-07-04 15:21:09 +01:00
Pierre Prinetti
c1bcc0c517 Run go fmt
This patch is the result of running `go fmt ./...` with Go v1.16.15.
2022-07-04 15:20:49 +01:00
nkanaev
2a5692d9a7 fix scrolling issue with large font 2022-06-29 11:41:01 +01:00
quoing
a8d160f9b1 Fix concurrent map writes for FeedIcon cache 2022-06-21 16:12:59 +01:00
nkanaev
286cbff236 update favicon (2nd attempt) 2022-06-06 10:04:47 +01:00
nkanaev
fff0870d3b update changelog 2022-06-02 10:18:17 +01:00
nkanaev
fe22460c07 favicon tweaks 2022-06-02 10:16:56 +01:00
Nazar Kanaev
18f2789a5d oopsies 2022-06-01 21:04:42 +01:00
Nazar Kanaev
7f161a5408 update changelog 2022-06-01 21:02:13 +01:00
Nazar Kanaev
cba3fbc48c fix append (different behaviour in arm) 2022-06-01 20:51:00 +01:00
Nazar Kanaev
5e46f1480e add vendor 2022-06-01 20:49:50 +01:00
Nazar Kanaev
ead253c55f cross-compilation for ARMv7 2022-06-01 20:49:38 +01:00
Nazar Kanaev
6b8da92cb3 update link 2022-06-01 13:26:03 +01:00
Nazar Kanaev
a91f64ce9d docker build instructions 2022-06-01 13:24:39 +01:00
Nazar Kanaev
e1a6ccf133 update changelog 2022-05-03 20:59:24 +01:00
Nazar Kanaev
d2c034a850 v2.3 2022-05-03 20:40:39 +01:00
Nazar Kanaev
713930decc update changelog 2022-05-03 15:45:22 +01:00
Nazar Kanaev
ee2a825cf0 get rss link when atom link is present
found in: https://rss.nytimes.com/services/xml/rss/nyt/Arts.xml

when both rss and atom link elements are present, xml parser returns
empty string. provide default namespace to capture rss link properly.
2022-05-03 15:35:57 +01:00
Nazar Kanaev
8e9da86f83 nah 2022-04-09 16:06:19 +01:00
Nazar Kanaev
9eb49fd3a7 credits 2022-04-09 16:03:46 +01:00
Nazar Kanaev
684bc25b83 fix: load more items to prevent scroll lock 2022-04-09 15:58:33 +01:00
nkanaev
8ceab03cd7 fix text color in dark mode 2022-03-01 10:43:25 +00:00
Nazar Kanaev
34dad4ac8f systray: fix build flag 2022-02-16 14:04:04 +00:00
Nazar Kanaev
b40d930f8a credits 2022-02-15 22:12:32 +00:00
Nazar Kanaev
d4b34e900e update test 2022-02-15 22:04:16 +00:00
Nazar Kanaev
954b549029 update 2022-02-15 21:56:32 +00:00
Nazar Kanaev
fbd0b2310e update changelog 2022-02-14 20:33:28 +00:00
Nazar Kanaev
be7af0ccaf handle invalid chars in non-utf8 xml 2022-02-14 15:23:55 +00:00
Nazar Kanaev
18221ef12d use bytes.Buffer instead 2022-02-14 11:05:38 +00:00
Nazar Kanaev
4c0726412b do not build systray in linux 2022-02-14 00:56:03 +00:00
Nazar Kanaev
d7253a60b8 strip out invalid xml characters 2022-02-12 23:42:44 +00:00
Nazar Kanaev
2de3ddff08 fix test 2022-02-12 23:41:01 +00:00
Nazar Kanaev
830248b6ae store feed size 2022-02-10 22:14:47 +00:00
Nazar Kanaev
f8db2ef7ad delete old items based on feed size 2022-02-10 22:14:47 +00:00
Nazar Kanaev
109caaa889 cascade 2022-02-10 22:14:47 +00:00
Nazar Kanaev
d0b83babd2 initial work for smarter database cleanup 2022-02-10 22:14:47 +00:00
nkanaev
de3decbffd remove unused assets 2022-01-26 10:44:33 +00:00
nkanaev
c92229a698 update changelog 2022-01-24 16:56:55 +00:00
nkanaev
176852b662 credits 2022-01-24 16:52:29 +00:00
nkanaev
52cc8ecbbd fix encoding 2022-01-24 16:47:32 +00:00
nkanaev
e3e9542f1e fix page crawling encoding 2022-01-24 14:02:21 +00:00
nkanaev
b78c8bf8bf fix parsing opml with encoding 2022-01-24 13:10:30 +00:00
nkanaev
bff7476b58 refactoring 2022-01-24 12:50:52 +00:00
Nazar Kanaev
05f5785660 update promo.png 2022-01-18 14:36:05 +00:00
David Adi Nugroho
cb50aed89a add placeholder and autofocus to new feed url 2021-12-28 17:56:26 +00:00
Nazar Kanaev
df655aca5e remove todo 2021-11-20 22:42:33 +00:00
Nazar Kanaev
86853a87bf update changelog 2021-11-20 22:07:33 +00:00
Nazar Kanaev
e3109a4384 v2.2 2021-11-20 22:01:05 +00:00
Nazar Kanaev
eee8002d69 do not show loading icon after marking all articles read 2021-11-20 21:34:58 +00:00
Nazar Kanaev
92f11f7513 cleanup gitignore 2021-11-20 21:22:21 +00:00
nkanaev
5428e6be3a update changelog 2021-11-17 10:52:01 +00:00
Nazar Kanaev
1ad693f931 make selected feed/folder always visible 2021-11-11 22:04:27 +00:00
Nazar Kanaev
c2d88a7e3f update promo 2021-11-11 21:45:09 +00:00
nkanaev
3b29d737eb move theme selector to the main settings menu 2021-11-11 13:33:22 +00:00
nkanaev
fe178b8fc6 nope 2021-11-11 13:14:23 +00:00
nkanaev
cca742a1c2 run windows console fix 2021-11-11 09:51:56 +00:00
nkanaev
c7eddff118 make feed/folder settings available in all filter modes 2021-11-10 11:19:14 +00:00
nkanaev
cf30ed249f windows console fix 2021-11-10 11:06:30 +00:00
nkanaev
26b87dee98 remove html tags from titles 2021-11-10 10:54:12 +00:00
Karol Kosek
77c7f938f1 Autoselect current folder when adding a new feed
This patch makes categorising new feeds a bit more intuitive:
the selected folder (or feed within a folder) in the feed list
will automatically be selected when adding a new feed.
2021-11-10 10:20:14 +00:00
Nazar Kanaev
f98de9a0a5 update todo 2021-11-08 11:27:51 +00:00
Nazar Kanaev
6fa2b67024 todo 2021-10-25 16:24:18 +01:00
Nazar Kanaev
355e5feb62 update asset names 2021-08-16 12:57:28 +01:00
Nazar Kanaev
a7dd707062 update changelog 2021-08-16 12:56:59 +01:00
Nazar Kanaev
4de46a7bc5 v2.1 2021-08-16 12:49:26 +01:00
Nazar Kanaev
2c6fce3322 credits 2021-07-28 09:34:54 +01:00
Karol Kosek
19ecfcd0bc ParseRSS: accept any file with audio/ media type as podcast
There are some podcasts that use audio/opus files (mostly as an alternative,
but still), which makes the audio attachment not being displayed.

Instead of increasing the list of allowed formats (because audio/mp3 would be
quite useful on the list too), I guess it'd be better to give any audio/ media
type to the user-agent and let him worry about it. :^)
2021-07-28 09:31:27 +01:00
Nazar Kanaev
d575acfe80 fix env vars 2021-07-05 11:30:01 +01:00
Nazar Kanaev
d203d38de6 fix empty feed parsing 2021-07-01 14:10:22 +01:00
Nazar Kanaev
9f01f63613 credits 2021-06-29 16:46:12 +01:00
Nazar Kanaev
982c4ebbbc do not convert response to utf8 if charset is not set 2021-06-29 16:43:09 +01:00
Nazar Kanaev
0c5385cef3 update text 2021-06-07 10:07:20 +01:00
Nazar Kanaev
58f4e1f6c9 credits 2021-05-31 15:07:46 +01:00
Nazar Kanaev
6b7f69d5c0 fix tests 2021-05-31 15:06:39 +01:00
Nazar Kanaev
7aeb458ee5 fix pagination 2021-05-31 14:37:45 +01:00
Nazar Kanaev
7cfd3b3238 update help 2021-05-30 22:18:48 +01:00
Nazar Kanaev
55262d38fe credits 2021-05-30 21:53:01 +01:00
Nazar Kanaev
a45e29feb7 haha nkanaev you so funny 2021-05-30 21:33:33 +01:00
Nazar Kanaev
9f5fd3bb4d close article always shown 2021-05-30 21:29:27 +01:00
Farow
63f9d55903 update ui
- display full date when hovering over the age in the article list
- hide close article button on desktop layouts
- autofocus username on the login page
- hide the title on the settings/appearance dropdowns (still visible on the buttons)
2021-05-30 21:28:27 +01:00
Nazar Kanaev
8f36ae013e done 2021-05-28 10:28:23 +01:00
Nazar Kanaev
851aa1a136 rewrite icon crawling 2021-05-28 10:27:56 +01:00
Nazar Kanaev
f38dcfba3b cache feed icons 2021-05-27 13:16:03 +01:00
Nazar Kanaev
214c7aacfc fix refresh sync 2021-05-27 11:52:30 +01:00
nkanaev
eb9bfc57e2 Update readme.md 2021-05-25 15:34:49 +01:00
Nazar Kanaev
c072783c42 remove extra underscore from env vars 2021-05-22 21:51:39 +01:00
Nazar Kanaev
9d701678e1 option to log to a file 2021-05-22 21:50:22 +01:00
Nazar Kanaev
37ed856d8b fix iframe autoclosing 2021-05-13 22:37:02 +01:00
Nazar Kanaev
28f08ad42a responsive video iframe 2021-05-13 21:42:34 +01:00
Nazar Kanaev
da267a56ef todo 2021-05-06 22:34:21 +01:00
Nazar Kanaev
16e4cad9ad update dependencies 2021-05-03 22:21:01 +01:00
Nazar Kanaev
d13a04898e update changelog 2021-05-03 10:20:16 +01:00
Nazar Kanaev
ff39fbff70 default options from env vars 2021-05-03 10:16:14 +01:00
Nazar Kanaev
92c6aac49e todo 2021-04-27 14:35:39 +01:00
Nazar Kanaev
4ca81f90e9 update list 2021-04-27 14:34:44 +01:00
Nazar Kanaev
75e828cb4c update changelog 2021-04-26 15:26:23 +01:00
Nazar Kanaev
883214a740 more todo 2021-04-26 15:22:32 +01:00
Nazar Kanaev
36e359c881 fix headers 2021-04-26 15:16:26 +01:00
Nazar Kanaev
87b53fb8ec tweak 2021-04-26 15:14:03 +01:00
Nazar Kanaev
2ae62855cc fix importing certain opml files 2021-04-22 11:15:16 +01:00
Nazar Kanaev
19889c1457 v2.0 2021-04-18 10:52:35 +01:00
Nazar Kanaev
f9afbac258 update docs 2021-04-15 10:35:42 +01:00
Nazar Kanaev
e54df07a40 use rdf description 2021-04-15 10:29:35 +01:00
Nazar Kanaev
f8455236dc rdf date & content 2021-04-15 10:27:50 +01:00
Nazar Kanaev
d308bb64c2 rewrite items sql queries 2021-04-08 14:00:26 +01:00
Nazar Kanaev
077715f6c2 storage items test 2021-04-08 13:48:12 +01:00
Nazar Kanaev
bfe7bfdbd5 test with foreign keys 2021-04-08 11:00:17 +01:00
Nazar Kanaev
1013cd1122 rename Errorf -> Printf 2021-04-07 21:09:34 +01:00
Nazar Kanaev
3e57ccc999 import missing package 2021-04-07 21:04:19 +01:00
Nazar Kanaev
5f23f8be89 credits 2021-04-07 21:02:44 +01:00
Nazar Kanaev
211b1456c7 no more null dates 2021-04-07 20:54:39 +01:00
Nazar Kanaev
3d9c9d03cc refresh ui hacks 2021-04-07 15:47:47 +01:00
Nazar Kanaev
1ea8160f7d remove todo 2021-04-07 15:39:37 +01:00
Nazar Kanaev
2c12875199 fix 2021-04-07 15:38:44 +01:00
Nazar Kanaev
bb0b575eca let's call it done 2021-04-07 15:31:39 +01:00
Nazar Kanaev
e51ccb723e dropdown icons 2021-04-07 15:29:29 +01:00
Nazar Kanaev
96796702cf select the newly added feed 2021-04-07 15:05:11 +01:00
Nazar Kanaev
fd44c98cd0 nothing can be done
the website serves content without charset/encoding information
in http headers. in the absence of that info charset.DetermineEncoding
defaults to cp-1252, but the actual content served is utf-8.

which explains why, say, ’ shows up as ’

see:
    https://stackoverflow.com/questions/2477452/%C3%A2%E2%82%AC-showing-on-page-instead-of
2021-04-07 14:54:57 +01:00
Nazar Kanaev
c2a28bcadf allow svg in sanitizer 2021-04-07 14:34:57 +01:00
Nazar Kanaev
30e6afb096 update changelog 2021-04-07 14:31:06 +01:00
Nazar Kanaev
882be1dbf6 more todos 2021-04-07 10:58:17 +01:00
Nazar Kanaev
8764891b80 menu fix 2021-04-07 10:39:09 +01:00
Nazar Kanaev
fbb0dfed47 remove bom 2021-04-07 10:25:30 +01:00
Nazar Kanaev
42b36965c5 remove error prefixes 2021-04-06 21:48:09 +01:00
Nazar Kanaev
e326c7a0fb show feed errors on the 2nd pane 2021-04-06 21:37:32 +01:00
Nazar Kanaev
9fae33f57b feed/folder dropdown titles 2021-04-06 20:34:20 +01:00
Nazar Kanaev
a397d2013d dropdown tweaks 2021-04-06 20:30:42 +01:00
Nazar Kanaev
f65aadb055 remove manage modal, edit via dropdown 2021-04-06 20:12:52 +01:00
Nazar Kanaev
c825f8864f drop description field usage 2021-04-06 11:50:15 +01:00
Nazar Kanaev
2edf11a36a hopefully gone 2021-04-06 11:35:26 +01:00
Nazar Kanaev
2df2f41516 gofmt -s -w . 2021-04-06 08:43:15 +01:00
Nazar Kanaev
614dcc8975 todo 2021-04-05 21:37:09 +01:00
Nazar Kanaev
6acf9af887 remove item.date_updated, item.description & item.author fields in storage 2021-04-05 21:30:07 +01:00
Nazar Kanaev
ecdfcb5017 test command 2021-04-05 21:04:48 +01:00
Nazar Kanaev
144fc1606a remove feed hacks from storage 2021-04-05 20:59:15 +01:00
Nazar Kanaev
9919d72be0 more tests 2021-04-05 20:35:30 +01:00
Nazar Kanaev
9e95f71de8 bump 2021-04-05 19:06:09 +01:00
Nazar Kanaev
09bfc47ef0 start storage tests 2021-04-05 19:02:38 +01:00
Nazar Kanaev
2e5ccc3158 delete anchor.png 2021-04-05 14:15:59 +01:00
Nazar Kanaev
70481dff73 update changelog 2021-04-05 13:19:42 +01:00
Nazar Kanaev
cc12f27ce3 no submodule - no problem 2021-04-05 12:31:47 +01:00
Nazar Kanaev
c36d82636d squeeze 2021-04-05 11:57:59 +01:00
Nazar Kanaev
b123753d65 readability keyboard shortcut 2021-04-05 11:49:16 +01:00
Nazar Kanaev
f590c358d2 do not strip out content inside table & code 2021-04-05 11:04:24 +01:00
Nazar Kanaev
fa2fad0ff6 cleanup 2021-04-05 10:01:20 +01:00
Nazar Kanaev
d8aab7acae done 2021-04-04 21:47:35 +01:00
Nazar Kanaev
63ad971890 unsset audio/image if present in the content 2021-04-04 21:31:25 +01:00
Nazar Kanaev
0828d6782e extract date parser to a new file 2021-04-04 20:45:13 +01:00
Nazar Kanaev
cf5856bdf7 set missing times 2021-04-04 20:42:52 +01:00
Nazar Kanaev
34edfc0727 router: handle urls without base properly 2021-04-03 20:52:17 +01:00
Nazar Kanaev
a1b1686d3b update todo 2021-04-03 20:28:33 +01:00
Nazar Kanaev
c5abf8f9d0 fix import 2021-04-02 22:36:02 +01:00
Nazar Kanaev
9a5af089eb update todo 2021-04-02 22:35:02 +01:00
Nazar Kanaev
9edd865bf4 remove whitespace in extracttext 2021-04-02 22:26:45 +01:00
Nazar Kanaev
e50c7e1a51 handle html type atom text 2021-04-02 22:26:45 +01:00
Nazar Kanaev
8967936fb6 done 2021-04-02 22:26:45 +01:00
Nazar Kanaev
fa92ea16b0 search for icons only during startup and after adding feeds 2021-04-02 22:26:45 +01:00
Nazar Kanaev
c8d6363677 already done 2021-04-02 22:26:45 +01:00
Nazar Kanaev
b082c3e048 gzip middleware 2021-04-02 22:26:45 +01:00
Nazar Kanaev
82fdb3be6c don't serve templates 2021-04-02 22:26:45 +01:00
Nazar Kanaev
d7ba203f28 rewrite basepath 2021-04-02 22:26:45 +01:00
Nazar Kanaev
1cba53f7fb done 2021-04-02 22:26:45 +01:00
Nazar Kanaev
0a0db68905 feedburner 2021-04-02 22:26:45 +01:00
Nazar Kanaev
3512350a22 ditch fetch polyfill, cleanup index.html 2021-04-02 22:26:45 +01:00
Nazar Kanaev
8b2a9d8f20 rename keybindings -> key 2021-04-02 22:26:45 +01:00
Nazar Kanaev
34b50d388a ditch vue-lazyload 2021-04-02 22:26:45 +01:00
Nazar Kanaev
cd412a4ac5 remove css map file 2021-04-02 22:26:45 +01:00
Nazar Kanaev
7fb6271e56 update todo 2021-04-02 22:26:45 +01:00
Nazar Kanaev
2cd815d9cd youtube/vimeo iframes 2021-04-02 22:26:45 +01:00
Nazar Kanaev
0a6e621c02 update todo 2021-04-02 22:26:45 +01:00
Nazar Kanaev
10c656a3b6 done 2021-04-02 22:26:45 +01:00
Nazar Kanaev
0ea313d945 fix 2021-04-02 22:26:45 +01:00
Nazar Kanaev
1f02bde5e1 switch to the new whitelist 2021-04-02 22:26:45 +01:00
Nazar Kanaev
3e0c784744 add whitelist from dompurify 2021-04-02 22:26:45 +01:00
Nazar Kanaev
528df7fb4a reorganizing server-related packages 2021-04-02 22:26:45 +01:00
Nazar Kanaev
b04e8c1e93 reorganizing content-related packages 2021-04-02 22:26:45 +01:00
Nazar Kanaev
0b8bf50204 nah 2021-04-02 22:26:45 +01:00
Nazar Kanaev
f43924c17b change font selection 2021-04-02 22:26:45 +01:00
Nazar Kanaev
0f519b7202 theme fixes 2021-04-02 22:26:45 +01:00
Nazar Kanaev
c74eeff790 provide settings prior to js rendering 2021-04-02 22:26:45 +01:00
Nazar Kanaev
e7b645a68a fix item status update 2021-04-02 22:26:45 +01:00
Nazar Kanaev
fc0bfd29db space 2021-04-02 22:26:45 +01:00
Nazar Kanaev
8950181f21 update doc 2021-04-02 22:26:45 +01:00
Nazar Kanaev
70e592c979 bureaucracy 2021-04-02 22:26:45 +01:00
Nazar Kanaev
401668e413 finally getting rid of goquery in readability 2021-04-02 22:26:45 +01:00
Nazar Kanaev
37ddde1765 still rewriting readability 2021-04-02 22:26:45 +01:00
Nazar Kanaev
82586dedff rewriting readability 2021-04-02 22:26:45 +01:00
Nazar Kanaev
ac36892150 reader utility 2021-04-02 22:26:44 +01:00
Nazar Kanaev
c958ee9116 rewriting readability 2021-04-02 22:26:44 +01:00
Nazar Kanaev
e5920259b6 start rewriting readability 2021-04-02 22:26:44 +01:00
Nazar Kanaev
8c44d2fc87 todos 2021-04-02 22:26:44 +01:00
Nazar Kanaev
332ee0e6b5 cleanup 2021-04-02 22:26:44 +01:00
Nazar Kanaev
3ae17171e2 server-side item sanitization 2021-04-02 22:26:44 +01:00
Nazar Kanaev
493a4262b1 cleanup sanitizer 2021-04-02 22:26:44 +01:00
Nazar Kanaev
485587825c switch to server-side readability 2021-04-02 22:26:44 +01:00
Nazar Kanaev
a83d43a5b1 borrow miniflux code 2021-04-02 22:26:44 +01:00
Nazar Kanaev
71f81a3802 fix title 2021-04-02 22:26:44 +01:00
Nazar Kanaev
6481c97645 ditch bootstrap-vue & popper 2021-04-02 22:26:44 +01:00
Nazar Kanaev
fa40a79d50 css cleanup 2021-04-02 22:26:44 +01:00
Nazar Kanaev
169d579400 ditch b-modal 2021-04-02 22:26:44 +01:00
Nazar Kanaev
430f300140 ditch v-b-tooltip 2021-04-02 22:26:44 +01:00
Nazar Kanaev
a9b450db03 unfocus search on enter 2021-04-02 22:26:44 +01:00
Nazar Kanaev
89ce8df0e3 item status change tweaks 2021-04-02 22:26:44 +01:00
Nazar Kanaev
aa015b78c0 ui fixes 2021-04-02 22:26:44 +01:00
Nazar Kanaev
3ed1b3e612 done 2021-04-02 22:26:44 +01:00
Nazar Kanaev
7fb0d3833e redesign appearance dropdown 2021-04-02 22:26:44 +01:00
Nazar Kanaev
2da616d4ff settings redesign 2021-04-02 22:26:44 +01:00
Nazar Kanaev
0b3d7faf9f dropdown tweaks + use dropdown instead of popover 2021-04-02 22:26:44 +01:00
Nazar Kanaev
b3ba912566 ditch bootstrap-vue dropdown 2021-04-02 22:26:44 +01:00
Nazar Kanaev
36bc84d99a increase lookup length 2021-04-02 22:26:44 +01:00
Nazar Kanaev
f126247262 untitle in content 2021-04-02 22:26:44 +01:00
Nazar Kanaev
b145b00f8e add vimeo to list 2021-04-02 22:26:44 +01:00
Nazar Kanaev
7dbfecdba1 extract thumbnails from vimeo feeds 2021-04-02 22:26:44 +01:00
Nazar Kanaev
ad693aaf02 content image tweaks 2021-04-02 22:26:44 +01:00
Nazar Kanaev
fafa6286d4 parser fixes 2021-04-02 22:26:44 +01:00
Nazar Kanaev
cc51fe01c2 give priority to content:encoded 2021-04-02 22:26:44 +01:00
Nazar Kanaev
91deb41d5b store podcast url 2021-04-02 22:26:44 +01:00
Nazar Kanaev
2e4082df77 update doc 2021-04-02 22:26:44 +01:00
Nazar Kanaev
51cbdea31f podcasts 2021-04-02 22:26:44 +01:00
Nazar Kanaev
5335863488 update formats doc 2021-04-02 22:26:44 +01:00
Nazar Kanaev
c2e1926741 show item image 2021-04-02 22:26:44 +01:00
Nazar Kanaev
37a679fc80 update formats doc 2021-04-02 22:26:44 +01:00
Nazar Kanaev
1be79d922b feedtest: support local files 2021-04-02 22:26:44 +01:00
Nazar Kanaev
6685bce51c extract data from media elements 2021-04-02 22:26:44 +01:00
Nazar Kanaev
fe1a1987bd translate urls 2021-04-02 22:26:44 +01:00
Nazar Kanaev
80402943a1 wrap in charset 2021-04-02 22:26:44 +01:00
Nazar Kanaev
b40fe94147 refactor crawler 2021-04-02 22:26:44 +01:00
Nazar Kanaev
e0e6166cdf fix feed sniff reader 2021-04-02 22:26:44 +01:00
Nazar Kanaev
a2bfd1682b rewrite worker 2021-04-02 22:26:44 +01:00
Nazar Kanaev
1f393faf79 move checker tool to bin 2021-04-02 22:26:44 +01:00
Nazar Kanaev
c469749eaa rename packaages 2021-04-02 22:26:44 +01:00
Nazar Kanaev
e0009e4267 feed checker tool 2021-04-02 22:26:44 +01:00
Nazar Kanaev
24a06faa3c fix dates 2021-04-02 22:26:44 +01:00
Nazar Kanaev
9ede816078 rewrite crawler 2021-04-02 22:26:44 +01:00
Nazar Kanaev
646519e074 add charsetreader to xmlreader 2021-04-02 22:26:44 +01:00
Nazar Kanaev
454eff0155 done 2021-04-02 22:26:44 +01:00
Nazar Kanaev
ebd7f2929c drop gofeed 2021-04-02 22:26:44 +01:00
Nazar Kanaev
5b36530f67 switch to internal feed parser 2021-04-02 22:26:44 +01:00
Nazar Kanaev
c91b439878 tweaks 2021-04-02 22:26:44 +01:00
Nazar Kanaev
7d61f705bf url fixer 2021-04-02 22:26:44 +01:00
Nazar Kanaev
9fa8b8440a go fmt ./... 2021-04-02 22:26:44 +01:00
Nazar Kanaev
9e8837b37d tweaks 2021-04-02 22:26:44 +01:00
Nazar Kanaev
7ca9415322 feed refactoring 2021-04-02 22:26:44 +01:00
Nazar Kanaev
e78c028d20 feed dump 2021-04-02 22:26:44 +01:00
Nazar Kanaev
cbc75047b8 update formats 2021-04-02 22:26:44 +01:00
Nazar Kanaev
cc6f6d91e1 rss parser 2021-04-02 22:26:44 +01:00
Nazar Kanaev
70e9e1ed3a moar links 2021-04-02 22:26:44 +01:00
Nazar Kanaev
efafdbebaa remove feed_url references 2021-04-02 22:26:44 +01:00
Nazar Kanaev
19967ce37c leave comments 2021-04-02 22:26:44 +01:00
Nazar Kanaev
ce3d6fba37 fixes 2021-04-02 22:26:44 +01:00
Nazar Kanaev
3e14716fc6 learn more about formats 2021-04-02 22:26:44 +01:00
Nazar Kanaev
43620cd9b6 basic rdf test 2021-04-02 22:26:44 +01:00
Nazar Kanaev
e819140f36 remove unneeded rss fields 2021-04-02 22:26:44 +01:00
Nazar Kanaev
f28f0eac1a rdf xml structs 2021-04-02 22:26:44 +01:00
Nazar Kanaev
ff4abb8dfe another nice parser 2021-04-02 22:26:44 +01:00
Nazar Kanaev
e2efaddfed rss xml structs 2021-04-02 22:26:44 +01:00
Nazar Kanaev
b1db6c6fb1 add links 2021-04-02 22:26:44 +01:00
Nazar Kanaev
279fc469ab basic atom 1.0 parser 2021-04-02 22:26:44 +01:00
Nazar Kanaev
d185fb6dd7 handle base url later 2021-04-02 22:26:44 +01:00
Nazar Kanaev
3a667a3809 add date parser 2021-04-02 22:26:44 +01:00
Nazar Kanaev
a895775f81 basic json feed parser 2021-04-02 22:26:44 +01:00
Nazar Kanaev
0a9beddef9 update formats 2021-04-02 22:26:44 +01:00
Nazar Kanaev
29528e40b0 gather info 2021-04-02 22:26:44 +01:00
Nazar Kanaev
aaf0b702a3 remove dead code 2021-04-02 22:26:44 +01:00
Nazar Kanaev
9f376db0f4 gofmt 2021-04-02 22:26:44 +01:00
Nazar Kanaev
391ce61362 opml tweaks & fixes 2021-04-02 22:26:44 +01:00
Nazar Kanaev
62e2ca4c16 switch to new opml 2021-04-02 22:26:44 +01:00
Nazar Kanaev
ea5af73901 remove print 2021-04-02 22:26:44 +01:00
Nazar Kanaev
7d7feda319 rewrite opml 2021-04-02 22:26:44 +01:00
Nazar Kanaev
1c810f68f8 done 2021-04-02 22:26:44 +01:00
Nazar Kanaev
8528a80d7e minor 2021-04-02 22:26:44 +01:00
Nazar Kanaev
dd0bf1a012 done 2021-04-02 22:26:44 +01:00
Nazar Kanaev
e0c4752bbf drop direct goquery dependency 2021-04-02 22:26:44 +01:00
Nazar Kanaev
c896440525 find favicons 2021-04-02 22:26:44 +01:00
Nazar Kanaev
1f042a8434 separate package for crawler 2021-04-02 22:26:44 +01:00
Nazar Kanaev
fc3383946d crawl 2021-04-02 22:26:44 +01:00
Nazar Kanaev
4abbebf5e9 done 2021-04-02 22:26:44 +01:00
Nazar Kanaev
eb0ad7f22e move authmiddleware to auth package 2021-04-02 22:26:44 +01:00
Nazar Kanaev
0b1c90718d cleanup 2021-04-02 22:26:44 +01:00
Nazar Kanaev
47597b2b7c simplicity 2021-04-02 22:26:44 +01:00
Nazar Kanaev
f3c55ba5f2 basepath fixes 2021-04-02 22:26:44 +01:00
Nazar Kanaev
5e453e3227 css tweak 2021-04-02 22:26:43 +01:00
Nazar Kanaev
9bf7f45354 router base 2021-04-02 22:26:43 +01:00
Nazar Kanaev
c8bc511e04 oops 2021-04-02 22:26:43 +01:00
Nazar Kanaev
85a114e591 login page tweaks 2021-04-02 22:26:43 +01:00
Nazar Kanaev
73b7144394 auth middleware basepath tweaks 2021-04-02 22:26:43 +01:00
Nazar Kanaev
e9f6a0a1d2 auth middleware 2021-04-02 22:26:43 +01:00
Nazar Kanaev
dfb32d4ebe extract worker & crawler from server 2021-04-02 22:26:43 +01:00
Nazar Kanaev
682b0c1729 done 2021-04-02 22:26:43 +01:00
Nazar Kanaev
e79abb69eb include systray 2021-04-02 22:26:43 +01:00
Nazar Kanaev
514ed02693 remove example file 2021-04-02 22:26:43 +01:00
Nazar Kanaev
ff3241bd57 context int shorthands 2021-04-02 22:26:43 +01:00
Nazar Kanaev
76937bedc9 switch to context.JSON 2021-04-02 22:26:43 +01:00
Nazar Kanaev
1e65da9aa4 opml package 2021-04-02 22:26:43 +01:00
Nazar Kanaev
0d49377879 auth package 2021-04-02 22:26:43 +01:00
Nazar Kanaev
1a490a8e7a switch to the new router 2021-04-02 22:26:43 +01:00
Nazar Kanaev
e53265472f rename handler -> server 2021-04-02 22:26:43 +01:00
Nazar Kanaev
66fdbef90b test router 2021-04-02 22:26:43 +01:00
Nazar Kanaev
80482e70a8 fix router 2021-04-02 22:26:43 +01:00
Nazar Kanaev
f214c3166b router servehttp 2021-04-02 22:26:43 +01:00
Nazar Kanaev
4a4303afef router package 2021-04-02 22:26:43 +01:00
Nazar Kanaev
cc7bdc5b76 switch to the standard logger 2021-04-02 22:26:43 +01:00
Nazar Kanaev
3539433a9d hierarchical feed list in the manage modal 2021-03-18 12:04:52 +00:00
Nazar Kanaev
54cb821ae9 smooth article scrolling 2021-03-18 12:03:02 +00:00
Nazar Kanaev
4924dcfd12 update changelog 2021-03-16 11:08:43 +00:00
Nazar Kanaev
d84e76d07c update todo 2021-03-16 09:50:12 +00:00
Nazar Kanaev
eca215d044 update todo 2021-03-16 09:48:15 +00:00
Nazar Kanaev
721de3fba6 article scroll keybindings 2021-03-16 00:01:53 +00:00
Nazar Kanaev
e7fa98008d todo 2021-03-12 14:03:33 +00:00
Nazar Kanaev
923fbc54b8 update changelog 2021-03-12 13:28:33 +00:00
Vasiliy Faronov
ff39f90abd fix serving static files with -base
I deleted the commented-out block because it hasn't been touched
in half a year now.
2021-03-12 13:26:16 +00:00
Nazar Kanaev
db30fa3c5e update todo 2021-03-11 23:36:42 +00:00
407 changed files with 463734 additions and 2869 deletions

View File

@@ -7,7 +7,7 @@ on:
jobs:
build_macos:
name: Build for MacOS
runs-on: macos-10.15
runs-on: macos-13
steps:
- name: "Checkout"
uses: actions/checkout@v2
@@ -16,7 +16,7 @@ jobs:
- name: "Setup Go"
uses: actions/setup-go@v2
with:
go-version: '^1.16'
go-version: '^1.17'
- name: Cache Go Modules
uses: actions/cache@v2
with:
@@ -34,7 +34,7 @@ jobs:
build_windows:
name: Build for Windows
runs-on: windows-2019
runs-on: windows-2022
steps:
- name: "Checkout"
uses: actions/checkout@v2
@@ -43,7 +43,7 @@ jobs:
- name: "Setup Go"
uses: actions/setup-go@v2
with:
go-version: '^1.16'
go-version: '^1.17'
- name: Cache Go Modules
uses: actions/cache@v2
with:
@@ -61,7 +61,7 @@ jobs:
build_linux:
name: Build for Linux
runs-on: ubuntu-18.04
runs-on: ubuntu-22.04
steps:
- name: "Checkout"
uses: actions/checkout@v2
@@ -70,7 +70,7 @@ jobs:
- name: "Setup Go"
uses: actions/setup-go@v2
with:
go-version: '^1.16'
go-version: '^1.17'
- name: Cache Go Modules
uses: actions/cache@v2
with:
@@ -131,7 +131,7 @@ jobs:
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./yarr-windows.zip
asset_name: yarr-${{ github.ref }}-windows32.zip
asset_name: yarr-${{ github.ref }}-windows64.zip
asset_content_type: application/zip
- name: Upload Linux
uses: actions/upload-release-asset@v1
@@ -140,5 +140,5 @@ jobs:
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./yarr-linux.zip
asset_name: yarr-${{ github.ref }}-linux32.zip
asset_name: yarr-${{ github.ref }}-linux64.zip
asset_content_type: application/zip

2
.gitignore vendored
View File

@@ -1,5 +1,3 @@
/server/assets.go
/gofeed
/_output
/yarr
*.db

3
.gitmodules vendored
View File

@@ -1,3 +0,0 @@
[submodule "src/gofeed"]
path = src/gofeed
url = http://github.com/mmcdole/gofeed

45
cmd/feed2json/main.go Normal file
View File

@@ -0,0 +1,45 @@
package main
import (
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"os"
"strings"
"github.com/nkanaev/yarr/src/parser"
)
func main() {
if len(os.Args) != 2 {
fmt.Println("usage: <script> [url|filepath]")
return
}
url := os.Args[1]
var r io.Reader
if strings.HasPrefix(url, "http") {
res, err := http.Get(url)
if err != nil {
log.Fatalf("failed to get url %s: %s", url, err)
}
r = res.Body
} else {
var err error
r, err = os.Open(url)
if err != nil {
log.Fatalf("failed to open file: %s", err)
}
}
feed, err := parser.Parse(r)
if err != nil {
log.Fatalf("failed to parse feed: %s", err)
}
body, err := json.MarshalIndent(feed, "", " ")
if err != nil {
log.Fatalf("failed to marshall feed: %s", err)
}
fmt.Println(string(body))
}

View File

@@ -1,12 +1,12 @@
package main
import (
"io/ioutil"
"flag"
"io/ioutil"
"strings"
)
var rsrc = `1 VERSIONINFO
var rsrc = `1 VERSIONINFO
FILEVERSION {VERSION_COMMA},0,0
PRODUCTVERSION {VERSION_COMMA},0,0
BEGIN

View File

@@ -85,9 +85,9 @@ func main() {
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)
outfile = fmt.Sprintf("icon_%dx%d@2x.png", res/2, res/2)
}
cmd := []string {
cmd := []string{
"sips", "-s", "format", "png", "--resampleWidth", strconv.Itoa(res),
iconFile, "--out", path.Join(iconsetDir, outfile),
}

41
cmd/readability/main.go Normal file
View File

@@ -0,0 +1,41 @@
package main
import (
"fmt"
"io"
"log"
"net/http"
"os"
"strings"
"github.com/nkanaev/yarr/src/content/readability"
)
func main() {
if len(os.Args) != 2 {
fmt.Println("usage: <script> [url]")
return
}
url := os.Args[1]
var r io.Reader
if strings.HasPrefix(url, "http") {
res, err := http.Get(url)
if err != nil {
log.Fatalf("failed to get url %s: %s", url, err)
}
r = res.Body
} else {
var err error
r, err = os.Open(url)
if err != nil {
log.Fatalf("failed to open file: %s", err)
}
}
content, err := readability.ExtractContent(r)
if err != nil {
log.Fatalf("failed to extract content: %s", err)
}
fmt.Println(content)
}

155
cmd/yarr/main.go Normal file
View File

@@ -0,0 +1,155 @@
package main
import (
"bufio"
"flag"
"fmt"
"io"
"log"
"os"
"path/filepath"
"strings"
"github.com/nkanaev/yarr/src/platform"
"github.com/nkanaev/yarr/src/server"
"github.com/nkanaev/yarr/src/storage"
)
var Version string = "0.0"
var GitHash string = "unknown"
var OptList = make([]string, 0)
func opt(envVar, defaultValue string) string {
OptList = append(OptList, envVar)
value := os.Getenv(envVar)
if value != "" {
return value
}
return defaultValue
}
func parseAuthfile(authfile io.Reader) (username, password string, err error) {
scanner := bufio.NewScanner(authfile)
for scanner.Scan() {
line := scanner.Text()
parts := strings.SplitN(line, ":", 2)
if len(parts) != 2 {
return "", "", fmt.Errorf("wrong syntax (expected `username:password`)")
}
username = parts[0]
password = parts[1]
break
}
return username, password, nil
}
func main() {
platform.FixConsoleIfNeeded()
var addr, db, authfile, auth, certfile, keyfile, basepath, logfile string
var ver, open bool
flag.CommandLine.SetOutput(os.Stdout)
flag.Usage = func() {
out := flag.CommandLine.Output()
fmt.Fprintf(out, "Usage of %s:\n", os.Args[0])
flag.PrintDefaults()
fmt.Fprintln(out, "\nThe environmental variables, if present, will be used to provide\nthe default values for the params above:")
fmt.Fprintln(out, " ", strings.Join(OptList, ", "))
}
flag.StringVar(&addr, "addr", opt("YARR_ADDR", "127.0.0.1:7070"), "address to run server on")
flag.StringVar(&basepath, "base", opt("YARR_BASE", ""), "base path of the service url")
flag.StringVar(&authfile, "auth-file", opt("YARR_AUTHFILE", ""), "`path` to a file containing username:password. Takes precedence over --auth (or YARR_AUTH)")
flag.StringVar(&auth, "auth", opt("YARR_AUTH", ""), "string with username and password in the format `username:password`")
flag.StringVar(&certfile, "cert-file", opt("YARR_CERTFILE", ""), "`path` to cert file for https")
flag.StringVar(&keyfile, "key-file", opt("YARR_KEYFILE", ""), "`path` to key file for https")
flag.StringVar(&db, "db", opt("YARR_DB", ""), "storage file `path`")
flag.StringVar(&logfile, "log-file", opt("YARR_LOGFILE", ""), "`path` to log file to use instead of stdout")
flag.BoolVar(&ver, "version", false, "print application version")
flag.BoolVar(&open, "open", false, "open the server in browser")
flag.Parse()
if ver {
fmt.Printf("v%s (%s)\n", Version, GitHash)
return
}
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
if logfile != "" {
file, err := os.OpenFile(logfile, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
if err != nil {
log.Fatal("Failed to setup log file: ", err)
}
defer file.Close()
log.SetOutput(file)
} else {
log.SetOutput(os.Stdout)
}
configPath, err := os.UserConfigDir()
if err != nil {
log.Fatal("Failed to get config dir: ", err)
}
if db == "" {
storagePath := filepath.Join(configPath, "yarr")
if err := os.MkdirAll(storagePath, 0755); err != nil {
log.Fatal("Failed to create app config dir: ", err)
}
db = filepath.Join(storagePath, "storage.db")
}
log.Printf("using db file %s", db)
var username, password string
if authfile != "" {
f, err := os.Open(authfile)
if err != nil {
log.Fatal("Failed to open auth file: ", err)
}
defer f.Close()
username, password, err = parseAuthfile(f)
if err != nil {
log.Fatal("Failed to parse auth file: ", err)
}
} else if auth != "" {
username, password, err = parseAuthfile(strings.NewReader(auth))
if err != nil {
log.Fatal("Failed to parse auth literal: ", err)
}
}
if (certfile != "" || keyfile != "") && (certfile == "" || keyfile == "") {
log.Fatalf("Both cert & key files are required")
}
store, err := storage.New(db)
if err != nil {
log.Fatal("Failed to initialise database: ", err)
}
srv := server.NewServer(store, addr)
if basepath != "" {
srv.BasePath = "/" + strings.Trim(basepath, "/")
}
if certfile != "" && keyfile != "" {
srv.CertFile = certfile
srv.KeyFile = keyfile
}
if username != "" && password != "" {
srv.Username = username
srv.Password = password
}
log.Printf("starting server at %s", srv.GetAddr())
if open {
platform.Open(srv.GetAddr())
}
platform.Start(srv)
}

47
cmd/yarr/main_test.go Normal file
View File

@@ -0,0 +1,47 @@
package main
import (
"strings"
"testing"
)
func TestPasswordFromAuthfile(t *testing.T) {
for _, tc := range [...]struct {
authfile string
expectedUsername string
expectedPassword string
expectedError bool
}{
{
authfile: "username:password",
expectedUsername: "username",
expectedPassword: "password",
expectedError: false,
},
{
authfile: "username-and-no-password",
expectedError: true,
},
{
authfile: "username:password:with:columns",
expectedUsername: "username",
expectedPassword: "password:with:columns",
expectedError: false,
},
} {
t.Run(tc.authfile, func(t *testing.T) {
username, password, err := parseAuthfile(strings.NewReader(tc.authfile))
if tc.expectedUsername != username {
t.Errorf("expected username %q, got %q", tc.expectedUsername, username)
}
if tc.expectedPassword != password {
t.Errorf("expected password %q, got %q", tc.expectedPassword, password)
}
if tc.expectedError && err == nil {
t.Errorf("expected error, got nil")
} else if !tc.expectedError && err != nil {
t.Errorf("unexpected error: %v", err)
}
})
}
}

44
doc/build.md Normal file
View File

@@ -0,0 +1,44 @@
## 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 -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"

View File

@@ -1,35 +0,0 @@
# v1.4 (2021-03-11)
- (new) keyboard shortcuts (thanks to @Duarte-Dias)
- (new) show podcast audio
- (fix) deleting feeds
- (etc) minor ui tweaks & changes
# v1.3 (2021-02-18)
- (fix) log out functionality if authentication is set
- (fix) import opml if authentication is set
- (fix) login page if authentication is set (thanks to @einschmidt)
# v1.2 (2021-02-11)
- (new) autorefresh rate
- (new) reduced bandwidth usage via stateful http headers `last-modified/etag`
- (new) show feed errors in feed management modal
- (new) `-open` flag for automatically opening the server url
- (new) `-base` flag for serving urls under non-root path (thanks to @hcl)
- (new) `-auth-file` flag for authentication
- (new) `-cert-file` & `-key-file` flags for TLS
- (fix) wrapping long words in the ui to prevent vertical scroll
- (fix) increased toolbar height in mobile/tablet layout (thanks to @einschmidt)
# v1.1 (2020-10-05)
- (new) responsive design
- (fix) server crash on favicon fetch timeout (reported by @minioin)
- (fix) handling byte order marks in feeds (reported by @ilaer)
- (fix) deleting a feed raises exception in the ui if the feed's items are shown.
# v1.0 (2020-09-24)
Initial Release

101
doc/changelog.txt Normal file
View File

@@ -0,0 +1,101 @@
# upcoming
- (new) Fever API support (thanks to @icefed)
- (fix) duplicate articles caused by the same feed addition (thanks to @adaszko)
- (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) parsing atom feed titles (thanks to @wnh)
# v2.4 (2023-08-15)
- (new) ARM build support (thanks to @tillcash & @fenuks)
- (new) auth configuration via param or env variable (thanks to @pierreprinetti)
- (new) web app manifest for an app-like experience on mobile (thanks to @qbit)
- (fix) concurrency issue crashing the app (thanks to @quoing)
- (fix) favicon visibility in dark mode (thanks to @caycaycarly for the report)
- (fix) autoloading more articles not working in certain edge cases (thanks to @fenuks for the report)
- (fix) handle Google URL redirects in "Read Here" (thanks to @cubbei for discovery)
- (fix) handle failures to extract content in "Read Here" (thanks to @grigio for the report)
- (fix) article view width for high resolution screens (thanks to @whaler-ragweed for the report)
- (fix) make newly added feed searchable (thanks to @BMorearty for the report)
- (fix) feed/article selection accessibility via arrow keys (thanks to @grigio and @tillcash)
- (fix) keyboard shortcuts in Firefox (thanks to @kaloyan13)
- (fix) keyboard shortcuts in non-English layouts (thanks to @kaloyan13)
- (fix) sorting articles with timezone information (thanks to @x2cf)
- (fix) handling links set in guid only for certain feeds (thanks to @adaszko for the report)
- (fix) crashes caused by feed icon endpoint (thanks to @adaszko)
# v2.3 (2022-05-03)
- (fix) handling encodings (thanks to @f100024 & @fserb)
- (fix) parsing xml feeds with illegal characters (thanks to @stepelu for the report)
- (fix) old articles reappearing as unread (thanks to @adaszko for the report)
- (fix) item list scrolling issue on large screens (thanks to @bielej for the report)
- (fix) keyboard shortcuts color in dark mode (thanks to @John09f9 for the report)
- (etc) autofocus when adding a new feed (thanks to @lakuapik)
# v2.2 (2021-11-20)
- (fix) windows console support (thanks to @dufferzafar for the report)
- (fix) remove html tags from article titles (thanks to Alex Went for the report)
- (etc) autoselect current folder when adding a new feed (thanks to @krkk)
- (etc) folder/feed settings menu available across all filters
# v2.1 (2021-08-16)
- (new) configuration via env variables
- (fix) missing `content-type` headers (thanks to @verahawk for the report)
- (fix) handle opml files not following the spec (thanks to @huangnauh for the report)
- (fix) pagination in unread/starred feeds (thanks to @Farow for the report)
- (fix) handling feeds with non-utf8 encodings (thanks to @fserb for the report)
- (fix) errors caused by empty feeds (thanks to @decke)
- (fix) recognize all audio mime types as podcasts (thanks to @krkk)
- (fix) ui tweaks (thanks to @Farow)
# v2.0 (2021-04-18)
- (new) user interface tweaks
- (new) feed parser fully rewritten
- (new) show youtube/vimeo iframes in "read here"
- (new) keyboard shortcuts for article scrolling & toggling "read here"
- (new) more options for auto-refresh intervals
- (fix) `-base` not serving static files (thanks to @vfaronov)
- (etc) 3rd-party dependencies reduced to the bare minimum
special thanks to @tillcash for feedback & suggestions.
# v1.4 (2021-03-11)
- (new) keyboard shortcuts (thanks to @Duarte-Dias)
- (new) show podcast audio
- (fix) deleting feeds
- (etc) minor ui tweaks & changes
# v1.3 (2021-02-18)
- (fix) log out functionality if authentication is set
- (fix) import opml if authentication is set
- (fix) login page if authentication is set (thanks to @einschmidt)
# v1.2 (2021-02-11)
- (new) autorefresh rate
- (new) reduced bandwidth usage via stateful http headers `last-modified/etag`
- (new) show feed errors in feed management modal
- (new) `-open` flag for automatically opening the server url
- (new) `-base` flag for serving urls under non-root path (thanks to @hcl)
- (new) `-auth-file` flag for authentication
- (new) `-cert-file` & `-key-file` flags for TLS
- (fix) wrapping long words in the ui to prevent vertical scroll
- (fix) increased toolbar height in mobile/tablet layout (thanks to @einschmidt)
# v1.1 (2020-10-05)
- (new) responsive design
- (fix) server crash on favicon fetch timeout (reported by @minioin)
- (fix) handling byte order marks in feeds (reported by @ilaer)
- (fix) deleting a feed raises exception in the ui if the feed's items are shown.
# v1.0 (2020-09-24)
Initial Release

19
doc/fever.md Normal file
View File

@@ -0,0 +1,19 @@
# Fever API support
Fever API is a kind of RSS HTTP API interface, because the Fever API definition is not very clear, so the implementation of Fever server and Client may have some compatibility problems.
The Fever API implemented by Yarr is based on the Fever API spec: https://github.com/DigitalDJ/tinytinyrss-fever-plugin/blob/master/fever-api.md.
Here are some Apps that have been tested to work with yarr. Feel free to test other Clients/Apps and update the list here.
> Different apps support different URL/Address formats. Please note whether the URL entered has `http://` scheme and `/` suffix.
| App | Platforms | Config Server URL |
|:------------------------------------------------------------------------- | ---------------- |:--------------------------------------------------- |
| [Reeder](https://reederapp.com/) | MacOS<br>iOS | 127.0.0.1:7070/fever<br>http://127.0.0.1:7070/fever |
| [ReadKit](https://readkit.app/) | MacOS<br>iOS | http://127.0.0.1:7070/fever |
| [Fluent Reader](https://github.com/yang991178/fluent-reader) | MacOS<br>Windows | http://127.0.0.1:7070/fever/ |
| [Unread](https://apps.apple.com/us/app/unread-an-rss-reader/id1363637349) | iOS | http://127.0.0.1:7070/fever |
| [Fiery Feeds](https://voidstern.net/fiery-feeds) | MacOS<br>iOS | http://127.0.0.1:7070/fever |
If you are having trouble using Fever, please open an issue and @icefed, thanks.

171
doc/formats.txt Normal file
View File

@@ -0,0 +1,171 @@
# model
- feed:
- title
rdf>channel>title (rss 0.90)
rdf>channel>title (rss 1.0)
rss>channel>title (rss 0.91 netscape)
rss>channel>title (rss 0.91 userland)
rss>channel>title (rss 2.0)
feed>title (atom 1.0)
- site_url
rdf>channel>link (rss 0.90)
rdf>channel>link (rss 1.0)
rss>channel>link (rss 0.91 netscape)
rss>channel>link (rss 0.91 userland)
rss>channel>link (rss 2.0)
feed>link (atom 1.0)
- item:
- guid
rss>channel>guid (rss 2.0)
feed>entry>id (atom 1.0)
- date
rdf>item>dc:date (rss 1.0)
rss>channel>pubDate (rss 2.0)
feed>entry>updated (atom 1.0)
feed>entry>published (atom 1.0)
- url
rdf>item>link (rss 0.90)
rdf>item>link (rss 1.0)
rss>channel>item>link (rss 0.91 netscape)
rss>channel>item>link (rss 0.91 userland)
rss>channel>item>link (rss 2.0)
feed>entry>link[rel=alternate] (atom 1.0)
- title
rdf>item>title (rss 0.90)
rdf>item>title (rss 1.0)
rss>channel>item>title (rss 0.91 netscape)
rss>channel>item>title (rss 0.91 userland)
rss>channel>item>title (rss 2.0)
feed>entry>title (atom 1.0)
- content
rss>channel>item>description (rss 0.91 netscape)
rss>channel>item>description (rss 0.91 userland)
rss>channel>item>description (rss 2.0)
rdf>item>description (rss 1.0)
rdf>item>content:encoded (rss 1.0)
feed>entry>content (atom 1.0)
- image_url
rss>item>media:thumbnail:url (rss 2.0 media)
feed>entry>enclosure[rel='image/*'] (atom 1.0) ???
- audio_url
rss>item>enclosure:url (audio/*) (rss 2.0)
feed>entry>enclosure (audio/*') (atom 1.0) ???
# specs
- rss
https://en.wikipedia.org/wiki/RSS
- 0.90:
https://www.rssboard.org/rss-0-9-0
https://web.archive.org/web/20001208063100/http://my.netscape.com/publish/help/quickstart.html
- 0.91 (netscape)
https://www.rssboard.org/rss-0-9-1-netscape
- 0.91 (userland)
https://www.rssboard.org/rss-0-9-1
- 0.92
https://www.rssboard.org/rss-0-9-2
by userland, no significant changes from 0.91
- 0.93 (withdrawn)
http://backend.userland.com/rss093
- 0.94 (withdrawn)
- 1.0
https://web.resource.org/rss/1.0/
https://web.archive.org/web/20021014094554/https://web.resource.org/rss/1.0/spec
reintroduced rdf from 0.90, added dublincore namespaces etc
namespaces:
content: http://purl.org/rss/1.0/modules/content/
dc: http://purl.org/dc/elements/1.1/
- 2.0
https://cyber.harvard.edu/rss/rss.html
https://www.rssboard.org/rss-2-0
- atom
https://en.wikipedia.org/wiki/Atom_(Web_standard)
- 0.3
https://support.google.com/merchants/answer/160598?hl=en
http://web.archive.org/web/20060811235523/http://www.mnot.net/drafts/draft-nottingham-atom-format-02.html
- 1.0
https://tools.ietf.org/html/rfc4287
https://validator.w3.org/feed/docs/atom.html
- json
https://en.wikipedia.org/wiki/JSON_Feed
- 1.0
https://jsonfeed.org/version/1
- 1.1
https://jsonfeed.org/version/1.1
- media
https://www.rssboard.org/media-rss
xml namespace for:
- rss 2.0
- atom 1.0
# extensions
- feedburner
https://en.wikipedia.org/wiki/FeedBurner
- media
https://www.rssboard.org/media-rss
initially for rss 2.0, used in atom 1.0 as well (youtube)
- itunes podcasts
https://help.apple.com/itc/podcasts_connect/#/itcb54353390
https://github.com/simplepie/simplepie-ng/wiki/Spec:-iTunes-Podcast-RSS
- google podcasts
https://support.google.com/podcast-publishers/answer/9889544?visit_id=637523492443301715-1225759684&rd=1
# parsers
https://github.com/kurtmckee/feedparser
https://github.com/mmcdole/gofeed
https://github.com/miniflux/v2/tree/2.0.28/reader/
https://github.com/Ranchero-Software/RSParser
https://github.com/feederco/feeder-parser
https://github.com/mmcdole/gofeed/commit/9665eb31016cef3d15ab85574bc6fdbe890cd252
# platforms
A list of centralized content providers worth keeping track of.
The parser should be reasonably handle content provided by them.
Delete any from the list in case they drop support of web feeds.
- blogger
- cnblogs
- flickr
- hatenablog
- livejournal
- medium
- posthaven
- reddit
- substack
- tumblr
- vimeo
- wordpress
- youtube
# links
https://indieweb.org/feed#Criticism
https://inessential.com/2013/03/18/brians_stupid_feed_tricks

27
doc/thirdparty.txt Normal file
View File

@@ -0,0 +1,27 @@
Below is the list of 3-rd party code directly included & rewritten
to suit the author's needs & preferences.
The licenses are included, and the authorship comments are left intact.
- readability
https://github.com/miniflux/v2 (commit:31435ef) Apache 2.0
removed goquery dependency
removed assisting utility structs (need another way to debug node scores)
- sanitizer
https://github.com/miniflux/v2 (commit:3cb04b2) Apache 2.0
whitelist changed to the ones from https://github.com/cure53/DOMPurify:
- allowed tags
- allowed uri schemes
- added svg whitelist
- systray
https://github.com/getlantern/systray (commit:2c0986d) Apache 2.0
removed golog dependency
- fixconsole
https://github.com/apenwarr/fixconsole (commit:5a9f648) Apache 2.0
removed `w32` dependency

View File

@@ -1,4 +0,0 @@
- fix: loading items (by scrolling down) is glitching while feeds are refreshing
- ref: switch to the standard logger
- ref: drop goquery, switch to cascadia
- ref: organize "server" package using KonMari method

44
etc/dockerfile.arm Normal file
View File

@@ -0,0 +1,44 @@
FROM ubuntu:20.04
# Install GCC
RUN apt update
RUN apt install -y \
wget build-essential \
gcc-aarch64-linux-gnu \
binutils-aarch64-linux-gnu binutils-aarch64-linux-gnu-dbg \
gcc-arm-linux-gnueabihf \
binutils-arm-linux-gnueabihf binutils-arm-linux-gnueabihf-dbg
RUN env DEBIAN_FRONTEND=noninteractive \
apt install -y qemu-user qemu-user-static
# Install Golang
RUN wget --quiet https://go.dev/dl/go1.18.2.linux-amd64.tar.gz && \
rm -rf /usr/local/go && \
tar -C /usr/local -xzf go1.18.2.linux-amd64.tar.gz
ENV PATH=$PATH:/usr/local/go/bin
# Copy source code
WORKDIR /root/src
RUN mkdir /root/out
COPY . .
# Build ARM64
RUN env \
CC=aarch64-linux-gnu-gcc \
CGO_ENABLED=1 \
GOOS=linux GOARCH=arm64 \
go build \
-tags "sqlite_foreign_keys linux" \
-ldflags="-s -w" \
-o /root/out/yarr.arm64 ./cmd/yarr
RUN env \
CC=arm-linux-gnueabihf-gcc \
CGO_ENABLED=1 \
GOOS=linux GOARCH=arm GOARM=7 \
go build \
-tags "sqlite_foreign_keys linux" \
-ldflags="-s -w" \
-o /root/out/yarr.arm7 ./cmd/yarr
CMD ["/bin/bash"]

23
etc/install-linux.sh Normal file
View File

@@ -0,0 +1,23 @@
#!/bin/bash
cat >"$HOME/.local/share/applications/yarr.desktop" <<END
[Desktop Entry]
Name=yarr
Exec=$HOME/.local/bin/yarr -open
Icon=yarr
Type=Application
Categories=Internet;
END
cat >"$HOME/.local/share/icons/yarr.svg" <<END
<?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">
<circle cx="12" cy="5" r="3" stroke-width="4" stroke="#ffffff"></circle>
<line x1="12" y1="22" x2="12" y2="8" stroke-width="4" stroke="#ffffff"></line>
<path d="M5 12H2a10 10 0 0 0 20 0h-3" stroke-width="4" stroke="#ffffff"></path>
<circle cx="12" cy="5" r="3"></circle>
<line x1="12" y1="22" x2="12" y2="8"></line>
<path d="M5 12H2a10 10 0 0 0 20 0h-3"></path>
</svg>
END

Binary file not shown.

Before

Width:  |  Height:  |  Size: 727 KiB

After

Width:  |  Height:  |  Size: 173 KiB

12
go.mod
View File

@@ -1,13 +1,11 @@
module github.com/nkanaev/yarr
go 1.16
go 1.17
require (
github.com/PuerkitoBio/goquery v1.5.1
github.com/getlantern/systray v1.0.4
github.com/mattn/go-sqlite3 v1.14.0
github.com/mmcdole/gofeed v1.0.0
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e
github.com/mattn/go-sqlite3 v1.14.7
golang.org/x/net v0.8.0
golang.org/x/sys v0.6.0
)
replace github.com/mmcdole/gofeed => ./src/gofeed
require golang.org/x/text v0.8.0 // indirect

93
go.sum
View File

@@ -1,62 +1,39 @@
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/PuerkitoBio/goquery v1.5.1 h1:PSPBGne8NIUWw+/7vFBV+kG2J/5MOjbzc7154OaKCSE=
github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo=
github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
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/getlantern/context v0.0.0-20190109183933-c447772a6520 h1:NRUJuo3v3WGC/g5YiyF790gut6oQr5f3FBI88Wv0dx4=
github.com/getlantern/context v0.0.0-20190109183933-c447772a6520/go.mod h1:L+mq6/vvYHKjCX2oez0CgEAJmbq1fbb/oNJIWQkBybY=
github.com/getlantern/errors v0.0.0-20190325191628-abdb3e3e36f7 h1:6uJ+sZ/e03gkbqZ0kUG6mfKoqDb4XMAzMIwlajq19So=
github.com/getlantern/errors v0.0.0-20190325191628-abdb3e3e36f7/go.mod h1:l+xpFBrCtDLpK9qNjxs+cHU6+BAdlBaxHqikB6Lku3A=
github.com/getlantern/golog v0.0.0-20190830074920-4ef2e798c2d7 h1:guBYzEaLz0Vfc/jv0czrr2z7qyzTOGC9hiQ0VC+hKjk=
github.com/getlantern/golog v0.0.0-20190830074920-4ef2e798c2d7/go.mod h1:zx/1xUUeYPy3Pcmet8OSXLbF47l+3y6hIPpyLWoR9oc=
github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7 h1:micT5vkcr9tOVk1FiH8SWKID8ultN44Z+yzd2y/Vyb0=
github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7/go.mod h1:dD3CgOrwlzca8ed61CsZouQS5h5jIzkK9ZWrTcf0s+o=
github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55 h1:XYzSdCbkzOC0FDNrgJqGRo8PCMFOBFL9py72DRs7bmc=
github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55/go.mod h1:6mmzY2kW1TOOrVy+r41Za2MxXM+hhqTtY3oBKd2AgFA=
github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f h1:wrYrQttPS8FHIRSlsrcuKazukx/xqO/PpLZzZXsF+EA=
github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA=
github.com/getlantern/systray v1.0.4 h1:qJ/bOlYhn5nsj2FejutWWVFMbhOkYhsChoy26OjgZgU=
github.com/getlantern/systray v1.0.4/go.mod h1:AecygODWIsBquJCJFop8MEQcJbWFfw/1yWbVabNgpCM=
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/mattn/go-sqlite3 v1.14.0 h1:mLyGNKR8+Vv9CAU7PphKa2hkEqxxhn8i32J6FPj1/QA=
github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus=
github.com/mmcdole/goxpp v0.0.0-20181012175147-0068e33feabf h1:sWGE2v+hO0Nd4yFU/S/mDBM5plIU8v/Qhfz41hkDIAI=
github.com/mmcdole/goxpp v0.0.0-20181012175147-0068e33feabf/go.mod h1:pasqhqstspkosTneA62Nc+2p9SOBBYAPbnmRRWPQ0V8=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw=
github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0=
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/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
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/urfave/cli v1.22.3/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/mattn/go-sqlite3 v1.14.7 h1:fxWBnXkxfM6sRiuH3bqJ4CfzZojMOLVc0UTsTglEghA=
github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
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/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
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/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
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/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9 h1:YTzHMGlqJu67/uEo1lBv0n3wBXhXNeUbB1XfN2vmTm0=
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
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.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
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=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
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=

View File

@@ -1,4 +1,4 @@
VERSION=1.4
VERSION=2.4
GITHASH=$(shell git rev-parse --short=8 HEAD)
CGO_ENABLED=1
@@ -8,29 +8,26 @@ GO_LDFLAGS := $(GO_LDFLAGS) -X 'main.Version=$(VERSION)' -X 'main.GitHash=$(GITH
build_default:
mkdir -p _output
go build -tags "sqlite_foreign_keys release" -ldflags="$(GO_LDFLAGS)" -o _output/yarr src/main.go
go build -tags "sqlite_foreign_keys" -ldflags="$(GO_LDFLAGS)" -o _output/yarr ./cmd/yarr
build_macos:
set GOOS=darwin
set GOARCH=amd64
mkdir -p _output/macos
go build -tags "sqlite_foreign_keys release macos" -ldflags="$(GO_LDFLAGS)" -o _output/macos/yarr src/main.go
GOOS=darwin GOARCH=amd64 go build -tags "sqlite_foreign_keys macos" -ldflags="$(GO_LDFLAGS)" -o _output/macos/yarr ./cmd/yarr
cp src/platform/icon.png _output/macos/icon.png
go run bin/package_macos.go -outdir _output/macos -version "$(VERSION)"
go run ./cmd/package_macos -outdir _output/macos -version "$(VERSION)"
build_linux:
set GOOS=linux
set GOARCH=386
mkdir -p _output/linux
go build -tags "sqlite_foreign_keys release linux" -ldflags="$(GO_LDFLAGS)" -o _output/linux/yarr src/main.go
GOOS=linux GOARCH=amd64 go build -tags "sqlite_foreign_keys linux" -ldflags="$(GO_LDFLAGS)" -o _output/linux/yarr ./cmd/yarr
build_windows:
set GOOS=windows
set GOARCH=386
mkdir -p _output/windows
go run bin/generate_versioninfo.go -version "$(VERSION)" -outfile src/platform/versioninfo.rc
go run ./cmd/generate_versioninfo -version "$(VERSION)" -outfile src/platform/versioninfo.rc
windres -i src/platform/versioninfo.rc -O coff -o src/platform/versioninfo.syso
go build -tags "sqlite_foreign_keys release windows" -ldflags="$(GO_LDFLAGS) -H windowsgui" -o _output/windows/yarr.exe src/main.go
GOOS=windows GOARCH=amd64 go build -tags "sqlite_foreign_keys windows" -ldflags="$(GO_LDFLAGS) -H windowsgui" -o _output/windows/yarr.exe ./cmd/yarr
serve:
go run -tags "sqlite_foreign_keys" src/main.go -db local.db
go run -tags "sqlite_foreign_keys" ./cmd/yarr -db local.db
test:
cd src && go test -tags "sqlite_foreign_keys" ./...

View File

@@ -3,72 +3,36 @@
**yarr** (yet another rss reader) is a web-based feed aggregator which can be used both
as a desktop application and a personal self-hosted server.
It is written in Go with the frontend in Vue.js. The storage is backed by SQLite.
The app is a single binary with an embedded database (SQLite).
![screenshot](etc/promo.png)
## usage
The latest prebuilt binaries for Linux/MacOS/Windows are available
[here](https://github.com/nkanaev/yarr/releases/latest).
The latest prebuilt binaries for Linux/MacOS/Windows AMD64 are available
[here](https://github.com/nkanaev/yarr/releases/latest). Installation instructions:
### macos
* MacOS
Download `yarr-*-macos64.zip`, unzip it, place `yarr.app` in `/Applications` folder.
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".
The binaries are not signed, because the author doesn't want to buy a certificate.
Apple hates cheapskate developers, therefore the OS will refuse to run the application.
To bypass these measures, you can run the command:
* Windows
xattr -d com.apple.quarantine /Applications/yarr.app
Download `yarr-*-windows64.zip`, unzip it, open `yarr.exe`, click the anchor system tray icon, select "Open".
### windows
* Linux
Download `yarr-*-windows32.zip`, unzip it, place wherever you'd like to
(`C:\Program Files` or Recycle Bin). Create a shortcut manually if you'd like to.
Download `yarr-*-linux64.zip`, unzip it, place `yarr` in `$HOME/.local/bin`
and run [the script](etc/install-linux.sh).
Microsoft doesn't like cheapskate developers too,
but might only gently warn you about that, which you can safely ignore.
### linux
The Linux version doesn't come with the desktop environment integration.
For easy access on DE it is recommended to create a desktop menu entry by
by following the steps below:
unzip -x yarr*.zip
sudo mv yarr /usr/local/bin/yarr
sudo nano /usr/local/share/applications/yarr.desktop
and pasting the content:
[Desktop Entry]
Name=yarr
Exec=/usr/local/bin/yarr -open
Icon=rss
Type=Application
Categories=Internet;
[macos-open]: https://support.apple.com/en-gb/guide/mac-help/mh40616/mac
For self-hosting, see `yarr -h` for auth, tls & server configuration flags.
## build
See more:
Install `Go >= 1.16` and `gcc`. Get the source code:
git clone --recurse-submodules 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
# ... or start a dev server locally
make serve # starts a server at http://localhost:7070
# ... or build a docker image
docker build -t yarr .
* [Building from source code](doc/build.md)
* [Fever API support](doc/fever.md)
## credits

View File

@@ -4,8 +4,9 @@ import (
"embed"
"html/template"
"io"
"io/ioutil"
"io/fs"
"io/ioutil"
"log"
"os"
)
@@ -23,15 +24,24 @@ func (afs assetsfs) Open(name string) (fs.File, error) {
return os.DirFS("src/assets").Open(name)
}
func Render(path string, writer io.Writer, data interface{}) {
func Template(path string) *template.Template {
var tmpl *template.Template
tmpl, found := FS.templates[path]
if !found {
tmpl = template.Must(template.New(path).Delims("{%", "%}").Funcs(template.FuncMap{
"inline": func(svg string) template.HTML {
svgfile, _ := FS.Open("graphicarts/" + svg)
content, _ := ioutil.ReadAll(svgfile)
svgfile.Close()
svgfile, err := FS.Open("graphicarts/" + svg)
// should never happen
if err != nil {
log.Fatal(err)
}
defer svgfile.Close()
content, err := ioutil.ReadAll(svgfile)
// should never happen
if err != nil {
log.Fatal(err)
}
return template.HTML(content)
},
}).ParseFS(FS, path))
@@ -39,6 +49,11 @@ func Render(path string, writer io.Writer, data interface{}) {
FS.templates[path] = tmpl
}
}
return tmpl
}
func Render(path string, writer io.Writer, data interface{}) {
tmpl := Template(path)
tmpl.Execute(writer, data)
}

View File

@@ -1,5 +1,3 @@
// +build release
package assets
import "embed"
@@ -8,8 +6,9 @@ import "embed"
//go:embed graphicarts
//go:embed javascripts
//go:embed stylesheets
//go:embed manifest.json
var embedded embed.FS
func init() {
FS.embedded = &embedded
FS.embedded = &embedded
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 395 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,9 @@
<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">
<circle cx="12" cy="5" r="3" stroke-width="4" stroke="#ffffff"></circle>
<line x1="12" y1="22" x2="12" y2="8" stroke-width="4" stroke="#ffffff"></line>
<path d="M5 12H2a10 10 0 0 0 20 0h-3" stroke-width="4" stroke="#ffffff"></path>
<circle cx="12" cy="5" r="3"></circle>
<line x1="12" y1="22" x2="12" y2="8"></line>
<path d="M5 12H2a10 10 0 0 0 20 0h-3"></path>
</svg>

After

Width:  |  Height:  |  Size: 603 B

View File

@@ -1 +1 @@
<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-more-vertical"><circle cx="12" cy="12" r="1"></circle><circle cx="12" cy="5" r="1"></circle><circle cx="12" cy="19" r="1"></circle></svg>
<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-folder-minus"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"></path><line x1="9" y1="14" x2="15" y2="14"></line></svg>

Before

Width:  |  Height:  |  Size: 341 B

After

Width:  |  Height:  |  Size: 361 B

View File

@@ -0,0 +1 @@
<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-folder-plus"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"></path><line x1="12" y1="11" x2="12" y2="17"></line><line x1="9" y1="14" x2="15" y2="14"></line></svg>

After

Width:  |  Height:  |  Size: 405 B

View File

@@ -0,0 +1 @@
<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-globe"><circle cx="12" cy="12" r="10"></circle><line x1="2" y1="12" x2="22" y2="12"></line><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"></path></svg>

After

Width:  |  Height:  |  Size: 409 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 515 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 699 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 939 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1010 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -1 +0,0 @@
<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-list"><line x1="8" y1="6" x2="21" y2="6"></line><line x1="8" y1="12" x2="21" y2="12"></line><line x1="8" y1="18" x2="21" y2="18"></line><line x1="3" y1="6" x2="3.01" y2="6"></line><line x1="3" y1="12" x2="3.01" y2="12"></line><line x1="3" y1="18" x2="3.01" y2="18"></line></svg>

Before

Width:  |  Height:  |  Size: 482 B

View File

@@ -1 +0,0 @@
<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-settings"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg>

Before

Width:  |  Height:  |  Size: 1011 B

View File

@@ -1 +0,0 @@
<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-trash-2"><polyline points="3 6 5 6 21 6"></polyline><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path><line x1="10" y1="11" x2="10" y2="17"></line><line x1="14" y1="11" x2="14" y2="17"></line></svg>

Before

Width:  |  Height:  |  Size: 448 B

View File

@@ -1 +1 @@
<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-chevron-down"><polyline points="6 9 12 15 18 9"></polyline></svg>
<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-trash"><polyline points="3 6 5 6 21 6"></polyline><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path></svg>

Before

Width:  |  Height:  |  Size: 269 B

After

Width:  |  Height:  |  Size: 356 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 602 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 715 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 722 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Some files were not shown because too many files have changed in this diff Show More