Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/cuducos/not-my-ex
🐝 Tiny CLI to post simultaneously to Mastodon and Bluesky
https://github.com/cuducos/not-my-ex
bluesky mastodon
Last synced: about 2 months ago
JSON representation
🐝 Tiny CLI to post simultaneously to Mastodon and Bluesky
- Host: GitHub
- URL: https://github.com/cuducos/not-my-ex
- Owner: cuducos
- License: gpl-3.0
- Created: 2023-10-27T21:19:33.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2024-09-07T01:19:13.000Z (4 months ago)
- Last Synced: 2024-09-27T14:07:53.656Z (3 months ago)
- Topics: bluesky, mastodon
- Language: Python
- Homepage: https://pypi.org/project/not-my-ex/
- Size: 246 KB
- Stars: 12
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Not my ex [![PyPI](https://img.shields.io/pypi/v/not-my-ex)](https://pypi.org/project/not-my-ex/) [![Tests](https://img.shields.io/github/actions/workflow/status/cuducos/not-my-ex/pytest.yml)](https://github.com/cuducos/not-my-ex/actions/workflows/pytest.yml) [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/not-my-ex)](https://pypi.org/project/not-my-ex/)
Tiny app to post simultaneously to Mastodon and Bluesky.
Obviously, based on [`cuducos/from-my-ex`](https://github.com/cuducos/from-my-ex).
It supports:
* Post status updates to both networks with a simple CLI command or GUI interface
* Posting with images
* Including alt text for images
* Setting post languageIt does not support:
* Tagging other users (they would have different IDs and servers in each platform)## Getting started
### Requirements
* Python 3.9 or newer
#### Environment variables
##### General settings
| Name | Description | Example | Default value |
|---|---|---|---|
| `NOT_MY_EX_DEFAULT_LANG` | 2-letter ISO 639-1 code | `"pt"` | `None` |##### To post to [Bluesky](https://bsky.app)
| Name | Description | Example | Default value |
|---|---|---|---|
| `NOT_MY_EX_BSKY_AGENT` | Bluesky instance | `"https://bsky.social"` | `"https://bsky.social"` |
| `NOT_MY_EX_BSKY_EMAIL` | Email used in Bluesky | `"[email protected]"` | `None` |
| `NOT_MY_EX_BSKY_PASSWORD` | Password used in Bluesky | As created in [App Passwords](https://bsky.app/settings/app-passwords). | `None` |Not setting `NOT_MY_EX_BSKY_EMAIL` **or** `NOT_MY_EX_BSKY_PASSWORD` disables posting to Bluesky.
##### To post to [Mastodon](https://joinmastodon.org/)
| Name | Description | Example | Default value |
|---|---|---|---|
| `NOT_MY_EX_MASTODON_INSTANCE` | Mastodon instance | `"https://tech.lgbt"` | `"https://mastodon.social"` |
| `NOT_MY_EX_MASTODON_TOKEN` | Mastodon access token | Go to your _Settings_, _Development_ and then create an app to get the access token. Select the `write:statuses` and `write:media` scopes. | `None` |Not setting `NOT_MY_EX_MASTODON_TOKEN` disables posting to Mastodon.
## Install
```console
$ pip install not-my-ex
```If you want to use the [GUI](https://en.wikipedia.org/wiki/Graphical_user_interface), `pip install not-my-ex[gui]`.
## Usage
### CLI
```console
$ not-my-ex post "Magic, madness, heaven, sin" --images /tmp/1989.gif
```You can skip `--images` or pass multiple images (e.g. `--images taylor.jpg --images swift.gif`).
### GUI
If you have installed the GUI extra:
```console
$ not-my-ex gui
```This is how it looks like:
![Screenshot of `not-my-ex` GUI](gui.png)
### API
```python
from asyncio import gatherfrom httpx import AsyncClient
from not_my_ex.bluesky import Bluesky
from not_my_ex.mastodon import Mastodon
from not_my_ex.media import Media
from not_my_ex.post import Postasync def main():
media_tasks = tuple(
Media.from_img(path, alt=alt)
for path, alt in (("taylor.jpg", "Taylor"), ("swift.jpg", "Swift"))
)
media = await gather(*media_tasks)post = Post(text="Magic, madness, heaven, sin", media=media, lang="en")
async with AsyncClient() as http:
post_tasks = tuple(cls(http).post(post) for cls in (Bluesky, Mastodon))
await gather(*post_tasks)
```In `Post`, both `media` and `lang` are optional. In `Media`, `alt` is optional.
## Contributing
Requires [`uv`](https://docs.astral.sh/uv) Python package manager. The tests include [Ruff](https://docs.astral.sh/ruff/) and [Mypy](https://www.mypy-lang.org/):
```console
$ uv run python -m pytest
```