A CLI PHP script that can be used to periodically fetch the JSON feed from an instance of Gancio (https://gancio.org) and post its new or changed events announcements on the Fediverse through a Mastodon account
Find a file
2024-10-29 15:28:23 +01:00
lib Moved sample headers from top to bottom of file 2024-10-29 13:52:14 +01:00
storage First commit 2024-10-24 22:56:45 +02:00
systemd Renamed 2024-10-29 14:51:49 +01:00
ganciof2f Refined the regex to check if the state file is well formed; changed “graceTime” from 1 year to 3 years; changed the help text accordingly; bumped version to 0.5.2 2024-10-29 15:28:23 +01:00
LICENSE.txt First commit 2024-10-24 06:53:20 +02:00
README.md Changed every occurrence of “gancioff” to “ganciof2f” 2024-10-29 14:51:04 +01:00
todo.txt Changed every occurrence of “gancioff” to “ganciof2f” 2024-10-29 14:51:04 +01:00

[[[ SYNOPSIS ]]]

ganciof2f [options] <configuration file path>

[[[ DESCRIPTION ]]]

 This is GancioF2F v0.5.1 («GancioFeed2Fedi»), a CLI PHP script that can
be used to periodically fetch the JSON feed from an instance of Gancio
(https://gancio.org) and post its new or changed events announcements on the
Fediverse through a Mastodon account, recording into a state file a reference
to each already posted announcement in order to post only new or changed ones
on each run.
 It can be useful, for example, when the admins of a Gancio instance chose not
to use its federation feature because it would be too heavy on its server:
in fact, GancioF2F is a light alternative to federating the Gancio instance,
moving from its server to the one running Mastodon the burden of posting each
announcement to each Fediverse instance hosting at least one follower, and of
sending them the image a Gancio user can attach to each announcement, because
GancioF2F will fetch it only once and attach it to the Mastodon post; moreover,
by default, if an announcement on the Gancio instance fits into a Mastodon
post GancioF2F doesnt place a link to the original announcement into the post,
thus further reducing the burden due to the requests the Gancio instance gets
from every Mastodon instance trying to generate a “link preview”.
 GancioF2F is meant to be run periodically, every half an hour or so, by a cron
job, or systemd timer, or the likes (you can find a sample «ganciof2f.timer»
and a commented sample «ganciof2f.service» in the «systemd» directory).
 In order to work, GancioF2F needs a configuration file path to be passed to it
as an argument on the command line.

[[[ CONFIGURATION FILE ]]]

 The configuration file needs to be like this:

--- Example configuration file ---
# Lines beginnig with a «#» and empty lines will be ignored

# «feed_hostname» is required to specify the hostname of the Gancio instance.
# For example:
feed_hostname = gancio.some.domain

# «fedi_hostname» is required to specify the hostname of the Mastodon instance
# you want to post to. For example:
fedi_hostname = mastodon.another.domain

# «fedi_token» is required to specify an «app token» to access the account
# that you want to use on the instance defined by «fedi_hostname». On Mastodon
# default web frontend you can get such a token under «Preferences» ->
# «Development», by clicking on the «New application» button; the new
# application should have at least the «write:media» and «write:statuses»
# privileges; when youll be done setting it up, it will be listed under
# «Your applications», and by clicking on its name youll be able to copy
# «Your access token» and paste it here. For example:
fedi_token = w6oQ_Ot2LSAm_Q31hrvp0asfl22ip3O4ipYq1kV1ceY

# «state_file_absolute_path» is required to specify the absolute path of the
# state file where GancioF2F will store the references to already posted
# announcements (on every run, GancioF2F will check this file for entries older
# than one year and discard them, to avoid the state file to grow too much).
# For example:
state_file_absolute_path = /var/local/cache/ganciof2f/gancio.some.domain.state

# «timezone» is required to specify the timezone of the Gancio instance, in
# order for GancioF2F to calculate the correct datetimes. You can list the
# supported timezones using option «-T» or «--timezones» (see the related
# entry in the «OPTIONS» section). For example:
timezone = Europe/Rome

# «posts_language» is required to specify the ISO 639-1 code for the language
# of posts (see https://www.loc.gov/standards/iso639-2/php/code_list.php for
# a complete list). For example:
posts_language = it

# «posts_visibility» is optional and lets you override the default “public”
# visibility of posts; it can be set to «public» (posts will be visible in the
# «Local» and «Federated» timelines, and any user will be able to boost them),
# «unlisted» (posts will be visible only in the «Home» timeline of followers
# and on the profile of the Mastodon account in use, not in the «Local» or
# «Federated» timelines, but any user will still be able to boost them),
# «private» (AKA «followers only»: posts will be visible only by followers and
# wont be boostable by anyone), and «direct» (since GancioF2F posts wont ever
# explicitly mention any account, posts with this visibility will be visible
# only from the Mastodon account in use, which may be good for testing).
# For example:
post_visibility = unlisted

# «max_post_length» is optional and lets you override the automatically
# detected maximum length that a post can have on the instance specified with
# «fedi_hostname»; it can be used for testing purposes or just to keep the
# posts shorter than they would be otherwise. For example:
max_post_length = 840

# «always_link_gancio_post» is optional and if unspecified it defaults to
# «false», which means that GancioF2F adds to the Mastodon post a link to the
# original Gancio post only if the latter is too long to fit into the first
# (i.e. into the maximum post length allowed by the Mastodon instance, or into
# the «max_post_length» specified in this configuration file - see above);
# this further reduces the burden on the Gancio instance (see the second
# paragraph of the «Description» section).
# If set to «true», GancioF2F will instead always add a link to the original
# Gancio announcement.
always_link_gancio_post = true
--- End of example configuration file ---

[[[ OPTIONS ]]]

-h / --help
  Show this help text and exit.
-p / --do-post <y|n>
  When a state file already exists, this option defaults to «y» («yes»), which
 means that GancioF2F will try to post all the new or changed announcements it
 may find in the feed; if set to «n» («no»), GancioF2F will not try to post
 them, but it will still record a reference to each of them into the state
 file, so they wont be posted again on subsequent runs (unless they were
 changed in the meantime).
  This option is mainly useful on GancioF2Fs first run on a given feed, i.e.
 when the state file specified in the configuration file doesnt exist yet and
 thus all the announcements in the feed will be considered “new”: in this
 case, GancioF2F refuses to run unless you explicitly set this option to «y» or
 «n»: this is a way to prevent you from unintentionally flooding your Mastodon
 instances «Local» timeline, and possibly your followers «Home» timelines,
 with all the announcements in the feed.
  When “test mode” is active (see the next option description), setting this
 option has no effect.
-t / --test
  Do a test: GancioF2F will try as always to read the configuration file, fetch
 the defined Mastodon instances info, load the state file and fetch the feed,
 but it will post only the first of the announcements it may find there, with
 a visibility of «direct», even if according to the state file it has already
 been posted, and wont update the state file.
  This option also activates “verbose mode” (see below).
-v / --verbose
  When this option is not set GancioF2F prints only warning and error messages;
 when it is set it also prints informational messages about what its doing.
-T / --timezones
  List all the supported timezones.
--
  Treat every possible subsequent argument as non-options. Useful only in the
 very improbable case your config file is named «--help» or as another option.

[[[ EXIT VALUES ]]]

0: regular run
1: some error occurred
99: killed with signal (ctrl+c, etc.)

[[[ DISCLAIMER AND LICENSE ]]]

 This program comes with ABSOLUTELY NO WARRANTY; for details see the source.
 This is free software, and you are welcome to redistribute it under certain
conditions; see <http://www.gnu.org/licenses/> for details.