Compare commits
No commits in common. "af016fb99ac44df4a6acdd435cddaa5ce0d038b9" and "b4cf16ab838c5ca51a35f33aee89382055c0fdc8" have entirely different histories.
af016fb99a
...
b4cf16ab83
21 changed files with 109 additions and 609 deletions
22
LICENSE
22
LICENSE
|
@ -1,22 +0,0 @@
|
||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2024 Wesley Moore
|
|
||||||
Copyright (c) 2020 Huhu
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
10
Makefile
10
Makefile
|
@ -1,10 +0,0 @@
|
||||||
list:
|
|
||||||
@echo "Available targets:"
|
|
||||||
@echo "- build"
|
|
||||||
@echo "- deploy"
|
|
||||||
|
|
||||||
build:
|
|
||||||
zola build
|
|
||||||
|
|
||||||
deploy: build
|
|
||||||
rsync -avzhP --delete public/ hardforze.binarytrance.com:infrastructure/volumes/www/rsspls.7bit.org/
|
|
27
README.md
27
README.md
|
@ -1,27 +0,0 @@
|
||||||
rsspls.7bit.org
|
|
||||||
===============
|
|
||||||
|
|
||||||
This is the source of [the website for RSS Please][rsspls].
|
|
||||||
|
|
||||||
Contributing
|
|
||||||
------------
|
|
||||||
|
|
||||||
To contribute:
|
|
||||||
|
|
||||||
1. Create an account on [forge.wezm.net](https://forge.wezm.net) by signing in
|
|
||||||
with your GitHub account.
|
|
||||||
2. Fork [the repo](https://forge.wezm.net/wezm/rsspls.7bit.org)
|
|
||||||
3. Make you changes
|
|
||||||
4. Open a pull request
|
|
||||||
|
|
||||||
Development
|
|
||||||
-----------
|
|
||||||
|
|
||||||
The site is built with [Zola]. Follow the [Zola installation instructions][install] to
|
|
||||||
get started.
|
|
||||||
|
|
||||||
Run `zola serve` to serve the website locally while you edit it.
|
|
||||||
|
|
||||||
[rsspls]: https://rsspls.7bit.org/
|
|
||||||
[Zola]: https://www.getzola.org/
|
|
||||||
[install]: https://www.getzola.org/documentation/getting-started/installation/
|
|
|
@ -1,5 +1,3 @@
|
||||||
title = "RSS Please"
|
|
||||||
|
|
||||||
# The URL the site will be built for
|
# The URL the site will be built for
|
||||||
base_url = "https://rsspls.7bit.org"
|
base_url = "https://rsspls.7bit.org"
|
||||||
|
|
||||||
|
@ -18,13 +16,11 @@ theme = "juice"
|
||||||
# Whether to do syntax highlighting
|
# Whether to do syntax highlighting
|
||||||
# Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola
|
# Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola
|
||||||
highlight_code = true
|
highlight_code = true
|
||||||
highlight_theme = "OneHalfLight"
|
|
||||||
smart_punctuation = true
|
smart_punctuation = true
|
||||||
|
|
||||||
[extra]
|
[extra]
|
||||||
email = "wes@wezm.net"
|
email = "wes@wezm.net"
|
||||||
author = "Wesley Moore"
|
author = "Wesley Moore"
|
||||||
homepage = "https://www.wezm.net/"
|
|
||||||
juice_logo_name = "RSS Please"
|
juice_logo_name = "RSS Please"
|
||||||
juice_logo_path = "feed-icon.svg"
|
juice_logo_path = "feed-icon.svg"
|
||||||
juice_extra_menu = [
|
juice_extra_menu = [
|
||||||
|
|
|
@ -1,11 +1,17 @@
|
||||||
+++
|
+++
|
||||||
title = "RSS Please"
|
title = "Home"
|
||||||
description = "Generate RSS feeds from web pages"
|
|
||||||
sort_by = "weight"
|
sort_by = "weight"
|
||||||
#paginate_by = 10
|
#paginate_by = 10
|
||||||
+++
|
+++
|
||||||
|
|
||||||
<div class="text-center">
|
<div align="center">
|
||||||
|
<strong>A small tool (<code>rsspls</code>) to generate RSS feeds from web pages that lack them.
|
||||||
|
It runs on BSD, Linux, macOS, Windows, and more.</strong>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
<a href="https://cirrus-ci.com/github/wezm/rsspls">
|
<a href="https://cirrus-ci.com/github/wezm/rsspls">
|
||||||
<img src="https://api.cirrus-ci.com/github/wezm/rsspls.svg" alt="Build Status"></a>
|
<img src="https://api.cirrus-ci.com/github/wezm/rsspls.svg" alt="Build Status"></a>
|
||||||
<a href="https://crates.io/crates/rsspls">
|
<a href="https://crates.io/crates/rsspls">
|
||||||
|
@ -16,11 +22,7 @@ sort_by = "weight"
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
About
|
`rsspls` generates RSS feeds from web pages. Example use cases:
|
||||||
-----
|
|
||||||
|
|
||||||
`rsspls` generates RSS feeds from web pages using [CSS selectors][selectors] to extracts
|
|
||||||
parts of the page to turn into a feed. Example use cases:
|
|
||||||
|
|
||||||
* Create a feed for a blog that does not have one so that you will know when
|
* Create a feed for a blog that does not have one so that you will know when
|
||||||
there are new posts.
|
there are new posts.
|
||||||
|
@ -31,28 +33,13 @@ parts of the page to turn into a feed. Example use cases:
|
||||||
* Create a feed of the product page for a company, so you know when new
|
* Create a feed of the product page for a company, so you know when new
|
||||||
products are added.
|
products are added.
|
||||||
|
|
||||||
You can subscribe to the generated feeds in your feed reader, either by
|
The idea is that you will then subscribe to the generated feeds in your feed
|
||||||
referring to them locally or by publishing them on a web server.
|
reader. This will typically require the feeds to be hosted via a web server.
|
||||||
|
|
||||||
<div class="text-center">
|
Credits
|
||||||
<a href="/install/" class="link-button">Install</a>
|
-------
|
||||||
<a href="/documentation/" class="link-button">Documentation</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
FAQ
|
* [RSS feed icon](http://www.feedicons.com/) by The Mozilla Foundation
|
||||||
---
|
|
||||||
|
|
||||||
Frequently anticipated questions:
|
|
||||||
|
|
||||||
* _Does `rsspls` require a runtime or dependencies?_<br>
|
|
||||||
No. It's implemented in Rust and is a single-file native binary.
|
|
||||||
* _The screenshot at the top of the page looks like classic Mac OS.
|
|
||||||
Does it run on this system?_<br>
|
|
||||||
No. The screenshot _is_ from Mac OS 8 but it shows a [ssheven] window
|
|
||||||
logged in to a Linux system running `rsspls`.
|
|
||||||
* _Why did you use a screenshot from Mac OS 8?_<br>
|
|
||||||
I didn't want the screenshot to look like it was from any particular
|
|
||||||
modern system, so I picked an old one with a great design.
|
|
||||||
|
|
||||||
Licence
|
Licence
|
||||||
-------
|
-------
|
||||||
|
@ -64,11 +51,8 @@ This project is dual licenced under either of:
|
||||||
|
|
||||||
at your option.
|
at your option.
|
||||||
|
|
||||||
Credits
|
[rustup]: https://www.rust-lang.org/tools/install
|
||||||
-------
|
[toml]: https://toml.io/
|
||||||
|
|
||||||
* [RSS feed icon](http://www.feedicons.com/) by The Mozilla Foundation
|
|
||||||
* Website theme based on [Juice](https://github.com/huhu/juice) by HuHu
|
|
||||||
|
|
||||||
[selectors]: https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors
|
[selectors]: https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors
|
||||||
[ssheven]: https://github.com/cy384/ssheven
|
[cron]: https://en.wikipedia.org/wiki/Cron
|
||||||
|
[timers]: https://wiki.archlinux.org/title/Systemd/Timers
|
||||||
|
|
|
@ -4,49 +4,7 @@ description = "Documentation"
|
||||||
weight = 2
|
weight = 2
|
||||||
+++
|
+++
|
||||||
|
|
||||||
## How it Works
|
### Configuration
|
||||||
|
|
||||||
`rsspls` fetches each page specified by the configuration and extracts elements
|
|
||||||
from the page using [CSS selectors][selectors]. For example elements are matched
|
|
||||||
to determine the title and content of the feed entry. The generated feeds are
|
|
||||||
written to an output directory. HTTP caching is used to only update the feed
|
|
||||||
when the source page changes.
|
|
||||||
|
|
||||||
## Supported Platforms
|
|
||||||
|
|
||||||
`rsspls` should work on all [platforms supported by the Rust compiler][platforms]
|
|
||||||
including Linux, macOS, Windows, and BSD. Pre-compiled binaries are available
|
|
||||||
for common platforms. See [the install page](@/install.md) for details.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
rsspls [OPTIONS] -o OUTPUT_DIR
|
|
||||||
|
|
||||||
OPTIONS:
|
|
||||||
-h, --help
|
|
||||||
Prints this help information
|
|
||||||
|
|
||||||
-c, --config
|
|
||||||
Specify the path to the configuration file.
|
|
||||||
$XDG_CONFIG_HOME/rsspls/feeds.toml is used if not supplied.
|
|
||||||
|
|
||||||
-o, --output
|
|
||||||
Directory to write generated feeds to.
|
|
||||||
|
|
||||||
-V, --version
|
|
||||||
Prints version information
|
|
||||||
|
|
||||||
FILES:
|
|
||||||
~/$XDG_CONFIG_HOME/rsspls/feeds.toml rsspls configuration file.
|
|
||||||
~/$XDG_CONFIG_HOME/rsspls Configuration directory.
|
|
||||||
~/XDG_CACHE_HOME/rsspls Cache directory.
|
|
||||||
|
|
||||||
Note: XDG_CONFIG_HOME defaults to ~/.config, XDG_CACHE_HOME
|
|
||||||
defaults to ~/.cache.
|
|
||||||
```
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
Unless specified via the `--config` command line option `rsspls` reads its
|
Unless specified via the `--config` command line option `rsspls` reads its
|
||||||
configuration from one of the following paths:
|
configuration from one of the following paths:
|
||||||
|
@ -62,7 +20,7 @@ The configuration file is in [TOML][toml] format.
|
||||||
The parts of the page to extract for the feed are specified using [CSS
|
The parts of the page to extract for the feed are specified using [CSS
|
||||||
selectors][selectors].
|
selectors][selectors].
|
||||||
|
|
||||||
### Annotated Sample Configuration
|
#### Annotated Sample Configuration
|
||||||
|
|
||||||
The sample file below demonstrates all the parts of the configuration.
|
The sample file below demonstrates all the parts of the configuration.
|
||||||
|
|
||||||
|
@ -177,172 +135,49 @@ The first example above (for my blog WezM.net) matches HTML that looks like this
|
||||||
</section>
|
</section>
|
||||||
```
|
```
|
||||||
|
|
||||||
### output
|
#### More Detail on Date Handling
|
||||||
|
|
||||||
Optional output directory to write the feeds to. If not specified it must be
|
The `date` key in the configuration can be a string or a table. If it's a
|
||||||
supplied via the `--output` command line option. Directory will be created if
|
string then it's used as selector to find the element containing the date and
|
||||||
it does not exist.
|
`rsspls` will attempt to automatically parse the value. If automatic parsing
|
||||||
|
fails you can manually specify the format using the table form of `date`:
|
||||||
### proxy
|
|
||||||
|
|
||||||
Optional proxy address. If specified, all requests will be routed through it.
|
|
||||||
The address needs to be in the format: `protocol://ip_address:port`
|
|
||||||
The supported protocols are: http, https, socks and socks5h.
|
|
||||||
|
|
||||||
The proxy for http and https requests can also be specified with the
|
|
||||||
environment variables `http_proxy` and `HTTPS_PROXY` respectively.
|
|
||||||
The config file takes precedence over environment variables.
|
|
||||||
|
|
||||||
### feed.title
|
|
||||||
|
|
||||||
The title of the channel in the generated feed.
|
|
||||||
|
|
||||||
### feed.filename
|
|
||||||
|
|
||||||
The output filename to write this feed to. Note: this is a filename only, not a
|
|
||||||
path. It should not contain slashes. It will be written to the [output](#output)
|
|
||||||
directory.
|
|
||||||
|
|
||||||
### feed.config.url
|
|
||||||
|
|
||||||
The URL of the web page to generate the feed from. The page at this address
|
|
||||||
will be fetched processed to turn it into a feed.
|
|
||||||
|
|
||||||
### feed.config.item
|
|
||||||
|
|
||||||
A CSS selector to select elements on the page that represent items in the feed.
|
|
||||||
The other CSS selectors match elements inside the elements that this selector
|
|
||||||
matches.
|
|
||||||
|
|
||||||
### feed.config.heading
|
|
||||||
|
|
||||||
A CSS selector relative to `item` to an element that will supply the title for
|
|
||||||
the item in the feed.
|
|
||||||
|
|
||||||
|
|
||||||
### feed.config.link
|
|
||||||
|
|
||||||
CSS selector relative to `item` to an element that will supply the
|
|
||||||
link for the item in the feed.
|
|
||||||
|
|
||||||
**Note:** This element must have a `href` attribute.
|
|
||||||
|
|
||||||
**Note:** If not supplied `rsspls` will attempt to use the
|
|
||||||
`feed.config.heading` selector as the `link` element for backwards compatibility
|
|
||||||
with earlier versions. A warning message will be emitted in this case. It is
|
|
||||||
recommended to specify the `link` selector explicitly.
|
|
||||||
|
|
||||||
|
|
||||||
### feed.config.summary
|
|
||||||
|
|
||||||
Optional CSS selector relative to `item` that will supply the content of the RSS item.
|
|
||||||
|
|
||||||
### feed.config.date
|
|
||||||
|
|
||||||
The optional `date` key in the configuration can be a string or a table. If it's a
|
|
||||||
string then it's used as CSS selector relative to `item` to find the element
|
|
||||||
containing the date and `rsspls` will attempt to automatically parse the value.
|
|
||||||
|
|
||||||
If automatic parsing fails you can manually specify the format using the table
|
|
||||||
form of `date`, which looks like this:
|
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[feed.config.date]
|
[feed.config.date]
|
||||||
selector = "time" # required
|
selector = "time" # required
|
||||||
type = "Date"
|
type = "Date"
|
||||||
format = "[day padding:none]/[month padding:none]/[year]" # will parse 1/2/1934 style dates
|
format = "[day padding:none]/[month padding:none]/[year]"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
* `type` is `Date` when you want to parse just a date. Use `DateTime` if you're
|
||||||
|
parsing a date and time with the format. Defaults to `DateTime`.
|
||||||
|
* `format` is a format description using the syntax described on this page:
|
||||||
|
<https://time-rs.github.io/book/api/format-description.html>.
|
||||||
|
|
||||||
If the element matched by the `date` selector is a `<time>` element then
|
If the element matched by the `date` selector is a `<time>` element then
|
||||||
`rsspls` will first try to parse the value in the `datetime` attribute if
|
`rsspls` will first try to parse the value in the `datetime` attribute if
|
||||||
present. If the attribute is missing or the element is not a `time` element
|
present. If the attribute is missing or the element is not a `time` element
|
||||||
then `rsspls` will use the supplied format or attempt automatic parsing of the
|
then `rsspls` will use the supplied format or attempt automatic parsing of the
|
||||||
text content of the element.
|
text content of the element.
|
||||||
|
|
||||||
#### feed.config.date.selector
|
### Hosting
|
||||||
|
|
||||||
CSS selector relative to `item` that supples the publication date of
|
It is expected that `rsspls` will be run on a web server that is serving the
|
||||||
the RSS item.
|
directory the feeds are written to. `rsspls` just generates the feeds, it's not
|
||||||
|
a server. In order to have the feeds update you will need to arrange for
|
||||||
#### feed.config.date.type
|
|
||||||
|
|
||||||
Optional type of value being parsed. Either `Date` or `DateTime`.
|
|
||||||
|
|
||||||
`type` is `Date` when you want to parse just a date. Use `DateTime` if you're
|
|
||||||
parsing a date and time with the format. Defaults to `DateTime`.
|
|
||||||
|
|
||||||
#### feed.config.date.format
|
|
||||||
|
|
||||||
Format description using the syntax described on this page:
|
|
||||||
<https://time-rs.github.io/book/api/format-description.html>
|
|
||||||
of how to parse the date.
|
|
||||||
|
|
||||||
### feed.config.media
|
|
||||||
|
|
||||||
Optional CSS selector relative to `item` that supplies media content (audio,
|
|
||||||
video, image) to be added as an RSS enclosure.
|
|
||||||
|
|
||||||
**Note:** The media URL must be given by the `src` or `href` attribute of the
|
|
||||||
selected element.
|
|
||||||
|
|
||||||
**Note:** Currently if the item does not match the media selector then it will
|
|
||||||
be skipped.
|
|
||||||
|
|
||||||
## Hosting, Updating, and Subscribing
|
|
||||||
|
|
||||||
In order to have the feeds update you will need to arrange for
|
|
||||||
`rsspls` to be run periodically. You might do this with [cron], [systemd
|
`rsspls` to be run periodically. You might do this with [cron], [systemd
|
||||||
timers][timers], or the Windows equivalent.
|
timers][timers], or the Windows equivalent.
|
||||||
|
|
||||||
To subscribe to feeds you can run `rsspls` locally and use a feed reader that
|
### Caveats
|
||||||
supports local file feeds. Or, more likely it is expected that `rsspls` will be
|
|
||||||
run on a web server that is serving the directory the feeds are written to.
|
|
||||||
|
|
||||||
## Logging
|
|
||||||
|
|
||||||
`rsspls` logs messages to `stderr`. Logging can be controlled by the
|
|
||||||
`RSSPLS_LOG` environment variable. Log level and target module can controlled
|
|
||||||
according to the [env_logger documentation][env_logger]. For example, to enable
|
|
||||||
debug logging for `rsspls` you would use:
|
|
||||||
|
|
||||||
`RSSPLS_LOG=rsspls=debug`
|
|
||||||
|
|
||||||
The supported log levels are:
|
|
||||||
|
|
||||||
* `error`
|
|
||||||
* `warn`
|
|
||||||
* `info`
|
|
||||||
* `debug`
|
|
||||||
* `trace`
|
|
||||||
* `off` (disable logging)
|
|
||||||
|
|
||||||
The default log level is `info`.
|
|
||||||
|
|
||||||
## Caveats & Error Handling
|
|
||||||
|
|
||||||
`rsspls` just fetches and parses the HTML of the web page you specify. It does
|
`rsspls` just fetches and parses the HTML of the web page you specify. It does
|
||||||
not run JavaScript. If the website is entirely generated by JavaScript (such as
|
not run JavaScript. If the website is entirely generated by JavaScript (such as
|
||||||
Twitter) then `rsspls` will not work.
|
Twitter) then `rsspls` will not work.
|
||||||
|
|
||||||
If errors are encountered processing the page due to invalid selectors, or
|
### Caching
|
||||||
missing elements an error message will be logged. If the error is non-recoverable
|
|
||||||
`rsspls` will exit with a non-zero exit status.
|
|
||||||
|
|
||||||
If an error is encountered processing an item for the feed a warning will by
|
|
||||||
logged and processing will continue with the next item. `rsspls` will still
|
|
||||||
exit with success (0) in this case.
|
|
||||||
|
|
||||||
## Caching
|
|
||||||
|
|
||||||
When websites respond with cache headers `rsspls` will make a conditional
|
When websites respond with cache headers `rsspls` will make a conditional
|
||||||
request on subsequent runs and will not regenerate the feed if the server
|
request on subsequent runs and will not regenerate the feed if the server
|
||||||
responds with 304 Not Modified. Cache data is stored in
|
responds with 304 Not Modified. Cache data is stored in
|
||||||
`$XDG_CACHE_HOME/rsspls`, which defaults to `~/.cache/rsspls` on UNIX-like
|
`$XDG_CACHE_HOME/rsspls`, which defaults to `~/.cache/rsspls` on UNIX-like
|
||||||
systems or `C:\Users\You\AppData\Local\rsspls` on Windows.
|
systems or `C:\Users\You\AppData\Local\rsspls` on Windows.
|
||||||
|
|
||||||
[cron]: https://en.wikipedia.org/wiki/Cron
|
|
||||||
[env_logger]: https://docs.rs/env_logger/latest/env_logger/#enabling-logging
|
|
||||||
[platforms]: https://doc.rust-lang.org/stable/rustc/platform-support.html
|
|
||||||
[selectors]: https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors
|
|
||||||
[timers]: https://wiki.archlinux.org/title/Systemd/Timers
|
|
||||||
[toml]: https://toml.io/
|
|
||||||
|
|
|
@ -7,21 +7,10 @@ weight = 1
|
||||||
`rsspls` can be installed via one of the following methods:
|
`rsspls` can be installed via one of the following methods:
|
||||||
|
|
||||||
* [Package Manager](#package-manager)
|
* [Package Manager](#package-manager)
|
||||||
* [Download Pre-compiled Binary](#download)
|
* [Pre-compiled Binary](#pre-compiled-binary)
|
||||||
* [Build From Source](#build-from-source)
|
* [Build From Source](#build-from-source)
|
||||||
|
|
||||||
Download
|
### Package Manager
|
||||||
--------
|
|
||||||
|
|
||||||
Pre-compiled binaries are available for a number of platforms.
|
|
||||||
They require no additional dependencies on your computer.
|
|
||||||
|
|
||||||
{{ downloads() }}
|
|
||||||
|
|
||||||
This will result in the `rsspls` binary in the current directory.
|
|
||||||
|
|
||||||
Package Manager
|
|
||||||
---------------
|
|
||||||
|
|
||||||
`rsspls` is packaged in these package managers:
|
`rsspls` is packaged in these package managers:
|
||||||
|
|
||||||
|
@ -29,6 +18,21 @@ Package Manager
|
||||||
* Homebrew: `brew install wezm/taps/rsspls`
|
* Homebrew: `brew install wezm/taps/rsspls`
|
||||||
* MacPorts: [rsspls](https://ports.macports.org/port/rsspls/summary/)
|
* MacPorts: [rsspls](https://ports.macports.org/port/rsspls/summary/)
|
||||||
|
|
||||||
|
### Pre-compiled Binary
|
||||||
|
|
||||||
|
Pre-compiled binaries are available for a number of platforms.
|
||||||
|
They require no additional dependencies on your computer.
|
||||||
|
|
||||||
|
* [FreeBSD 13 amd64](https://releases.wezm.net/rsspls/0.8.1/rsspls-0.8.1-amd64-unknown-freebsd.tar.gz)
|
||||||
|
* [Linux x86\_64](https://releases.wezm.net/rsspls/0.8.1/rsspls-0.8.1-x86_64-unknown-linux-musl.tar.gz)
|
||||||
|
* [MacOS Universal](https://releases.wezm.net/rsspls/0.8.1/rsspls-0.8.1-universal-apple-darwin.tar.gz)
|
||||||
|
* [Windows x86\_64](https://releases.wezm.net/rsspls/0.8.1/rsspls-0.8.1-x86_64-pc-windows-msvc.zip)
|
||||||
|
|
||||||
|
Example to download and extract a binary:
|
||||||
|
|
||||||
|
curl https://releases.wezm.net/rsspls/0.7.1/rsspls-0.7.1-x86_64-unknown-linux-musl.tar.gz | tar zxf -
|
||||||
|
|
||||||
|
This will result in the `rsspls` binary in the current directory.
|
||||||
|
|
||||||
Build From Source
|
Build From Source
|
||||||
-----------------
|
-----------------
|
||||||
|
@ -46,5 +50,3 @@ Build the binary with `cargo build --release --locked`. The binary will be in
|
||||||
### From crates.io
|
### From crates.io
|
||||||
|
|
||||||
`cargo install rsspls`
|
`cargo install rsspls`
|
||||||
|
|
||||||
[rustup]: https://www.rust-lang.org/tools/install
|
|
||||||
|
|
|
@ -6,4 +6,4 @@ paginate_by = 10
|
||||||
weight = 3
|
weight = 3
|
||||||
+++
|
+++
|
||||||
|
|
||||||
[RSS feed](/index.xml)
|
News
|
||||||
|
|
21
content/news/hello.md
Normal file
21
content/news/hello.md
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
+++
|
||||||
|
title = "Version 0.8.1 and Website"
|
||||||
|
date = 2024-03-08T21:30:39+10:00
|
||||||
|
|
||||||
|
#[extra]
|
||||||
|
#updated = 2024-02-20T22:57:15+10:00
|
||||||
|
+++
|
||||||
|
|
||||||
|
RSS Please now has it's own website.
|
||||||
|
Of course it has an RSS feed: <https://rsspls.7bit.org/index.xml>
|
||||||
|
|
||||||
|
## Version 0.8.1
|
||||||
|
|
||||||
|
Many thanks to @Lcchy for all the new features in this release:
|
||||||
|
|
||||||
|
* Add per feed user-agent option to config file https://github.com/wezm/rsspls/pull/27
|
||||||
|
* Add a media selector to include as RSS enclosure https://github.com/wezm/rsspls/pull/29
|
||||||
|
* Add option to proxy requests https://github.com/wezm/rsspls/pull/32
|
||||||
|
* Recover from item parsing error and continue https://github.com/wezm/rsspls/pull/35
|
||||||
|
|
||||||
|
**Full Changelog**: https://github.com/wezm/rsspls/compare/0.7.1...0.8.1
|
|
@ -1,42 +0,0 @@
|
||||||
+++
|
|
||||||
title = "Version 0.8.1 and Website"
|
|
||||||
date = 2024-03-08T21:30:39+10:00
|
|
||||||
|
|
||||||
#[extra]
|
|
||||||
#updated = 2024-02-20T22:57:15+10:00
|
|
||||||
+++
|
|
||||||
|
|
||||||
The [0.8.1 release has been published][release] and RSS Please now has its own website.
|
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
## Version 0.8.1
|
|
||||||
|
|
||||||
Many thanks to [Lcchy on GitHub][Lcchy] for these new features:
|
|
||||||
|
|
||||||
* Add per feed user-agent option to config file [#27](https://github.com/wezm/rsspls/pull/27)
|
|
||||||
* Add a media selector to include as RSS enclosure [#29](https://github.com/wezm/rsspls/pull/29)
|
|
||||||
* Add option to proxy requests [#32](https://github.com/wezm/rsspls/pull/32)
|
|
||||||
* Recover from item parsing error and continue [#35](https://github.com/wezm/rsspls/pull/35)
|
|
||||||
|
|
||||||
[Full Changelog](https://github.com/wezm/rsspls/compare/0.7.1...0.8.1)
|
|
||||||
|
|
||||||
If you find `rsspls` useful you can [sponsor me on GitHub][sponsor].
|
|
||||||
|
|
||||||
## Website
|
|
||||||
|
|
||||||
RSS Please now has it's own website. Of course it has an RSS feed:
|
|
||||||
<https://rsspls.7bit.org/index.xml>. The website is built with [Zola] and uses
|
|
||||||
a modified version of the [Juice theme][Juice]. I've moved a lot of the content
|
|
||||||
that was in the README to the website. This also allowed me to expand on things
|
|
||||||
like the configuration file.
|
|
||||||
|
|
||||||
The source of [the website is also open-source][source]. If you'd like to
|
|
||||||
update the content or fix an issue contributions are welcome.
|
|
||||||
|
|
||||||
[Juice]: https://github.com/huhu/juice
|
|
||||||
[Lcchy]: https://github.com/Lcchy
|
|
||||||
[Zola]: https://www.getzola.org/
|
|
||||||
[release]: https://github.com/wezm/rsspls/releases/tag/0.8.1
|
|
||||||
[source]: https://forge.wezm.net/wezm/rsspls.7bit.org
|
|
||||||
[sponsor]: https://github.com/sponsors/wezm
|
|
Binary file not shown.
Before Width: | Height: | Size: 2.8 KiB |
Binary file not shown.
Binary file not shown.
|
@ -1,92 +0,0 @@
|
||||||
@font-face {
|
|
||||||
font-family: "Firava";
|
|
||||||
src: url(/fonts/Firava.woff2) format("woff2");
|
|
||||||
font-display: swap;
|
|
||||||
font-weight: 100 900;
|
|
||||||
font-style: normal;
|
|
||||||
}
|
|
||||||
@font-face {
|
|
||||||
font-family: "Firava";
|
|
||||||
src: url(/fonts/FiravaItalic.woff2) format("woff2");
|
|
||||||
font-display: swap;
|
|
||||||
font-weight: 100 900;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
|
|
||||||
a.link-button {
|
|
||||||
box-sizing: border-box;
|
|
||||||
display: inline-block;
|
|
||||||
letter-spacing: 1px;
|
|
||||||
text-transform: uppercase;
|
|
||||||
font-size: 13px;
|
|
||||||
border-radius: 5px;
|
|
||||||
padding: 2px 2em 0;
|
|
||||||
margin: 0.5em 2em;
|
|
||||||
height: 32px;
|
|
||||||
line-height: 30px;
|
|
||||||
text-decoration: none;
|
|
||||||
font-weight: 550;
|
|
||||||
color: white;
|
|
||||||
background: cornflowerblue;
|
|
||||||
}
|
|
||||||
a.link-button:hover {
|
|
||||||
background: hsl(218.5, 79.2%, 50%);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
a.install-button {
|
|
||||||
font-size: 18px;
|
|
||||||
padding: 0.5em 1.5em;
|
|
||||||
height: auto;
|
|
||||||
border-radius: 7px;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 32px;
|
|
||||||
font-weight: 600;
|
|
||||||
border: none;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
h3 {
|
|
||||||
font-size: 18px;
|
|
||||||
}
|
|
||||||
h4 {
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
time {
|
|
||||||
font-size: smaller;
|
|
||||||
}
|
|
||||||
article h2 {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
margin: 0.5em 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo {
|
|
||||||
font-family: var(--header-font-family), sans-serif;
|
|
||||||
font-weight: 900;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
.nav-item {
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
.content code {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
.hero section {
|
|
||||||
padding: 0 5rem;
|
|
||||||
}
|
|
||||||
@media screen and (max-width: 950px) {
|
|
||||||
.hero {
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
.hero section {
|
|
||||||
padding: 0 2rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media screen and (max-width: 450px) {
|
|
||||||
.hero-image {
|
|
||||||
width: 222px;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
const installButton = document.querySelector(".install-button");
|
|
||||||
const version = installButton ? installButton.dataset.version : null;
|
|
||||||
if (installButton && version) {
|
|
||||||
const baseUrl = "https://releases.wezm.net/rsspls/"+version+"/";
|
|
||||||
const agent = window.navigator.userAgent;
|
|
||||||
let file = null;
|
|
||||||
let os = null;
|
|
||||||
let arch = null;
|
|
||||||
if (agent.indexOf("Windows") >= 0) {
|
|
||||||
file = "rsspls-"+version+"-x86_64-pc-windows-msvc.zip";
|
|
||||||
os = "Windows";
|
|
||||||
arch = "x86_64";
|
|
||||||
}
|
|
||||||
else if (agent.indexOf("Mac OS X") >= 0 || agent.indexOf("macOS") >= 0) {
|
|
||||||
file = "rsspls-"+version+"-universal-apple-darwin.tar.gz";
|
|
||||||
os = "macOS";
|
|
||||||
arch = "universal";
|
|
||||||
}
|
|
||||||
else if (agent.indexOf("FreeBSD") >= 0 && x64(agent)) {
|
|
||||||
file = "rsspls-"+version+"-amd64-unknown-freebsd.tar.gz";
|
|
||||||
os = "FreeBSD";
|
|
||||||
arch = "amd64";
|
|
||||||
}
|
|
||||||
else if (agent.indexOf("Linux") >= 0 && x64(agent)) {
|
|
||||||
file = "rsspls-"+version+"-x86_64-unknown-linux-musl.tar.gz";
|
|
||||||
os = "Linux";
|
|
||||||
arch = "x86_64";
|
|
||||||
}
|
|
||||||
if (file !== null && os != null && arch != null) {
|
|
||||||
installButton.href = baseUrl + file;
|
|
||||||
installButton.innerText = "Download for "+os;
|
|
||||||
installButton.title = "rsspls "+version+" for "+os+" "+arch;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function x64(agent) {
|
|
||||||
return (agent.indexOf("x86_64") >= 0 || agent.indexOf("amd64") >= 0);
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
pre {
|
|
||||||
padding: 1rem;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
// The line numbers already provide some kind of left/right padding
|
|
||||||
pre[data-linenos] {
|
|
||||||
padding: 1rem 0;
|
|
||||||
}
|
|
||||||
pre table td {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
// The line number cells
|
|
||||||
pre table td:nth-of-type(1) {
|
|
||||||
text-align: center;
|
|
||||||
user-select: none;
|
|
||||||
}
|
|
||||||
pre mark {
|
|
||||||
// If you want your highlights to take the full width.
|
|
||||||
display: block;
|
|
||||||
// The default background colour of a mark is bright yellow
|
|
||||||
background-color: rgba(254, 252, 232, 0.9);
|
|
||||||
}
|
|
||||||
pre table {
|
|
||||||
width: 100%;
|
|
||||||
border-collapse: collapse;
|
|
||||||
}
|
|
|
@ -1,24 +0,0 @@
|
||||||
<style>
|
|
||||||
:root {
|
|
||||||
/* Primary theme color */
|
|
||||||
--primary-color: #DDFFFC;
|
|
||||||
/* Primary theme text color */
|
|
||||||
--primary-text-color: #4f4442;
|
|
||||||
--primary-text-color-over: #000;
|
|
||||||
/* Primary theme link color */
|
|
||||||
--primary-link-color: #d46e13;;
|
|
||||||
/* Secondary color: the background body color */
|
|
||||||
--secondary-color: #fcfaf6;
|
|
||||||
--secondary-text-color: #303030;
|
|
||||||
/* Highlight text color of table of content */
|
|
||||||
--toc-highlight-text-color: #d46e13;
|
|
||||||
--toc-background-color: white;
|
|
||||||
--code-color: initial;
|
|
||||||
--code-background-color: initial;
|
|
||||||
--shadow-color: #ddd;
|
|
||||||
/* Font used for headers (h1 & h2) */
|
|
||||||
--header-font-family: Firava, "Fira Sans", sans-serif;
|
|
||||||
/* Font used for text */
|
|
||||||
--text-font-family: Firava, "Fira Sans", sans-serif;
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -1,56 +1,51 @@
|
||||||
{% extends "juice/templates/index.html" %}
|
{% extends "juice/templates/index.html" %}
|
||||||
{% block title %}{{ section.title }} - {{ section.description }} {% endblock title %}
|
|
||||||
|
|
||||||
{% block hero %}
|
{% block hero %}
|
||||||
|
{# <script async defer src="https://buttons.github.io/buttons.js"></script> #}
|
||||||
<section class="text-center">
|
<section class="text-center">
|
||||||
<h1 class="heading-text" style="font-size: 50px">{{ section.description }}</h1>
|
<h1 class="heading-text" style="font-size: 50px">
|
||||||
|
Generate RSS feeds from web pages
|
||||||
|
</h1>
|
||||||
<h3 class="title-text">
|
<h3 class="title-text">
|
||||||
RSS Please is a command line tool that runs on Linux, macOS, Windows, BSD, and more.
|
<b>Juice</b> is an intuitive, elegant, and lightweight Zola theme for product websites.
|
||||||
</h3>
|
</h3>
|
||||||
|
{# <div> #}
|
||||||
<div class="text">
|
{# <a class="github-button" href="https://github.com/huhu/juice" data-size="large" data-show-count="true" #}
|
||||||
{% set releases = load_data(url="https://github.com/wezm/rsspls/releases.atom", format="xml") %}
|
{# aria-label="Star huhu/juice on GitHub">Star</a> #}
|
||||||
{% set latest_release = releases.feed.entry | first %}
|
{# <a class="github-button" href="https://github.com/huhu/juice/fork" data-size="large" #}
|
||||||
{% set latest_version = latest_release.link['@href'] | split(pat="/") | last %}
|
{# data-show-count="true" aria-label="Fork huhu/juice on GitHub">Fork</a> #}
|
||||||
<a href="/install/" class="link-button install-button" style="margin-top: 2em" data-version="{{ latest_version }}">Install</a>
|
{# </div> #}
|
||||||
</div>
|
|
||||||
</section>
|
</section>
|
||||||
<div class="text-center">
|
<img class="hero-image" style="width: 50%" src="{{ get_url(path="juice.svg") }}">
|
||||||
<img class="hero-image" style="image-rendering: pixelated;" src="{{ get_url(path="screenshot.png") }}" alt="Screenshot of two invocations of rsspls in a terminal. The first fetches and generates the feeds, the second does not change anything as the source pages are unmodifed." title="Screenshot of rsspls running on a Linux system over an SSH connection in ssheven on Mac OS 8.">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="explore-more text text-center"
|
<div class="explore-more text"
|
||||||
onclick="document.getElementById('features').scrollIntoView({behavior: 'smooth'})">
|
onclick="document.getElementById('features').scrollIntoView({behavior: 'smooth'})">
|
||||||
Explore More ⇩
|
Explore More ⇩
|
||||||
</div>
|
</div>
|
||||||
|
<style>
|
||||||
|
.hero section {
|
||||||
|
padding: 0 5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 768px) {
|
||||||
|
.hero section {
|
||||||
|
padding: 0 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero-image {
|
||||||
|
display: none
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
{% endblock hero %}
|
{% endblock hero %}
|
||||||
|
|
||||||
{% block head %}
|
{% block head %}
|
||||||
<link rel="stylesheet" href="{{ get_url(path="home.css") }}">
|
<link rel="alternate" type="application/rss+xml" title="RSS" href="{{ get_url(path="index.xml", trailing_slash=false) }}">
|
||||||
<link rel="stylesheet" href="{{ get_url(path="syntax.css") }}">
|
|
||||||
<link rel="alternate" type="application/rss+xml" title="RSS" href="{{ get_url(path="index.xml", trailing_slash=false) }}">
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block fonts %}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block favicon %}
|
|
||||||
<link rel="icon" href="{{ get_url(path="feed-icon.svg") }}">
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div id="features" class="heading-text">Overview</div>
|
|
||||||
{{ section.content | safe }}
|
|
||||||
{% endblock content %}
|
|
||||||
|
|
||||||
{% block footer %}
|
{% block footer %}
|
||||||
<footer>
|
<footer>
|
||||||
<small class="subtext">
|
<small class="subtext">
|
||||||
Copyright © {#2024 –#} {{ now() | date(format="%Y") }}
|
© 2024 <a href="https://www.wezm.net/">Wesley Moore</a>
|
||||||
<a href="{{ config.extra.homepage }}">{{ config.extra.author }}</a>
|
|
||||||
— <a href="https://forge.wezm.net/wezm/rsspls.7bit.org">Website Source</a>
|
|
||||||
— <a href="https://github.com/sponsors/wezm">Sponsor on GitHub</a>
|
|
||||||
</small>
|
</small>
|
||||||
</footer>
|
</footer>
|
||||||
<script src="{{ get_url(path="home.js") }}" type="text/javascript"></script>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
{% extends "juice/templates/page.html" %}
|
|
||||||
{% block title %}{{ page.title }} - {{ config.title }} {% endblock title %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
{% if page.description %}
|
|
||||||
<h1 class="heading-text">{{ page.description }}</h1>
|
|
||||||
{% else %}
|
|
||||||
<h1 class="heading-text">{{ page.title }}</h1>
|
|
||||||
{% endif %}
|
|
||||||
{% if page.date %}
|
|
||||||
<time datetime="{{ page.date }}">{{ page.date | date(format="%d %B %Y") }}</time>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{{ page.content | safe }}
|
|
||||||
{% endblock content %}
|
|
|
@ -1,7 +1,7 @@
|
||||||
{% import "_macros.html" as macros %}
|
{% import "_macros.html" as macros %}
|
||||||
{% extends "index.html" %}
|
{% extends "index.html" %}
|
||||||
|
|
||||||
{% block title %}{{ section.title }} - {{ config.title }} {% endblock title %}
|
{% block title %}{{ section.title }} | {{ super() }} {% endblock title %}
|
||||||
|
|
||||||
{% block header %}
|
{% block header %}
|
||||||
<header class="box-shadow">
|
<header class="box-shadow">
|
||||||
|
@ -10,27 +10,7 @@
|
||||||
{% endblock header %}
|
{% endblock header %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h1 class="heading-text">{{ section.description }}</h1>
|
<div class="heading-text">{{ section.description }}</div>
|
||||||
{{ section.content | safe }}
|
{{ section.content | safe }}
|
||||||
|
|
||||||
{% for page in paginator.pages %}
|
|
||||||
<article>
|
|
||||||
<h2><a href="{{ page.permalink }}">{{ page.title }}</a></h2>
|
|
||||||
<time datetime="{{ page.date }}">{{ page.date | date(format="%d %B %Y") }}</time>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
{{ page.summary | safe }}
|
|
||||||
</div>
|
|
||||||
</article>
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
<nav class="pagination">
|
|
||||||
{% if paginator.previous %}
|
|
||||||
<a class="previous" href="{{ paginator.previous }}">‹ Previous</a>
|
|
||||||
{% endif %}
|
|
||||||
{% if paginator.next %}
|
|
||||||
<a class="next" href="{{ paginator.next }}">Next ›</a>
|
|
||||||
{% endif %}
|
|
||||||
</nav>
|
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
{% set releases = load_data(url="https://github.com/wezm/rsspls/releases.atom", format="xml") %}
|
|
||||||
{% set latest_release = releases.feed.entry | first %}
|
|
||||||
{% set_global latest_version = latest_release.link['@href'] | split(pat="/") | last %}
|
|
||||||
<ul>
|
|
||||||
<li><a href="https://releases.wezm.net/rsspls/{{ latest_version }}/rsspls-{{ latest_version }}-amd64-unknown-freebsd.tar.gz">FreeBSD 13+ amd64</a></li>
|
|
||||||
<li><a href="https://releases.wezm.net/rsspls/{{ latest_version }}/rsspls-{{ latest_version }}-x86_64-unknown-linux-musl.tar.gz">Linux x86_64</a>
|
|
||||||
<ul>
|
|
||||||
<li>Runs on glibc and Musl based distributions including Alpine, Arch, Chimera, Debian, Fedora, and Ubuntu.</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li><a href="https://releases.wezm.net/rsspls/{{ latest_version }}/rsspls-{{ latest_version }}-universal-apple-darwin.tar.gz">MacOS Universal</a></li>
|
|
||||||
<li><a href="https://releases.wezm.net/rsspls/{{ latest_version }}/rsspls-{{ latest_version }}-x86_64-pc-windows-msvc.zip">Windows x86_64</a></li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>Example to download and extract a binary:</p>
|
|
||||||
|
|
||||||
<pre>curl https://releases.wezm.net/rsspls/{{ latest_version }}/rsspls-{{ latest_version }}-x86_64-unknown-linux-musl.tar.gz | tar zxf -</pre>
|
|
Loading…
Reference in a new issue