Compare commits

..

No commits in common. "master" and "simplify-main" have entirely different histories.

47 changed files with 157 additions and 452 deletions

3
.gitignore vendored
View file

@ -1,7 +1,6 @@
docs/build/ docs/build/
__pycache__ __pycache__
feedlist feedlist
data
*.swp *.swp
*.pyc *.pyc
*.db *.db
@ -9,5 +8,3 @@ data
*.txt *.txt
*.bck *.bck
*.png *.png
*.yml
.env

View file

@ -1,5 +1,5 @@
Antoine Beaupré <anarcat@debian.org> Antoine Beaupré <anarcat@debian.org>
Carl Chenet <carl.chenet@ohmytux.com> Carl Chenet <chaica@ohmytux.com>
Alexis Metaireau <alexis@notmyidea.org> Alexis Metaireau <alexis@notmyidea.org>
The Dod <https://social.weho.st/@thedod> The Dod <https://social.weho.st/@thedod>
Matthias Henze Matthias Henze

View file

@ -1,41 +1,3 @@
## [0.17] - 2021-03-26
### Changed
- fix install bug while installing from sources
- bump changelog
## [0.16] - 2020-12-09
### Added
- scripts/register_feed2toot_app: --client-credentials-file option to change the filename in which the client credentials are stored
- scripts/register_feed2toot_app: --user-credentials-file option to change the filename in which the client credentials are stored
- scripts/register_feed2toot_app: --name to change the Mastodon app name
## [0.15] - 2020-12-07
### Changed
- maintenance version
- fix bug while using uri_list parameter alone following feedparser upgrade
- update copyrigth
- update author email
## [0.14] - 2019-12-31
### Added
- support for line breaks in toots
- new configuration parameter toot_max_len to define the maximum length of a toot
- new configuration parameter no_tags_in_toot to stop hash tags to be added in toots
## [0.13] - 2019-12-27
### Added
- new cli option --ignore-ssl and parameter ignore_ssl to ignore ssl error in the rss feeds
### Changed
- delete the lock file when using --rss-sections cli option
## [0.12] - 2019-08-27
### Changed
- simplify code, mostly in the main function
- fix a bug when title_pattern is used and *_pattern_case_sensitive is not defined
## [0.11] - 2019-08-24 ## [0.11] - 2019-08-24
### Added ### Added
- MAJOR CHANGE: command line options --lockfile to define a lock file - MAJOR CHANGE: command line options --lockfile to define a lock file

View file

@ -1,13 +0,0 @@
FROM python:3.7-bullseye
ADD . /app
WORKDIR /app
RUN python3 setup.py install; \
chmod +x docker_entrypoint.sh; \
mkdir -p /data /root/.config; \
rm -rf docke.yml
WORKDIR /data
CMD ["/app/docker_entrypoint.sh"]

View file

