Merge branch 'susbt' of https://gitlab.com/jeancf/twoot into susbt

This commit is contained in:
jeancf 2022-12-07 20:33:33 +01:00
commit 837013b4ca
3 changed files with 58 additions and 45 deletions

View File

@ -1,3 +1,5 @@
# Changelog
**23 NOV 2022** VERSION 2.5 Added command-line option (-l) to remove **23 NOV 2022** VERSION 2.5 Added command-line option (-l) to remove
redirection from links included in tweets. Obfuscated links are replaced redirection from links included in tweets. Obfuscated links are replaced
by the URL that the resource is directly downloaded from. Also improved by the URL that the resource is directly downloaded from. Also improved

View File

@ -5,7 +5,7 @@ It is simple to set-up on a local machine, configurable and feature-rich.
**UPDATE XX DEC 2022** VERSION 3.0 brings some important changes and new features: **UPDATE XX DEC 2022** VERSION 3.0 brings some important changes and new features:
* **If you are using a version of python < 3.11 you need to install the `tomli` module** * Only potentially breaking change: **If you are using a version of python < 3.11 you need to install the `tomli` module**
* Twoot can be configured with a config file in [TOML](https://toml.io/) format. Check `default.toml` for details * Twoot can be configured with a config file in [TOML](https://toml.io/) format. Check `default.toml` for details
* Domain susbtitution can be configured in the config file to replace links to Twitter, Youtube and * Domain susbtitution can be configured in the config file to replace links to Twitter, Youtube and
Reddit domains with alternatives (e.g. [Nitter](https://github.com/zedeus/nitter/wiki/Instances), Reddit domains with alternatives (e.g. [Nitter](https://github.com/zedeus/nitter/wiki/Instances),
@ -14,6 +14,7 @@ It is simple to set-up on a local machine, configurable and feature-rich.
* Added option to not add reference to "Original tweet" at the bottom of toots * Added option to not add reference to "Original tweet" at the bottom of toots
* A password must be provided with `-p` for the first run only. After that it is no longer required. * A password must be provided with `-p` for the first run only. After that it is no longer required.
* The verbosity of logging messages can be set in the config file with `log_level=`. * The verbosity of logging messages can be set in the config file with `log_level=`.
* Config file option `log_days =` specifies how long to keep log messages in file. Older messages are deleted.
> Previous updates can be found in CHANGELOG. > Previous updates can be found in CHANGELOG.
@ -33,9 +34,12 @@ It is simple to set-up on a local machine, configurable and feature-rich.
## Usage ## Usage
twoot.py [-h] [-f <.toml config file>] [-t <twitter account>] [-i <mastodon instance>] ```sh
[-m <mastodon account>] [-p <mastodon password>] [-r] [-s] [-l] [-u] [-v] [-o] twoot.py [-h] [-f <.toml config file>] [-t <twitter account>] [-i <mastodon instance>]
[-a <max age in days)>] [-d <min delay (in mins>] [-c <max # of toots to post>] [-m <mastodon account>] [-p <mastodon password>] [-r] [-s] [-l] [-u] [-v] [-o]
[-a <max age in days)>] [-d <min delay (in mins>] [-c <max # of toots to post>]
```
## Arguments ## Arguments
Assuming that the Twitter handle is @SuperDuperBot and the Mastodon account Assuming that the Twitter handle is @SuperDuperBot and the Mastodon account
@ -107,7 +111,7 @@ a version of python < 3.11 you also need to install the `tomli` module.
* [ffmpeg](https://ffmpeg.org/download.html) (installed with the package manager of your distribution) * [ffmpeg](https://ffmpeg.org/download.html) (installed with the package manager of your distribution)
```sh ```sh
pip install beautifulsoup4 Mastodon.py youtube-dl2 pip install beautifulsoup4 Mastodon.py youtube-dl2
``` ```
In your user folder, execute `git clone https://gitlab.com/jeancf/twoot.git` In your user folder, execute `git clone https://gitlab.com/jeancf/twoot.git`

View File

@ -539,10 +539,57 @@ def login(password):
def terminate(exit_code): def terminate(exit_code):
""" """
Cleanly stop execution with a message on execution duration Cleanly stop execution with a message on execution duration
Remove log messages older that duration specified in config from log file
:param exit_code: return value to pass to shell when exiting :param exit_code: return value to pass to shell when exiting
""" """
logging.info('Run time : {t:2.1f} seconds.'.format(t=time.time() - START_TIME)) logging.info('Run time : {t:2.1f} seconds.'.format(t=time.time() - START_TIME))
logging.info('_____________________________________________________________________________________') logging.info('_____________________________________________________________________________________')
# Close logger and log file
logging.shutdown()
# Remove older log messages
# Max allowed age of log message
max_delta = timedelta(TOML['options']['log_days'])
# Open log file
log_file_name = TOML['config']['twitter_account'] + '.log'
new_log_file_name = TOML['config']['twitter_account'] + '.log.new'
try:
log_file = open(log_file_name, 'r')
except FileNotFoundError:
# Nothing to do if there is no log file
exit(exit_code)
# Check each line
pos = log_file.tell()
while log_file:
line = log_file.readline()
try:
# Extract date on log line
date = datetime.strptime(line[:10], '%Y-%m-%d')
except ValueError:
# date was not found on this line, try next one
continue
# Time difference between log message and now
log_delta = datetime.now() - date
# Only keep the number of days of the difference
log_delta = timedelta(days=log_delta.days)
if log_delta < max_delta:
# Reset file pointer to position before reading last line
log_file.seek(pos)
remainder = log_file.read()
output_file = open(new_log_file_name, 'w')
output_file.write(remainder)
output_file.close()
# replace log file by new one
shutil.move(new_log_file_name, log_file_name)
break # Exit while loop
# Update read pointer position
pos = log_file.tell()
exit(exit_code) exit(exit_code)
@ -974,46 +1021,6 @@ def main(argv):
logging.info('Deleted ' + str(excess_count) + ' old records from database.') logging.info('Deleted ' + str(excess_count) + ' old records from database.')
# Close logger and log file
logging.shutdown()
# Remove older log messages
# Max allowed age of log message
max_delta = timedelta(TOML['options']['log_days'])
# Open log file
log_file_name = TOML['options']['twitter_account'] + '.log'
new_log_file_name = TOML['options']['twitter_account'] + '.log.new'
log_file = open(log_file_name, 'r')
# Check each line
pos = log_file.tell()
while log_file:
line = log_file.readline()
try:
# Extract date on log line
date = datetime.strptime(line[:10], '%Y-%m-%d')
except ValueError:
# date was not found on this line, try next one
continue
# Time difference between log message and now
log_delta = datetime.now() - date
# Only keep the number of days of the difference
log_delta = timedelta(days=log_delta.days)
if log_delta < max_delta:
# Reset file pointer to position before reading last line
log_file.seek(pos)
remainder = log_file.read()
output_file = open(new_log_file_name, 'w')
output_file.write(remainder)
output_file.close()
# replace log file by new one
shutil.move(new_log_file_name, log_file_name)
break # Exit while loop
pos = log_file.tell()
terminate(0) terminate(0)
if __name__ == "__main__": if __name__ == "__main__":