diff --git a/README.md b/README.md index 53fe1f9..6902917 100644 --- a/README.md +++ b/README.md @@ -13,10 +13,10 @@ A PixelFed to Mastodon and Twitter crossposter that is not written as intended. In order to post PixelFed entries to Twitter, you will need a Mastodon-Twitter crossposter, you may find them on web. ## Installation - ``` -pip3 install pfxposter +python3 -m pip install pfxposter ``` +Using virtual enviroment is strongly recommended, for the reason that the requests library of the distro vendor may be overrided after the installation. ## Usage diff --git a/data/config.toml b/data/config.toml index 440dc94..c4463e9 100644 --- a/data/config.toml +++ b/data/config.toml @@ -1,4 +1,4 @@ -updated = 2020-08-24 00:00:00+00:00 +updated = 1970-01-01T00:00:00+00:00 [mastodon] mastodon_url = "https://oyd.social" diff --git a/pfxposter/__init__.py b/pfxposter/__init__.py index a44685a..2319cb5 100644 --- a/pfxposter/__init__.py +++ b/pfxposter/__init__.py @@ -1,7 +1,3 @@ -#!/usr/bin/env python3 - -from .pfxposter import * - -__version__ = '0.1.2' - +from .poster import * +__version__ = '0.1.6' diff --git a/pfxposter/__main__.py b/pfxposter/__main__.py new file mode 100644 index 0000000..4dc0952 --- /dev/null +++ b/pfxposter/__main__.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python3 +from . import poster + +if __name__ == "__main__": + poster.main() diff --git a/pfxposter/pfxposter.py b/pfxposter/pfxposter.py deleted file mode 100644 index a81dac7..0000000 --- a/pfxposter/pfxposter.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python3 - -from mastodon import Mastodon -import requests -import atoma -import re -import tempfile -import toml -import os - -homedir = os.getenv("HOME") -config_file = "{}/.pfxposter".format(homedir) - -if os.path.exists(config_file) == False: - conf_includes = 'updated = 2020-08-24 00:00:00+00:00\n\n[mastodon]\nmastodon_url = "https://oyd.social"\naccess_token = "your_access_token_here"\n\n[pixelfed]\npixelfed_url = "https://pixelfed.social"\nusername = "username"' - with open(config_file, "w") as f: - f.write(conf_includes) - print("Configuration file created please edit") - os._exit(0) - -config = toml.load(config_file) - -username = config['pixelfed']['username'] -last_updated = config['updated'] - -mastodon = Mastodon( - access_token = config['mastodon']['access_token'], - api_base_url = config['mastodon']['mastodon_url'] -) - -def main(): - - pixelfeed_get = requests.get('https://pixelfed.social/users/{}.atom'.format(username)) - pixelfeed = atoma.parse_atom_bytes(pixelfeed_get.content) - - latest_post = pixelfeed.entries[0] - last_updated_atom = latest_post.updated - if last_updated == last_updated_atom: - print("Up-to-date") - os._exit(0) - config['updated'] = last_updated_atom - with open(config_file, "w") as f: - toml.dump(config, f) - print("Config file updated") - image_name = latest_post.title.value - image_url = re.search("(?Phttps?://[^\s]+)", latest_post.summary.value).group("url").rstrip('">').replace("_thumb", "") - tmp = tempfile.NamedTemporaryFile(suffix=".jpg") - get_image = requests.get(image_url) - tmp.write(get_image.content) - mastodon_media = mastodon.media_post(tmp.name) - mastodon.status_post(image_name, media_ids=mastodon_media['id']) - print("Status posted: ", image_name) - tmp.close() -if __name__ == "__main__": - main() diff --git a/pfxposter/poster.py b/pfxposter/poster.py new file mode 100644 index 0000000..7e2f7b7 --- /dev/null +++ b/pfxposter/poster.py @@ -0,0 +1,80 @@ +import os +import re +import sys +import tempfile +import textwrap + +import atoma +import requests +import toml +from mastodon import Mastodon + +homedir = os.getenv("HOME") +config_file = "{}/.pfxposter".format(homedir) + +def create_config(config_file): + conf_includes = textwrap.dedent(""" + updated = 2020-08-24 00:00:00+00:00 + + [mastodon] + mastodon_url = "https://oyd.social" + access_token = "your_access_token_here" + + [pixelfed] + pixelfed_url = "https://pixelfed.social" + username = "username" + """) + with open(config_file, "w") as f: + f.write(conf_includes) + print("Configuration file created please edit") + sys.exit(0) + + +def syncronize(config_file, config, username, last_updated, mastodon): + pixelfeed_get = requests.get('https://pixelfed.social/users/{}.atom'.format(username)) + pixelfeed = atoma.parse_atom_bytes(pixelfeed_get.content) + + latest_post = pixelfeed.entries[0] + last_updated_atom = latest_post.updated + + if last_updated == last_updated_atom: + print("Up-to-date") + sys.exit(0) + + config['updated'] = last_updated_atom + + with open(config_file, "w") as f: + toml.dump(config, f) + print("Config file updated") + + image_name = latest_post.title.value + image_url = re.search(r"(?Phttps?://[^\s]+)", latest_post.summary.value) \ + .group("url") \ + .rstrip('">') \ + .replace("_thumb", "") + tmp = tempfile.NamedTemporaryFile(suffix=".jpg") + get_image = requests.get(image_url) + tmp.write(get_image.content) + mastodon_media = mastodon.media_post(tmp.name) + mastodon.status_post(image_name, media_ids=mastodon_media['id']) + print("Status posted: ", image_name) + tmp.close() + + +def main(): + if not os.path.exists(config_file): + create_config(config_file) + + config = toml.load(config_file) + + username = config['pixelfed']['username'] + last_updated = config['updated'] + + mastodon = Mastodon( + access_token=config['mastodon']['access_token'], + api_base_url=config['mastodon']['mastodon_url'] + ) + syncronize(config_file, config, username, last_updated, mastodon) + + + diff --git a/requirements.txt b/requirements.txt index 6044b60..645ce9f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,3 +3,4 @@ Mastodon.py>=1.5.1 atoma>=0.0.17 toml>=0.10.1 python-crontab>=2.5.1 +requests \ No newline at end of file diff --git a/setup.py b/setup.py index 2a8f418..aa9ef30 100755 --- a/setup.py +++ b/setup.py @@ -10,13 +10,10 @@ with open("README.md", "r") as fh: long_description = fh.read() def _post_install(): - conf_includes = 'updated = 2020-08-24 00:00:00+00:00\n\n[mastodon]\n mastodon_url = "https://oyd.social"\naccess_token = "your_access_token_here"\n\n[pixelfed]\npixelfed_url = "https://pixelfed.social"\nusername = "username"' cron_job = CronTab(user=os.getenv("USER")) autochecker = cron_job.new(command='pfxposter') autochecker.minute.every(1) cron_job.write() - with open("{}/.pfxposter".format(os.getenv("HOME")), "w") as conf: - conf.write(conf_includes) setup( name='pfxposter', @@ -45,10 +42,10 @@ setup( "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Internet", ], - entry_points={"console_scripts": ["pfxposter = pfxposter.pfxposter:main"]}, - data_files=[('/home/{}/.pfxposter'.format(os.getenv("USER")), ['data/config.toml'])], + entry_points={"console_scripts": ["pfxposter = pfxposter.poster:main"]}, + #data_files=[('/home/{}/.pfxposter'.format(os.getenv("USER")), ['data/config.toml'])], python_requires=">=3.6", - install_requires=['Mastodon.py>=1.5.1', 'atoma>=0.0.17', 'toml>=0.10.1', 'python-crontab>=2.5.1'] + install_requires=['Mastodon.py>=1.5.1', 'atoma>=0.0.17', 'toml>=0.10.1', 'python-crontab>=2.5.1', 'requests'] ) _post_install()