@ -1,46 +1,65 @@
# Feed2Toot Docker
Feed2Toot Docker is a fork of [chaica/feed2toot](https://gitlab.com/chaica/feed2toot) that allows for simple deployment over Docker. In the future I'll try to add other useful features.
### Usage
With Docker Compose:
```yaml
version: '3'
services:
feed2toot:
image: gitea.massivebox.net/massivebox/feed2toot-docker:latest
environment:
- USERNAME=sampleusername@sampleinstance.url
- PASSWORD=samplepassword
- INSTANCE=https://sampleinstance.url
restart: always
volumes:
- ./data:/data
```
Insert your full username (including the part with your homeserver's address), password and instance URL where required.
You also need to create a working `feed2toot.ini` in the `./data` folder. See the [upstream docs](`https://feed2toot.readthedocs.io/en/latest/configure.html#create-feed2toot-configuration`) for the guide.
After the first successful run, you can remove the entire `environment` block if you want, however, if you delete and re-create the container, you will need to put it back.
### Support
Don't ask the upstream developers for help, if something is broken it's more likely that it is my fault.
You can get support by opening an [issue](https://gitea.massivebox.net/massivebox/feed2toot-docker/issues), or by [contacting me](https://massivebox.net/contact.html), or in the [Matrix support room](https://matrix.to/#/#support:massivebox.net).
### Feed2toot ### Feed2toot
The following links and addresses are the upstream developers'. I don't want donations for this project, but I encourage you to donate to them. Feed2toot automatically parses rss feeds, identifies new posts and posts them on the [Mastodon](https://mastodon.social) social network.
For the full documentation, [read it online](https://feed2toot.readthedocs.org/en/latest/).
If you would like, you can [support the development of this project on Liberapay](https://liberapay.com/carlchenet/).
Alternatively you can donate cryptocurrencies:
- [Liberapay](https://liberapay.com/carlchenet/)
- BTC: 1AW12Zw93rx4NzWn5evcG7RNNEM2RSLmAC - BTC: 1AW12Zw93rx4NzWn5evcG7RNNEM2RSLmAC
- XMR: 43GGv8KzVhxehv832FWPTF7FSVuWjuBarFd17QP163uxMaFyoqwmDf1aiRtS5jWgCiRsi73yqedNJJ6V1La2joznKHGAhDi - XMR: 43GGv8KzVhxehv832FWPTF7FSVuWjuBarFd17QP163uxMaFyoqwmDf1aiRtS5jWgCiRsi73yqedNJJ6V1La2joznKHGAhDi
### Quick Install
* Install Feed2toot from PyPI
# pip3 install feed2toot
* Install Feed2toot from sources
*(see the installation guide for full details)
[Installation Guide](http://feed2toot.readthedocs.org/en/latest/install.html)*
# tar zxvf feed2toot-0.11.tar.gz
# cd feed2toot
# python3 setup.py install
# # or
# python3 setup.py install --install-scripts=/usr/bin
### Create the authorization for the Feed2toot app
* Just launch the following command::
$ register_feed2toot_app
### Use Feed2toot
* Create or modify feed2toot.ini file in order to configure feed2toot:
[mastodon]
instance_url=https://mastodon.social
user_credentials=feed2toot_usercred.txt
client_credentials=feed2toot_clientcred.txt
; Default visibility is public, but you can override it:
; toot_visibility=unlisted
[cache]
cachefile=cache.db
[rss]
uri=https://www.journalduhacker.net/rss
toot={title} {link}
[hashtaglist]
several_words_hashtags_list=hashtags.txt
* Launch Feed2toot
$ feed2toot -c /path/to/feed2toot.ini
### Authors ### Authors
* MassiveBox <massivebox@massivebox.net> * Carl Chenet <chaica@ohmytux.com>
* Carl Chenet <carl.chenet@ohmytux.com>
* Antoine Beaupré <anarcat@debian.org> * Antoine Beaupré <anarcat@debian.org>
* First developed by Todd Eddy * First developed by Todd Eddy

View file

@ -1,12 +0,0 @@
#!/bin/bash
cd /data
if [[ ! -f "feed2toot_clientcred.txt" || ! -f "feed2toot_usercred.txt" ]]; then
register_feed2toot_app --instance $INSTANCE --username $USERNAME --password $PASSWORD
fi
while :; do
feed2toot -c ./feed2toot.ini
sleep 5m
done

View file

@ -1,4 +1,4 @@
Authors Authors
======= =======
Carl Chenet <carl.chenet@ohmytux.com> Carl Chenet <chaica@ohmytux.com>

View file

@ -31,7 +31,6 @@ import os
# ones. # ones.
extensions = [ extensions = [
'sphinx.ext.autodoc', 'sphinx.ext.autodoc',
'sphinx.ext.autosectionlabel'
] ]
# Add any paths that contain templates here, relative to this directory. # Add any paths that contain templates here, relative to this directory.
@ -48,16 +47,16 @@ master_doc = 'index'
# General information about the project. # General information about the project.
project = 'feed2toot' project = 'feed2toot'
copyright = '2015-2021, Carl Chenet <carl.chenet@ohmytux.com>' copyright = '2015-2019, Carl Chenet <chaica@ohmytux.com>'
# The version info for the project you're documenting, acts as replacement for # The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the # |version| and |release|, also used in various other places throughout the
# built documents. # built documents.
# #
# The short X.Y version. # The short X.Y version.
version = '0.17' version = '0.11'
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = '0.17' release = '0.11'
# The language for content autogenerated by Sphinx. Refer to documentation # The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages. # for a list of supported languages.
@ -201,7 +200,7 @@ latex_elements = {
# author, documentclass [howto, manual, or own class]). # author, documentclass [howto, manual, or own class]).
latex_documents = [ latex_documents = [
('index', 'feed2toot.tex', 'feed2toot Documentation', ('index', 'feed2toot.tex', 'feed2toot Documentation',
'Carl Chenet \\textless{}carl.chenet@ohmytux.com.org\\textgreater{}', 'manual'), 'Carl Chenet \\textless{}chaica@ohmytux.com.org\\textgreater{}', 'manual'),
] ]
# The name of an image file (relative to this directory) to place at the top of # The name of an image file (relative to this directory) to place at the top of
@ -231,7 +230,7 @@ latex_documents = [
# (source start file, name, description, authors, manual section). # (source start file, name, description, authors, manual section).
man_pages = [ man_pages = [
('index', 'feed2toot', 'feed2toot Documentation', ('index', 'feed2toot', 'feed2toot Documentation',
['Carl Chenet <carl.chenet@ohmytux.com>'], 1) ['Carl Chenet <chaica@ohmytux.com>'], 1)
] ]
# If true, show URL addresses after external links. # If true, show URL addresses after external links.
@ -245,7 +244,7 @@ man_pages = [
# dir menu entry, description, category) # dir menu entry, description, category)
texinfo_documents = [ texinfo_documents = [
('index', 'feed2toot', 'feed2toot Documentation', ('index', 'feed2toot', 'feed2toot Documentation',
'Carl Chenet <carl.chenet@ohmytux.com>', 'feed2toot', 'One line description of project.', 'Carl Chenet <chaica@ohmytux.com>', 'feed2toot', 'One line description of project.',
'Miscellaneous'), 'Miscellaneous'),
] ]

View file

@ -1,34 +1,23 @@
Configure Feed2toot Configure Feed2toot
=================== ===================
Create credentials for Mastodon
-------------------------------
As a prerequisite to use Feed2toot, you need to authorize a Mastodon app for your account. As a prerequisite to use Feed2toot, you need to authorize a Mastodon app for your account.
Just use the script register_feed2toot_app to register the feed2toot app for your account.:: Just use the script register_feed2toot_app to register the feed2toot app for your account.::
$ ./register_feed2toot_app $ ./register_feed2toot_app
This script generates the Mastodon application credentials for Feed2toot. This app generates Mastodon app credentials needed by Feed2toot.
feed2toot_clientcred.txt and feed2toot_usercred.txt will be written feed2toot_clientcred.txt and feed2toot_usercred.txt will be written in the current dir /home/chaica/progra/python/feed2toot.
in the current directory: /home/me/feed2toot. One connection is initiated to create the app.
WARNING: previous files with the same names will be overwritten.
A connection is also initiated to create the application.
Your password is *not* stored. Your password is *not* stored.
Mastodon instance URL (defaults to https://mastodon.social): https://framapiaf.org Mastodon instance url (defaults to https://mastodon.social):
Mastodon login: toto@titi.com Mastodon login:chaica@ohmytux.com
Mastodon password: Mastodon password:
The feed2toot app was added to your preferences=>authorized apps page
The app feed2toot was added to your Preferences=>Accounts=>Authorized apps page. As described above, two files were created. You'll need them in the feed2toot configuration.
The file feed2toot_clientcred.txt and feed2toot_usercred.txt were created in the current directory.
As described above, two files were created. See the :ref:`Use register_feed2toot_app` section for more options for register_feed2toot_app.
Create Feed2toot configuration
------------------------------
After using register_feed2toot_app, you'll need the credentials in the feed2toot configuration.
In order to configure Feed2toot, you need to create a feed2toot.ini file (or any name you prefer, finishing with the extension .ini) with the following parameters:: In order to configure Feed2toot, you need to create a feed2toot.ini file (or any name you prefer, finishing with the extension .ini) with the following parameters::
@ -52,15 +41,12 @@ In order to configure Feed2toot, you need to create a feed2toot.ini file (or any
uri=https://www.journalduhacker.net/rss uri=https://www.journalduhacker.net/rss
uri_list=/etc/feed2toot//rsslist.txt uri_list=/etc/feed2toot//rsslist.txt
toot={title} {link} toot={title} {link}
; toot_max_len=125
title_pattern=Open Source title_pattern=Open Source
title_pattern_case_sensitive=true title_pattern_case_sensitive=true
no_uri_pattern_no_global_pattern=true no_uri_pattern_no_global_pattern=true
; ignore_ssl=false
[hashtaglist] [hashtaglist]
several_words_hashtags_list=/etc/feed2toot/hashtags.txt several_words_hashtags_list=/etc/feed2toot/hashtags.txt
; no_tags_in_toot=false
[feedparser] [feedparser]
accept_bozo_exceptions=true accept_bozo_exceptions=true
@ -94,18 +80,15 @@ For the [rss] section:
- uri: the url of the rss feed to parse - uri: the url of the rss feed to parse
- uri_list: a path to a file with several adresses of rss feeds, one by line. Absolute path is mandatory. - uri_list: a path to a file with several adresses of rss feeds, one by line. Absolute path is mandatory.
- toot: format of the toot you want to post. It should use existing entries of the RSS fields like {title} or {link}. Launch it with this field empty to display all available entries. If you want to shorten the size of a field, you can use the syntax {summary:.100} to cut the field "summary" of the rss feed after the first 100 characters (starting from version 0.10). To add new lines you can use \n (starting from version 0.14) - toot: format of the toot you want to post. It should use existing entries of the RSS fields like {title} or {link}. Launch it with this field empty to display all available entries. If you want to shorten the size of a field, you can use the syntax {summary:.100} to cut the field "summary" of the rss feed after the first 100 characters (starting from Feed2toot 0.10).
- toot_max_len: the max length of a toot can be defined here. If the toot size is longer, the toot is truncated and "..." added at the end. Defaults is 500 characters.
- {one field of the rss feed}_pattern: takes a string representing a pattern to match for a specified field of each rss entry of the rss feed, like title_pattern or summary_pattern. - {one field of the rss feed}_pattern: takes a string representing a pattern to match for a specified field of each rss entry of the rss feed, like title_pattern or summary_pattern.
- {one field of the rss feed}_pattern_case_sensitive: either the pattern matching for the specified field should be case sensitive or not. Default to true if not specified. - {one field of the rss feed}_pattern_case_sensitive: either the pattern matching for the specified field should be case sensitive or not. Default to true if not specified.
- no_uri_pattern_no_global_pattern: don't apply global pattern (see above) when no pattern-by-uri is defined in the uri_list. Allows to get all entries of a rss in the uri_list because no pattern is defined so we match them all. Defaults to false, meaning the global patterns will be tried on every rss in the uri_list NOT HAVING specific patterns and so ONLY entries from the specific uri in the uri_list matching the global patterns will be considered. - no_uri_pattern_no_global_pattern: don't apply global pattern (see above) when no pattern-by-uri is defined in the uri_list. Allows to get all entries of a rss in the uri_list because no pattern is defined so we match them all. Defaults to false, meaning the global patterns will be tried on every rss in the uri_list NOT HAVING specific patterns and so ONLY entries from the specific uri in the uri_list matching the global patterns will be considered.
- addtags: add the tags from the rss feed at the end of the toot. Defaults to true. addtags: add the tags from the rss feed at the end of the toot. Defaults to true.
- ignore_ssl: when the uri or uri_list contains an https url with an invalid certificate (e.g an expired one), feed2toot will be unable to get rss content. This option allows to bypass the ssl security to catch the rss content. Defaults to false.
For the [hashtaglist] section: For the [hashtaglist] section:
- several_words_hashtags_list: a path to the file containing hashtags in two or more words. Absolute path is mandatory. By default Feed2toot adds a # before every words of a hashtag. See documentation below for an example of this file. - several_words_hashtags_list: a path to the file containing hashtags in two or more words. Absolute path is mandatory. By default Feed2toot adds a # before every words of a hashtag. See documentation below for an example of this file.
- no_tags_in_toot: stop hash tags to be added at the toot. Defaults to false.
for the [feedparser] section: for the [feedparser] section:
@ -177,3 +160,9 @@ In you rsslist.txt, just don't give anything else than the needed feed url to ge
The last line of the file above only has the url of a rss feed. All entries from this feed will be tooted. The last line of the file above only has the url of a rss feed. All entries from this feed will be tooted.
How to display available sections of the rss feed
=================================================
Feed2toot offers the **--rss-sections** command line option to display the available section of the rss feed and exits::
$ feed2toot --rss-sections -c feed2toot.ini
The following sections are available in this RSS feed: ['title', 'comments', 'authors', 'link', 'author', 'summary', 'links', 'tags', id', 'author_detail', 'published'].

View file

@ -25,7 +25,7 @@ Alternatively, Setuptools may be installed to a user-local path::
* Untar the tarball and go to the source directory with the following commands:: * Untar the tarball and go to the source directory with the following commands::
$ tar zxvf feed2toot-0.17.tar.gz $ tar zxvf feed2toot-0.11.tar.gz
$ cd feed2toot $ cd feed2toot
* Next, to install Feed2toot on your computer, type the following command with the root user:: * Next, to install Feed2toot on your computer, type the following command with the root user::

View file

@ -5,8 +5,8 @@ After the configuration of Feed2toot, just launch the following command::
$ feed2toot -c /path/to/feed2toot.ini $ feed2toot -c /path/to/feed2toot.ini
Run Feed2toot on a regular basis Run Feed2toot on a regular basis
--------------------------------- =================================
Feed2toot should be launched on a regular basis in order to efficiently send your new RSS entries to Mastodon. It is quite easy to achieve by adding a line to your user crontab, as described below:: Feed2toot should be launche on a regular basis in order to efficiently send your new RSS entries to Mastodon. It is quite easy to achieve with adding a line to your user crontab, as described below::
@hourly feed2toot -c /path/to/feed2toot.ini @hourly feed2toot -c /path/to/feed2toot.ini
@ -15,19 +15,19 @@ will execute feed2toot every hour. Or without the syntactic sugar in the global
0 * * * * johndoe feed2toot -c /path/to/feed2toot.ini 0 * * * * johndoe feed2toot -c /path/to/feed2toot.ini
Test option Test option
----------- ===========
In order to know what's going to be sent to Mastodon without actually doing it, use the **--dry-run** option:: In order to know what's going to be sent to Mastodon without actually doing it, use the **--dry-run** option::
$ feed2toot --dry-run -c /path/to/feed2toot.ini $ feed2toot --dry-run -c /path/to/feed2toot.ini
Debug option Debug option
------------ ============
In order to increase the verbosity of what's Feed2toot is doing, use the **--debug** option followed by the level of verbosity see [the the available different levels](https://docs.python.org/3/library/logging.html):: In order to increase the verbosity of what's Feed2toot is doing, use the **--debug** option followed by the level of verbosity see [the the available different levels](https://docs.python.org/3/library/logging.html)::
$ feed2toot --debug -c /path/to/feed2toot.ini $ feed2toot --debug -c /path/to/feed2toot.ini
Populate the cache file without posting toots Populate the cache file without posting tweets
--------------------------------------------- ==============================================
Starting from 0.8, Feed2toot offers the **--populate-cache** command line option to populate the cache file without posting to Mastodon:: Starting from 0.8, Feed2toot offers the **--populate-cache** command line option to populate the cache file without posting to Mastodon::
$ feed2toot --populate-cache -c feed2toot.ini $ feed2toot --populate-cache -c feed2toot.ini
@ -43,55 +43,14 @@ Starting from 0.8, Feed2toot offers the **--populate-cache** command line option
populating RSS entry https://www.journalduhacker.net/s/lqswmz populating RSS entry https://www.journalduhacker.net/s/lqswmz
How to display available sections of the rss feed How to display available sections of the rss feed
------------------------------------------------- =================================================
Starting from 0.8, Feed2toot offers the **--rss-sections** command line option to display the available section of the rss feed and exits:: Starting from 0.8, Feed2toot offers the **--rss-sections** command line option to display the available section of the rss feed and exits::
$ feed2toot --rss-sections -c feed2toot.ini $ feed2toot --rss-sections -c feed2toot.ini
The following sections are available in this RSS feed: ['title', 'comments', 'authors', 'link', 'author', 'summary', 'links', 'tags', id', 'author_detail', 'published']. The following sections are available in this RSS feed: ['title', 'comments', 'authors', 'link', 'author', 'summary', 'links', 'tags', id', 'author_detail', 'published'].
Using syslog Using syslog
------------ ============
Feed2toot is able to send its log to syslog. You can use it with the following command:: Feed2toot is able to send its log to syslog. You can use it with the following command::
$ feed2toot --syslog=WARN -c /path/to/feed2toot.ini $ feed2toot --syslog=WARN -c /path/to/feed2toot.ini
Limit number of rss entries published at each execution
-------------------------------------------------------
If you want to limit the number of rss entries published at each execution, you can use the --limit CLI option.
$ feed2toot --limit 5 -c /path/to/feed2toot.ini
The number of posts to Mastodon will be at 5 posts top with this CLI option.
Use register_feed2toot_app
==========================
You need a Mastodon app associated to a user on the Mastodon instance. The script register_feed2toot_app will create an app for Feed2toot and upload it on the specified Mastodon instance.
Primary usage ::
$ register_feed2toot_app
Possible CLI options:
- use the **--client-credentials-file** option to change the filename in which the client credentials are stored (defaults to feed2toot_clientcred.txt)
- use the **--user-credentials-file** option to change the filename in which the user credentials are stored (defaults to feed2toot_usercred.txt)
- use the **--name** to change the Mastodon app name (defaults to feed2toot)
Example with full options and full output::
$ ./register_feed2toot_app --user-credentials-file f2tusercreds.txt --client-credentials-file f2tclientcreds.txt --name f2t
This script generates the Mastodon application credentials for Feed2toot.
f2tclientcreds.txt and f2tusercreds.txt will be written
in the current directory: /home/me/feed2toot/scripts.
WARNING: previous files with the same names will be overwritten.
A connection is also initiated to create the application.
Your password is *not* stored.
Mastodon instance URL (defaults to https://mastodon.social): https://framapiaf.org
Mastodon login: toto@titi.com
Mastodon password:
The app f2t was added to your preferences=>authorized apps page.
The file f2tclientcreds.txt and f2tusercreds.txt were created in the current directory.

View file

@ -1,6 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# vim:ts=4:sw=4:ft=python:fileencoding=utf-8 # vim:ts=4:sw=4:ft=python:fileencoding=utf-8
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,6 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# vim:ts=4:sw=4:ft=python:fileencoding=utf-8 # vim:ts=4:sw=4:ft=python:fileencoding=utf-8
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2017 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,6 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# vim:ts=4:sw=4:ft=python:fileencoding=utf-8 # vim:ts=4:sw=4:ft=python:fileencoding=utf-8
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or
@ -24,7 +24,7 @@ import os
import os.path import os.path
import sys import sys
__version__ = '0.17' __version__ = '0.11'
class CliParse: class CliParse:
'''CliParse class''' '''CliParse class'''
@ -34,7 +34,7 @@ class CliParse:
def main(self): def main(self):
'''main of CliParse class''' '''main of CliParse class'''
feed2tootepilog = 'For more information: https://feed2toot.readthedocs.io' feed2tootepilog = 'For more information: https://feed2toot.readhthedocs.org'
feed2tootdescription = 'Take rss feed and send it to Mastodon' feed2tootdescription = 'Take rss feed and send it to Mastodon'
parser = ArgumentParser(prog='feed2toot', parser = ArgumentParser(prog='feed2toot',
description=feed2tootdescription, description=feed2tootdescription,
@ -50,9 +50,6 @@ class CliParse:
parser.add_argument('-a', '--all', action='store_true', default=False, parser.add_argument('-a', '--all', action='store_true', default=False,
dest='all', dest='all',
help='tweet all RSS items, regardless of cache') help='tweet all RSS items, regardless of cache')
parser.add_argument('--ignore-ssl', action='store_true', default=False,
dest='ignore_ssl',
help='ignore ssl errors while fetching rss feeds')
parser.add_argument('-l', '--limit', dest='limit', default=10, type=int, parser.add_argument('-l', '--limit', dest='limit', default=10, type=int,
help='tweet only LIMIT items (default: %(default)s)') help='tweet only LIMIT items (default: %(default)s)')
parser.add_argument('-t', '--lock-timeout', dest='locktimeout', default=3600, type=int, parser.add_argument('-t', '--lock-timeout', dest='locktimeout', default=3600, type=int,

View file

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or
@ -30,18 +30,15 @@ import feedparser
# feed2toot library imports # feed2toot library imports
from feed2toot.confparsers.cache import parsecache from feed2toot.confparsers.cache import parsecache
from feed2toot.confparsers.hashtaglist import parsehashtaglist from feed2toot.confparsers.hashtaglist import parsehashtaglist
from feed2toot.confparsers.hashtags.nohashtags import parsenotagsintoot
from feed2toot.confparsers.feedparser import parsefeedparser from feed2toot.confparsers.feedparser import parsefeedparser
from feed2toot.confparsers.lock import parselock from feed2toot.confparsers.lock import parselock
from feed2toot.confparsers.media import parsemedia from feed2toot.confparsers.media import parsemedia
from feed2toot.confparsers.plugins import parseplugins from feed2toot.confparsers.plugins import parseplugins
from feed2toot.confparsers.rss.ignoressl import parseignoressl
from feed2toot.confparsers.rss.pattern import parsepattern from feed2toot.confparsers.rss.pattern import parsepattern
from feed2toot.confparsers.rss.toot import parsetoot from feed2toot.confparsers.rss.toot import parsetoot
from feed2toot.confparsers.rss.uri import parseuri from feed2toot.confparsers.rss.uri import parseuri
from feed2toot.confparsers.rss.urilist import parseurilist from feed2toot.confparsers.rss.urilist import parseurilist
from feed2toot.confparsers.rss.addtags import parseaddtags from feed2toot.confparsers.rss.addtags import parseaddtags
from feed2toot.confparsers.rss.tootmaxlen import parsetootmaxlen
class ConfParse: class ConfParse:
'''ConfParse class''' '''ConfParse class'''
@ -69,7 +66,6 @@ class ConfParse:
# the rss section # the rss section
########################### ###########################
self.tweetformat = parsetoot(config) self.tweetformat = parsetoot(config)
options['tootmaxlen'] = parsetootmaxlen(config)
################################################# #################################################
# pattern and patter_case_sensitive format option # pattern and patter_case_sensitive format option
################################################# #################################################
@ -82,32 +78,23 @@ class ConfParse:
# addtags option, default: True # addtags option, default: True
############################### ###############################
options['addtags'] = parseaddtags(config) options['addtags'] = parseaddtags(config)
###################
# ignore_ssl option
###################
ignore_ssl = parseignoressl(config, self.clioptions.ignore_ssl)
################# #################
# uri_list option # uri_list option
################# #################
feeds = [] feeds = []
feeds = parseurilist(config, accept_bozo_exceptions, ignore_ssl) feeds = parseurilist(config, accept_bozo_exceptions)
############ ############
# uri option # uri option
############ ############
if config.has_option('rss', 'uri') or self.clioptions.rss_uri: options['rss_uri'], feed, feedname, options['nopatternurinoglobalpattern'] = parseuri(config, self.clioptions.rss_uri, feeds)
options['rss_uri'], feed, feedname, options['nopatternurinoglobalpattern'] = parseuri(config, self.clioptions.rss_uri, feeds, ignore_ssl)
else:
if config.has_option('rss', 'no_uri_pattern_no_global_pattern'):
options['nopatternurinoglobalpattern'] = config.getboolean('rss', 'no_uri_pattern_no_global_pattern')
########################### ###########################
# the cache section # the cache section
########################### ###########################
options['cachefile'], options['cache_limit'] = parsecache(self.clioptions.cachefile, config) options['cachefile'], options['cache_limit'] = parsecache(self.clioptions.cachefile, config)
########################### ###########################
# the hashtaglist section # the hashtag section
########################### ###########################
options['hashtaglist'] = parsehashtaglist(self.clioptions.hashtaglist, config) options['hashtaglist'] = parsehashtaglist(self.clioptions.hashtaglist, config)
options['notagsintoot'] = parsenotagsintoot(config)
########################### ###########################
# the media section # the media section
########################### ###########################

View file

@ -1,6 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# vim:ts=4:sw=4:ft=python:fileencoding=utf-8 # vim:ts=4:sw=4:ft=python:fileencoding=utf-8
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2017-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,15 +0,0 @@
#!/usr/bin/env python3
# vim:ts=4:sw=4:ft=python:fileencoding=utf-8
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>

View file

@ -1,26 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/
# Get values of the no_tags_in_toot option of the hashtaglist section
'''Get values of the no_tags_in_toot option of the hashtaglist section'''
def parsenotagsintoot(config):
'''Parse configuration values and get values of the the no_tags_in_toot option of the hashtaglist section'''
section = 'hashtaglist'
option = 'no_tags_in_toot'
notagsintoot = False
if config.has_option(section, option):
notagsintoot = config.getboolean(section, option)
return notagsintoot

View file

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,6 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# vim:ts=4:sw=4:ft=python:fileencoding=utf-8 # vim:ts=4:sw=4:ft=python:fileencoding=utf-8
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2017-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,30 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/
# Get values of the ignoressl option of the rss section
'''Get values of the ignoressl option of the rss section'''
# standard library imports
import ssl
def parseignoressl(config, ignore_ssl_from_cli):
'''Parse configuration values and get values of the feedparser section'''
section = 'rss'
option = 'ignore_ssl'
if config.has_option(section, option):
ignoressl = config.getboolean(section, option)
else:
ignoressl = ignore_ssl_from_cli
return ignoressl

View file

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,37 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/
# Get value of the toot/tweet option of rss section
'''Get value of the toot/tweet option of the rss section'''
# standard library imports
import sys
import logging
def parsetootmaxlen(config):
'''Parse configuration value of the toot_max_len option of the rss section'''
section = 'rss'
tootmaxlen = 500
if config.has_section(section):
############################
# toot_max_len parameter
############################
confoption = 'toot_max_len'
if config.has_option(section, confoption):
try:
tootmaxlen = int(config.get(section, confoption))
except ValueError as err:
sys.exit('Error in configuration with the {confoption} parameter in [{section}]: {err}'.format(confoption=confoption, section=section, err=err))
return tootmaxlen

View file

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or
@ -18,11 +18,10 @@
# standard library imports # standard library imports
import feedparser import feedparser
import ssl
import sys import sys
import re import re
def parseuri(config, clioption, feeds, ignoressl): def parseuri(config, clioption, feeds):
'''Parse configuration value of the uri option of the rss section''' '''Parse configuration value of the uri option of the rss section'''
rssuri = '' rssuri = ''
feedname ='' feedname =''
@ -49,10 +48,6 @@ def parseuri(config, clioption, feeds, ignoressl):
sys.exit('{confoption} parameter in the [{section}] section of the configuration file is mandatory. Exiting.'.format(section=section, confoption=confoption)) sys.exit('{confoption} parameter in the [{section}] section of the configuration file is mandatory. Exiting.'.format(section=section, confoption=confoption))
else: else:
rssuri = clioption rssuri = clioption
# ignore ssl if asked
if ignoressl:
if hasattr(ssl, '_create_unverified_context'):
ssl._create_default_https_context = ssl._create_unverified_context
# get the rss feed for rss parameter of [rss] section # get the rss feed for rss parameter of [rss] section
feed = feedparser.parse(rssuri) feed = feedparser.parse(rssuri)
if not feed: if not feed:

View file

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or
@ -20,11 +20,10 @@
import feedparser import feedparser
import logging import logging
import os.path import os.path
import ssl
import sys import sys
import re import re
def parseurilist(config, accept_bozo_exceptions, ignoressl): def parseurilist(config, accept_bozo_exceptions):
'''Parse configuration value of the uri_list option of the rss section''' '''Parse configuration value of the uri_list option of the rss section'''
bozoexception = False bozoexception = False
feeds = [] feeds = []
@ -63,10 +62,6 @@ def parseurilist(config, accept_bozo_exceptions, ignoressl):
patternstring = '' patternstring = ''
# split different searched patterns # split different searched patterns
patterns = [i for i in patternstring.split(stringsep) if i] patterns = [i for i in patternstring.split(stringsep) if i]
# ignore ssl if asked
if ignoressl:
if hasattr(ssl, '_create_unverified_context'):
ssl._create_default_https_context = ssl._create_unverified_context
# retrieve the content of the rss # retrieve the content of the rss
feed = feedparser.parse(rss) feed = feedparser.parse(rss)
if 'bozo_exception' in feed: if 'bozo_exception' in feed:

View file

@ -1,5 +1,5 @@
# vim:ts=4:sw=4:ft=python:fileencoding=utf-8 # vim:ts=4:sw=4:ft=python:fileencoding=utf-8
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,5 +1,5 @@
# vim:ts=4:sw=4:ft=python:fileencoding=utf-8 # vim:ts=4:sw=4:ft=python:fileencoding=utf-8
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,5 +1,5 @@
# vim:ts=4:sw=4:ft=python:fileencoding=utf-8 # vim:ts=4:sw=4:ft=python:fileencoding=utf-8
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,6 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# vim:ts=4:sw=4:ft=python:fileencoding=utf-8 # vim:ts=4:sw=4:ft=python:fileencoding=utf-8
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or
@ -40,8 +40,10 @@ from feed2toot.message import build_message
from feed2toot.message import send_message_dry_run from feed2toot.message import send_message_dry_run
from feed2toot.message import send_message from feed2toot.message import send_message
from feed2toot.plugins import activate_plugins from feed2toot.plugins import activate_plugins
from feed2toot.removeduplicates import RemoveDuplicates
from feed2toot.rss import populate_rss from feed2toot.rss import populate_rss
from feed2toot.sortentries import sort_entries from feed2toot.sortentries import sort_entries
from feed2toot.tootpost import TootPost
class Main: class Main:
'''Main class of Feed2toot''' '''Main class of Feed2toot'''
@ -96,11 +98,9 @@ class Main:
if clioptions.rsssections: if clioptions.rsssections:
if entries: if entries:
print('The following sections are available in this RSS feed: {}'.format([j for j in entries[0]])) print('The following sections are available in this RSS feed: {}'.format([j for j in entries[0]]))
else:
print('Could not parse the section of the rss feed')
# release the lock file
lockfile.release()
sys.exit(0) sys.exit(0)
else:
sys.exit('Could not parse the section of the rss feed')
# sort entries and check if they were not previously sent # sort entries and check if they were not previously sent
totweet = sort_entries(clioptions.all, cache, entries) totweet = sort_entries(clioptions.all, cache, entries)
for entry in totweet: for entry in totweet:
@ -116,7 +116,7 @@ class Main:
fe = FilterEntry(elements, entry, options, feed['patterns'], feed['rssobject'], feed['feedname']) fe = FilterEntry(elements, entry, options, feed['patterns'], feed['rssobject'], feed['feedname'])
entrytosend = fe.finalentry entrytosend = fe.finalentry
if entrytosend: if entrytosend:
finaltweet = build_message(entrytosend, tweetformat, rss, options['tootmaxlen'], options['notagsintoot']) finaltweet = build_message(entrytosend, tweetformat, rss)
if clioptions.dryrun: if clioptions.dryrun:
send_message_dry_run(config, entrytosend, finaltweet) send_message_dry_run(config, entrytosend, finaltweet)
else: else:

View file

@ -1,5 +1,5 @@
# vim:ts=4:sw=4:ft=python:fileencoding=utf-8 # vim:ts=4:sw=4:ft=python:fileencoding=utf-8
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or
@ -26,15 +26,11 @@ from feed2toot.addtags import AddTags
from feed2toot.removeduplicates import RemoveDuplicates from feed2toot.removeduplicates import RemoveDuplicates
from feed2toot.tootpost import TootPost from feed2toot.tootpost import TootPost
def build_message(entrytosend, tweetformat, rss, tootmaxlen, notagsintoot): def build_message(entrytosend, tweetformat, rss):
'''populate the rss dict with the new entry''' '''populate the rss dict with the new entry'''
tweetwithnotag = tweetformat.format(**entrytosend) tweetwithnotag = tweetformat.format(**entrytosend)
# replace line breaks
tootwithlinebreaks = tweetwithnotag.replace('\\n', '\n')
# remove duplicates from the final tweet # remove duplicates from the final tweet
dedup = RemoveDuplicates(tootwithlinebreaks) dedup = RemoveDuplicates(tweetwithnotag)
# only add tags if user wants to
if not notagsintoot:
# only append hashtags if they exist # only append hashtags if they exist
# remove last tags if tweet too long # remove last tags if tweet too long
if 'hashtags' in rss: if 'hashtags' in rss:
@ -42,15 +38,9 @@ def build_message(entrytosend, tweetformat, rss, tootmaxlen, notagsintoot):
finaltweet = addtag.finaltweet finaltweet = addtag.finaltweet
else: else:
finaltweet = dedup.finaltweet finaltweet = dedup.finaltweet
else:
finaltweet = dedup.finaltweet
# strip html tags # strip html tags
finaltweet = BeautifulSoup(finaltweet, 'html.parser').get_text() finaltweet = BeautifulSoup(finaltweet, 'html.parser').get_text()
# truncate toot to user-defined value whatever the content is
if len(finaltweet) > tootmaxlen:
finaltweet = finaltweet[0:tootmaxlen-1]
return ''.join([finaltweet[0:-3], '...'])
else:
return finaltweet return finaltweet
def send_message_dry_run(config, entrytosend, finaltweet): def send_message_dry_run(config, entrytosend, finaltweet):

View file

@ -1,6 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# vim:ts=4:sw=4:ft=python:fileencoding=utf-8 # vim:ts=4:sw=4:ft=python:fileencoding=utf-8
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,5 +1,5 @@
# vim:ts=4:sw=4:ft=python:fileencoding=utf-8 # vim:ts=4:sw=4:ft=python:fileencoding=utf-8
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,5 +1,5 @@
# vim:ts=4:sw=4:ft=python:fileencoding=utf-8 # vim:ts=4:sw=4:ft=python:fileencoding=utf-8
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,5 +1,5 @@
# vim:ts=4:sw=4:ft=python:fileencoding=utf-8 # vim:ts=4:sw=4:ft=python:fileencoding=utf-8
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,15 +0,0 @@
#!/usr/bin/env python3
# vim:ts=4:sw=4:ft=python:fileencoding=utf-8
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>

View file

@ -1,6 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# vim:ts=4:sw=4:ft=python:fileencoding=utf-8 # vim:ts=4:sw=4:ft=python:fileencoding=utf-8
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or

View file

@ -1,6 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
#!/usr/bin/env python3
# vim:ts=4:sw=4:ft=python:fileencoding=utf-8 # vim:ts=4:sw=4:ft=python:fileencoding=utf-8
# Copyright © 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright © 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or
@ -14,41 +15,15 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/> # along with this program. If not, see <http://www.gnu.org/licenses/>
from argparse import ArgumentParser
from getpass import getpass from getpass import getpass
from os import getcwd from os import getcwd
from os import linesep
from os import sep
from mastodon import Mastodon from mastodon import Mastodon
from mastodon.Mastodon import MastodonIllegalArgumentError from mastodon.Mastodon import MastodonIllegalArgumentError
import sys import sys
__version__ = '0.2' print('\nThis script generates the Mastodon application credentials for Feed2toot.\nfeed2toot_clientcred.txt and feed2toot_usercred.txt will be written\nin the current directory: {cwd}.\nA connection is initiated to create the application.\nYour password is *not* stored.\n'.format(cwd=getcwd()))
epilog = 'For more information: https://feed2toot.readthedocs.io'
description = 'Create a Mastodon app for Feed2toot'
parser = ArgumentParser(prog='register_feed2toot_app',
description=description,
epilog=epilog)
parser.add_argument('--version', action='version', version=__version__)
parser.add_argument('--client-credentials-file', dest='clientcredfile', help='the name of the client credentials for the Mastodon app', default='feed2toot_clientcred.txt')
parser.add_argument('--user-credentials-file', dest='usercredfile', help='the name of the user credentials for the Mastodon app', default='feed2toot_usercred.txt')
parser.add_argument('--name', help='the name of the Mastodon app', default='feed2toot')
parser.add_argument('--instance', help='the URL of the Mastodon instance')
parser.add_argument('--username', help='the username of your Mastodon account')
parser.add_argument('--password', help='the password of your Mastodon account')
opts = parser.parse_args()
clientcredfile=opts.clientcredfile
usercredfile=opts.usercredfile
headline = '{linesep}This script generates the Mastodon application credentials for Feed2toot.{linesep}{clientcredfile} and {usercredfile} will be written{linesep}in the current directory: {cwd}.{linesep}WARNING: previous files with the same names will be overwritten.{linesep}{linesep}A connection is also initiated to create the application.{linesep}Your password is *not* stored.{linesep}'.format(linesep=linesep, clientcredfile=clientcredfile, usercredfile=usercredfile, cwd=getcwd())
print(headline)
# get the instance # get the instance
instance = opts.instance
if not instance:
instance = input('Mastodon instance URL (defaults to https://mastodon.social): ') instance = input('Mastodon instance URL (defaults to https://mastodon.social): ')
if not instance: if not instance:
instance = 'https://mastodon.social' instance = 'https://mastodon.social'
@ -57,45 +32,34 @@ elif not instance.startswith('http'):
# get the username # get the username
userok = False userok = False
quit_on_error = True
while not userok: while not userok:
user = opts.username
if not user:
user = input('Mastodon login: ') user = input('Mastodon login: ')
quit_on_error = False
if not user: if not user:
print('Your Mastodon username can not be empty.') print('Your Mastodon username can not be empty.')
userok = False
elif '@' not in user or '.' not in user: elif '@' not in user or '.' not in user:
print('Your Mastodon username should be an email.') print('Your Mastodon username should be an email.')
userok = False
else: else:
userok = True userok = True
if not userok and quit_on_error:
exit()
# get the password # get the password
password = opts.password
if not password:
password = getpass(prompt='Mastodon password: ') password = getpass(prompt='Mastodon password: ')
Mastodon.create_app( Mastodon.create_app(
opts.name, 'feed2toot',
api_base_url=instance, api_base_url=instance,
to_file = '{cwd}{sep}{clientcredfile}'.format(cwd=getcwd(), sep=sep, clientcredfile=clientcredfile) to_file = '{cwd}/feed2toot_clientcred.txt'.format(cwd=getcwd())
) )
mastodon = Mastodon(client_id = '{cwd}{sep}{clientcredfile}'.format(cwd=getcwd(), sep=sep, clientcredfile=clientcredfile), mastodon = Mastodon(client_id = '{cwd}/feed2toot_clientcred.txt'.format(cwd=getcwd()),
api_base_url=instance) api_base_url=instance)
try: try:
mastodon.log_in( mastodon.log_in(
user, user,
password, password,
to_file = '{cwd}{sep}{usercredfile}'.format(cwd=getcwd(), sep=sep, usercredfile=usercredfile) to_file = '{cwd}/feed2toot_usercred.txt'.format(cwd=getcwd())
) )
except MastodonIllegalArgumentError as err: except MastodonIllegalArgumentError as err:
print(err) print(err)
sys.exit('{linesep}I guess you entered a bad login or password.{linesep}'.format(linesep=linesep)) sys.exit('\nI guess you entered a bad login or password.\n')
print('feed2toot was added to your preferences=>authorized apps page.')
summary = '{linesep}The app {appname} was added to your Preferences=>Accounts=>Authorized apps page.{linesep}The file {clientcredfile} and {usercredfile} were created in the current directory.{linesep}'.format(appname=opts.name,
linesep=linesep,
clientcredfile=clientcredfile,
usercredfile=usercredfile)
print(summary)
sys.exit(0) sys.exit(0)

View file

@ -1,4 +1,4 @@
# Copyright 2015-2021 Carl Chenet <carl.chenet@ohmytux.com> # Copyright 2015-2019 Carl Chenet <carl.chenet@ohmytux.com>
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or
@ -31,12 +31,12 @@ CLASSIFIERS = [
setup( setup(
name='feed2toot', name='feed2toot',
version='0.17', version='0.11',
license='GNU GPL v3', license='GNU GPL v3',
description='Parse rss feeds and send new posts to Mastodon', description='Parse rss feeds and send new posts to Mastodon',
long_description='Parse rss feeds and send new posts to the Mastodon social network', long_description='Parse rss feeds and send new posts to the Mastodon social network',
author = 'Carl Chenet', author = 'Carl Chenet',
author_email = 'carl.chenet@ohmytux.com', author_email = 'chaica@ohmytux.com',
url = 'https://gitlab.com/chaica/feed2toot', url = 'https://gitlab.com/chaica/feed2toot',
classifiers=CLASSIFIERS, classifiers=CLASSIFIERS,
download_url='https://gitlab.com/chaica/feed2toot', download_url='https://gitlab.com/chaica/feed2toot',