Skip to main content

A Python3, async interface to the linkding REST API

Project description

🔖 aiolinkding: a Python3, async library to the linkding REST API

CI PyPI Version License Code Coverage Maintainability

Buy Me A Coffee

aiolinkding is a Python3, async library that interfaces with linkding instances. It is intended to be a reasonably light wrapper around the linkding API (meaning that instead of drowning the user in custom objects/etc., it focuses on returning JSON straight from the API).

Installation

pip install aiolinkding

Python Versions

aiolinkding is currently supported on:

  • Python 3.10
  • Python 3.11
  • Python 3.12

Usage

Creating a Client

It's easy to create an API client for a linkding instance. All you need are two parameters:

  1. A URL to a linkding instance
  2. A linkding API token
import asyncio

from aiolinkding import async_get_client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = await async_get_client("http://127.0.0.1:8000", "token_abcde12345")


asyncio.run(main())

Working with Bookmarks

Getting All Bookmarks

import asyncio

from aiolinkding import async_get_client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = await async_get_client("http://127.0.0.1:8000", "token_abcde12345")

    # Get all bookmarks:
    bookmarks = await client.bookmarks.async_get_all()
    # >>> { "count": 100, "next": null, "previous": null, "results": [...] }


asyncio.run(main())

client.bookmarks.async_get_all() takes three optional parameters:

  • query: a string query to filter the returned bookmarks
  • limit: the maximum number of results that should be returned
  • offset: the index from which to return results (e.g., 5 starts at the fifth bookmark)

Getting Archived Bookmarks

import asyncio

from aiolinkding import async_get_client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = await async_get_client("http://127.0.0.1:8000", "token_abcde12345")

    # Get all archived bookmarks:
    bookmarks = await client.bookmarks.async_get_archived()
    # >>> { "count": 100, "next": null, "previous": null, "results": [...] }


asyncio.run(main())

client.bookmarks.async_get_archived() takes three optional parameters:

  • query: a string query to filter the returned bookmarks
  • limit: the maximum number of results that should be returned
  • offset: the index from which to return results (e.g., 5 starts at the fifth bookmark)

Getting a Single Bookmark by ID

import asyncio

from aiolinkding import async_get_client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = await async_get_client("http://127.0.0.1:8000", "token_abcde12345")

    # Get a single bookmark:
    bookmark = await client.bookmarks.async_get_single(37)
    # >>> { "id": 37, "url": "https://example.com", "title": "Example title", ... }


asyncio.run(main())

Creating a New Bookmark

import asyncio

from aiolinkding import async_get_client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = await async_get_client("http://127.0.0.1:8000", "token_abcde12345")

    # Create a new bookmark:
    created_bookmark = await client.bookmarks.async_create(
        "https://example.com",
        title="Example title",
        description="Example description",
        tag_names=[
            "tag1",
            "tag2",
        ],
    )
    # >>> { "id": 37, "url": "https://example.com", "title": "Example title", ... }


asyncio.run(main())

client.bookmarks.async_create() takes four optional parameters:

  • title: the bookmark's title
  • description: the bookmark's description
  • notes: Markdown notes to add to the bookmark
  • tag_names: the tags to assign to the bookmark (represented as a list of strings)
  • is_archived: whether the newly-created bookmark should automatically be archived
  • unread: whether the newly-created bookmark should be marked as unread
  • shared: whether the newly-created bookmark should be shareable with other linkding users

Updating an Existing Bookmark by ID

import asyncio

from aiolinkding import async_get_client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = await async_get_client("http://127.0.0.1:8000", "token_abcde12345")

    # Update an existing bookmark:
    updated_bookmark = await client.bookmarks.async_update(
        37,
        url="https://different-example.com",
        title="Different example title",
        description="Different example description",
        tag_names=[
            "tag1",
            "tag2",
        ],
    )
    # >>> { "id": 37, "url": "https://different-example.com", ... }


asyncio.run(main())

client.bookmarks.async_update() takes four optional parameters (inclusion of any parameter will change that value for the existing bookmark):

  • url: the bookmark's URL
  • title: the bookmark's title
  • description: the bookmark's description
  • notes: Markdown notes to add to the bookmark
  • tag_names: the tags to assign to the bookmark (represented as a list of strings)
  • unread: whether the bookmark should be marked as unread
  • shared: whether the bookmark should be shareable with other linkding users

Archiving/Unarchiving a Bookmark

import asyncio

from aiolinkding import async_get_client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = await async_get_client("http://127.0.0.1:8000", "token_abcde12345")

    # Archive a bookmark by ID:
    await client.bookmarks.async_archive(37)

    # ...and unarchive it:
    await client.bookmarks.async_unarchive(37)


asyncio.run(main())

Deleting a Bookmark

import asyncio

from aiolinkding import async_get_client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = await async_get_client("http://127.0.0.1:8000", "token_abcde12345")

    # Delete a bookmark by ID:
    await client.bookmarks.async_delete(37)


asyncio.run(main())

Working with Tags

Getting All Tags

import asyncio

from aiolinkding import async_get_client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = await async_get_client("http://127.0.0.1:8000", "token_abcde12345")

    # Get all tags:
    tags = await client.tags.async_get_all()
    # >>> { "count": 100, "next": null, "previous": null, "results": [...] }


asyncio.run(main())

client.tags.async_get_all() takes two optional parameters:

  • limit: the maximum number of results that should be returned
  • offset: the index from which to return results (e.g., 5 starts at the fifth bookmark)

Getting a Single Tag by ID

import asyncio

from aiolinkding import async_get_client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = await async_get_client("http://127.0.0.1:8000", "token_abcde12345")

    # Get a single tag:
    tag = await client.tags.async_get_single(22)
    # >>> { "id": 22, "name": "example-tag", ... }


asyncio.run(main())

Creating a New Tag

import asyncio

from aiolinkding import async_get_client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = await async_get_client("http://127.0.0.1:8000", "token_abcde12345")

    # Create a new tag:
    created_tag = await client.tags.async_create("example-tag")
    # >>> { "id": 22, "name": "example-tag", ... }


asyncio.run(main())

Working with User Data

Getting Profile Info

import asyncio

from aiolinkding import async_get_client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = await async_get_client("http://127.0.0.1:8000", "token_abcde12345")

    # Get all tags:
    tags = await client.user.async_get_profile()
    # >>> { "theme": "auto", "bookmark_date_display": "relative", ... }


asyncio.run(main())

Connection Pooling

By default, the library creates a new connection to linkding with each coroutine. If you are calling a large number of coroutines (or merely want to squeeze out every second of runtime savings possible), an aiohttp ClientSession can be used for connection pooling:

import asyncio

from aiohttp import async_get_clientSession
from aiolinkding import async_get_client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    async with ClientSession() as session:
        client = await async_get_client(
            "http://127.0.0.1:8000", "token_abcde12345", session=session
        )

        # Get to work...


asyncio.run(main())

Contributing

Thanks to all of our contributors so far!

  1. Check for open features/bugs or initiate a discussion on one.
  2. Fork the repository.
  3. (optional, but highly recommended) Create a virtual environment: python3 -m venv .venv
  4. (optional, but highly recommended) Enter the virtual environment: source ./.venv/bin/activate
  5. Install the dev environment: script/setup
  6. Code your new feature or bug fix on a new branch.
  7. Write tests that cover your new functionality.
  8. Run tests and ensure 100% code coverage: poetry run pytest --cov aiolinkding tests
  9. Update README.md with any new documentation.
  10. Submit a pull request!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aiolinkding-2023.12.0.tar.gz (11.3 kB view details)

Uploaded Source

Built Distribution

aiolinkding-2023.12.0-py3-none-any.whl (10.5 kB view details)

Uploaded Python 3

File details

Details for the file aiolinkding-2023.12.0.tar.gz.

File metadata

  • Download URL: aiolinkding-2023.12.0.tar.gz
  • Upload date:
  • Size: 11.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.7.1 CPython/3.12.1 Linux/6.2.0-1018-azure

File hashes

Hashes for aiolinkding-2023.12.0.tar.gz
Algorithm Hash digest
SHA256 b4af5d1b12cec2ee8d5f75be4c106bc39cc9e38cedc706e3a8b7f39e696c3671
MD5 ef5425be9f9f27b3b8f8a8db4c7f4ef0
BLAKE2b-256 d8e69f5341739ba06f8a8e5051761a011a367a4884a908db9d811b0cc7c92f65

See more details on using hashes here.

File details

Details for the file aiolinkding-2023.12.0-py3-none-any.whl.

File metadata

  • Download URL: aiolinkding-2023.12.0-py3-none-any.whl
  • Upload date:
  • Size: 10.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.7.1 CPython/3.12.1 Linux/6.2.0-1018-azure

File hashes

Hashes for aiolinkding-2023.12.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e950a8aa263d12678204a83f8394104cf51abf411ba619af27096701e8ebb4af
MD5 64e9737e5339b9733ce8bfc1cf8f2cfa
BLAKE2b-256 f403de0809c4194a817aaebf8eeb0e986eb1e4d22f65b81b297381e5422be064

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page