# SOME DESCRIPTIVE TITLE. # Copyright (C) 2022, The Funkwhale Collective # This file is distributed under the same license as the funkwhale package. # FIRST AUTHOR , 2022. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: funkwhale 1.2.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-07-01 10:35+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.10.1\n" #: ../../federation/index.rst:2 msgid "Funkwhale Federation" msgstr "" #: ../../federation/index.rst:4 msgid "" "This documentation section is more technical, and targets people who want" " to understand how Funkwhale's federation works." msgstr "" #: ../../federation/index.rst:9 msgid "Technologies and standards" msgstr "" #: ../../federation/index.rst:11 msgid "Funkwhale's federation is built on top of the following technologies:" msgstr "" #: ../../federation/index.rst:13 msgid "`ActivityPub`_ as the high-level federation protocol" msgstr "" #: ../../federation/index.rst:14 msgid "`HTTP Signatures`_ as the primary mean to authenticate messages" msgstr "" #: ../../federation/index.rst:15 msgid "`Webfinger`_ to easily retrieve resources using human-friendly names" msgstr "" #: ../../federation/index.rst:16 msgid "" "`ActivityStreams`_ and `ActivityStreams vocabulary`_ as the mean to " "structure messages" msgstr "" #: ../../federation/index.rst:18 msgid "Support for the following is planned but not implemented-yet:" msgstr "" #: ../../federation/index.rst:20 msgid "`JSON-LD signatures`_ as an alternate mean to authenticate messages" msgstr "" #: ../../federation/index.rst:30 msgid "Philosophy" msgstr "" #: ../../federation/index.rst:32 msgid "" "Our goal is to stick to the specifications as much as possible, to ensure" " compatibility with existing applications such as Mastodon, Peertube, " "Plume, Pleroma or PixelFed." msgstr "" #: ../../federation/index.rst:35 msgid "" "However, this is not always possible for all our use cases. The " "ActivityPub and ActivityStreams specifications are really high-level and " "do not always fit our use cases. For such cases, we will use an ad-hoc " "solution, and document it here." msgstr "" #: ../../federation/index.rst:39 msgid "" "There are plenty of projects built using ActivityPub, and our goal is not" " to support all the existing activities. Instead, we want to support " "activities and objects that make sense for Funkwhale use cases, such as " "follows or likes." msgstr "" #: ../../federation/index.rst:43 msgid "" "If you think this document is not accurate or find evidence that " "Funkwhale is not behaving according to the behaviour documented here, " "please file a bug on our issue tracker, as we consider this a bug." msgstr "" #: ../../federation/index.rst:48 ../../federation/index.rst:157 #: ../../federation/index.rst:211 ../../federation/index.rst:266 #: ../../federation/index.rst:310 ../../federation/index.rst:361 #: ../../federation/index.rst:445 msgid "Internal logic" msgstr "" #: ../../federation/index.rst:50 msgid "" "This section is relevant if you're interested in how we handle things " "internally in our application code." msgstr "" #: ../../federation/index.rst:54 msgid "Database schema" msgstr "" #: ../../federation/index.rst:56 msgid "" "As much as possible, we try to map our internal model and database schema" " to ActivityPub entities, as this makes things easier to deal with." msgstr "" #: ../../federation/index.rst:59 msgid "" "We store received activities payload directly in the database before we " "attempt to process or deliver them. Storing the activities unlock some " "interesting use cases, such as debugging federation issues, replaying " "deliveries, or reprocess historical activities that were not supported " "before." msgstr "" #: ../../federation/index.rst:64 msgid "" "Each local user is bound to an ``Actor``. Remote and local actors share " "the same database table and all federated entities (such as uploads) are " "linked to an ``Actor`` and not to a user. This means that, internally, in" " general, there is no distinction between local and remote users." msgstr "" #: ../../federation/index.rst:69 ../../federation/index.rst:98 msgid "Links:" msgstr "" #: ../../federation/index.rst:71 msgid "" "`Federation models " "`_" msgstr "" #: ../../federation/index.rst:75 msgid "Activity creation and delivery" msgstr "" #: ../../federation/index.rst:77 msgid "" "When a local actor is making an action that should trigger an " "``Activity``, which roughly is equivalent to posting an activity to an " "outbox, we create an object, with the proper payload and store it in our " "``Activity`` table. We then trigger two kind of deliveries:" msgstr "" #: ../../federation/index.rst:81 msgid "" "A delivery to local recipients: for each local recipient, we create an " "``InboxItem``, linked to the activity. A local actor's feed is then made " "of all the available inbox items, which can also have a read/unread " "status" msgstr "" #: ../../federation/index.rst:84 msgid "" "A delivery to remote recipients: we collect all inboxes and shared inbox " "urls from remote recipients, and create a ``Delivery`` object in our " "database, linked to the initial activity and the inbox or shared inbox " "url. This ``Delivery`` object is then used by our worker to post the " "activity content to the url." msgstr "" #: ../../federation/index.rst:88 msgid "" "Receiving an activity from a remote actor in a local inbox is basically " "the same, but we skip step 2." msgstr "" #: ../../federation/index.rst:90 msgid "" "Funkwhale does not support all activities, and we have a basic routing " "logic to handle specific activities, and discard unsupported ones." msgstr "" #: ../../federation/index.rst:93 msgid "" "If a delivered activity matches one of our routes, a dedicated handler is" " called, which can trigger additional logic. For instance, if we receive " "a :ref:`activity-create` activity for an :ref:`object-audio` object, our " "handler will persist the proper data in our local ``Upload`` table, " "retrieve the audio cover, etc." msgstr "" #: ../../federation/index.rst:100 msgid "" "`Routing logic for activities " "`_" msgstr "" #: ../../federation/index.rst:101 msgid "" "`Delivery logic for activities " "`_" msgstr "" #: ../../federation/index.rst:107 msgid "Service actor" msgstr "" #: ../../federation/index.rst:109 msgid "" "In some situations, we will send messages or authenticate our fetches " "using what we call the service actor. A service actor is an ActivityPub " "actor object that acts on behalf of a Funkwhale server." msgstr "" #: ../../federation/index.rst:113 msgid "" "The actor id usually looks like " "``https://yourdomain.com/federation/actors/service``, but the reliable " "way to determine it is to query the nodeinfo endpoint and use the value " "available in the ``metadata > actorId`` field." msgstr "" #: ../../federation/index.rst:117 msgid "" "Funkwhale generally considers that the service actor has authority to " "send activities associated with any object on the same domain. For " "instance, the service actor could send a :ref:`activity-delete` activity " "linked to another users' library on the same domain." msgstr "" #: ../../federation/index.rst:123 msgid "Supported activities" msgstr "" #: ../../federation/index.rst:128 msgid "Follow" msgstr "" #: ../../federation/index.rst:131 ../../federation/index.rst:181 #: ../../federation/index.rst:236 ../../federation/index.rst:282 #: ../../federation/index.rst:332 ../../federation/index.rst:384 msgid "Supported on" msgstr "" #: ../../federation/index.rst:133 ../../federation/index.rst:387 msgid ":ref:`object-Library` objects" msgstr "" #: ../../federation/index.rst:136 msgid "Example of library follow" msgstr "" #: ../../federation/index.rst:153 msgid "" "In this example, Alice is following the :ref:`object-library` described " "in ``object``, which is owned by Bob." msgstr "" #: ../../federation/index.rst:159 msgid "" "When a follow is received on a :ref:`object-Library`, Funkwhale will " "behave differently depending on the visibility of the library:" msgstr "" #: ../../federation/index.rst:162 msgid "" "Automatic accept, when the library is public: a notification is sent to " "the library owner, and an :ref:`activity-accept` is sent automatically to" " the follow actor." msgstr "" #: ../../federation/index.rst:163 msgid "" "Manual accept, in all other cases: a notification is sent to the library " "owner. After manual approval from the owner, an :ref:`activity-accept` is" " sent to the follow actor." msgstr "" #: ../../federation/index.rst:165 msgid "" "Funkwhale uses library follow status to grant access to the follow actor." " If a library is not public and an actor does not have an approved " "follow, library content will be inaccessible to the actor." msgstr "" #: ../../federation/index.rst:170 ../../federation/index.rst:225 #: ../../federation/index.rst:271 ../../federation/index.rst:318 #: ../../federation/index.rst:368 ../../federation/index.rst:451 msgid "Checks" msgstr "" #: ../../federation/index.rst:172 msgid "" "Before handling the activity, Funkwhale will ensure the library's owner " "is the activity recipient." msgstr "" #: ../../federation/index.rst:178 msgid "Accept" msgstr "" #: ../../federation/index.rst:183 ../../federation/index.rst:238 msgid ":ref:`activity-follow` objects" msgstr "" #: ../../federation/index.rst:186 ../../federation/index.rst:241 #: ../../federation/index.rst:287 ../../federation/index.rst:338 #: ../../federation/index.rst:469 ../../federation/index.rst:499 #: ../../federation/index.rst:541 ../../federation/index.rst:581 #: ../../federation/index.rst:626 msgid "Example" msgstr "" #: ../../federation/index.rst:208 msgid "In this example, Bob accepts Alice's follow." msgstr "" #: ../../federation/index.rst:213 msgid "" "When an :ref:`activity-accept` is received with a :ref:`activity-follow` " "object, the corresponding follow is marked as accepted in the database." msgstr "" #: ../../federation/index.rst:216 msgid "" "For library follows, this means that the actor will receive future " "activities occurring within this library, such as :ref:`activity-create` " ":ref:`object-audio`, :ref:`activity-delete` :ref:`object-audio` or :ref" ":`activity-delete` :ref:`object-library`" msgstr "" #: ../../federation/index.rst:220 msgid "" "The follow actor will also be able to browse the library pages and " "download the library's audio files. Have a look at :ref:`library-access` " "for more details." msgstr "" #: ../../federation/index.rst:227 msgid "" "Before handling the activity, Funkwhale will ensure the accept comes from" " the library's owner." msgstr "" #: ../../federation/index.rst:233 msgid "Undo" msgstr "" #: ../../federation/index.rst:263 msgid "In this example, Alice is notifying Bob she's undoing her follow." msgstr "" #: ../../federation/index.rst:268 msgid "" "When an undo is received, the corresponding follow is deleted from the " "database." msgstr "" #: ../../federation/index.rst:273 msgid "" "Before handling the activity, Funkwhale will ensure the undo actor is the" " follow actor." msgstr "" #: ../../federation/index.rst:279 msgid "Create" msgstr "" #: ../../federation/index.rst:284 ../../federation/index.rst:386 msgid ":ref:`object-audio` objects" msgstr "" #: ../../federation/index.rst:307 msgid "" "Refer to :ref:`object-audio` to see the structure of the ``object`` " "attribute." msgstr "" #: ../../federation/index.rst:312 msgid "" "When a :ref:`activity-create` is received with an :ref:`object-audio` " "object, Funkwhale will persist a local upload and bind it to the proper " "library and track. If no local track match the audio metadata, a track is" " created using the ``metadata`` attribute from the :ref:`object-audio` " "object." msgstr "" #: ../../federation/index.rst:320 msgid "" "Before handling the activity, Funkwhale will ensure the activity actor " "and the audio library's actor are the same." msgstr "" #: ../../federation/index.rst:323 msgid "" "If no local actor follows the audio's library, the activity will be " "discarded." msgstr "" #: ../../federation/index.rst:329 msgid "Update" msgstr "" #: ../../federation/index.rst:334 msgid ":ref:`object-library` objects" msgstr "" #: ../../federation/index.rst:335 msgid ":ref:`object-track` objects" msgstr "" #: ../../federation/index.rst:358 msgid "" "Refer to :ref:`object-library` or :ref:`object-track` to see the " "structure of the ``object`` attribute." msgstr "" #: ../../federation/index.rst:363 msgid "" "When a :ref:`activity-update` is received with a :ref:`object-library` or" " :ref:`object-track` object, Funkwhale will try to update the local copy " "of the corresponding object in it's database." msgstr "" #: ../../federation/index.rst:370 msgid "Checks vary depending of the type of object associated with the update." msgstr "" #: ../../federation/index.rst:372 msgid "" "For :ref:`object-library` objects, we ensure the actor sending the " "message is the owner of the library." msgstr "" #: ../../federation/index.rst:374 msgid "" "For musical entities such as :ref:`object-track`, we ensure the actor " "sending the message matches the :ref:`property-attributedTo` property " "declared on the local copy on the object, or the :ref:`service-actor`." msgstr "" #: ../../federation/index.rst:381 msgid "Delete" msgstr "" #: ../../federation/index.rst:390 msgid "Example (on :ref:`object-Library`)" msgstr "" #: ../../federation/index.rst:412 msgid "Example (on :ref:`object-audio`)" msgstr "" #: ../../federation/index.rst:437 msgid "" "In this example, Bob notifies the followers of their library that 3 " "objects were deleted." msgstr "" #: ../../federation/index.rst:441 msgid "" "For performance reason, when deleting :ref:`object-audio` objects, " "Funkwhale supports either a list of ids or a single id." msgstr "" #: ../../federation/index.rst:447 msgid "" "When a :ref:`activity-delete` is received, the corresponding objects are " "immediately deleted from the database." msgstr "" #: ../../federation/index.rst:453 msgid "" "Before handling deletion, Funkwhale ensures the actor initiating the " "activity is the owner of the deleted :ref:`object-audio` or :ref:`object-" "Library`." msgstr "" #: ../../federation/index.rst:457 msgid "Supported objects" msgstr "" #: ../../federation/index.rst:462 msgid "Artist" msgstr "" #: ../../federation/index.rst:466 ../../federation/index.rst:496 #: ../../federation/index.rst:538 msgid "This object is not standard." msgstr "" #: ../../federation/index.rst:482 ../../federation/index.rst:521 #: ../../federation/index.rst:559 ../../federation/index.rst:599 #: ../../federation/index.rst:649 msgid "Structure" msgstr "" #: ../../federation/index.rst:484 msgid "**id** (required): a uri identifying the artist over federation" msgstr "" #: ../../federation/index.rst:485 msgid "**name** (required): a name for the artist" msgstr "" #: ../../federation/index.rst:486 msgid "" "**published** (required): the publication date of the artist (on the " "federation)" msgstr "" #: ../../federation/index.rst:487 msgid "**musicbrainzId** (optional): the musicbrainz artist id" msgstr "" #: ../../federation/index.rst:492 msgid "Album" msgstr "" #: ../../federation/index.rst:523 msgid "**id** (required): a uri identifying the album over federation" msgstr "" #: ../../federation/index.rst:524 msgid "**name** (required): the title of the album" msgstr "" #: ../../federation/index.rst:525 msgid "" "**artists** (required): a list of :ref:`object-artist` objects involved " "in the album" msgstr "" #: ../../federation/index.rst:526 ../../federation/index.rst:564 #: ../../federation/index.rst:657 msgid "" "**published** (required): the publication date of the entity (on the " "federation)" msgstr "" #: ../../federation/index.rst:527 msgid "**released** (optional): the release date of the album" msgstr "" #: ../../federation/index.rst:528 msgid "**musicbrainzId** (optional): the musicbrainz release id" msgstr "" #: ../../federation/index.rst:529 msgid "**cover** (optional): a `Link` object representing the album cover" msgstr "" #: ../../federation/index.rst:534 msgid "Track" msgstr "" #: ../../federation/index.rst:561 msgid "**id** (required): a uri identifying the track over federation" msgstr "" #: ../../federation/index.rst:562 msgid "**name** (required): the title of the track" msgstr "" #: ../../federation/index.rst:563 msgid "" "**position** (required): the position of the :ref:`object-track` in the " "album" msgstr "" #: ../../federation/index.rst:565 msgid "**musicbrainzId** (optional): the musicbrainz recording id" msgstr "" #: ../../federation/index.rst:566 msgid "**album** (required): the :ref:`object-album` that contains the track" msgstr "" #: ../../federation/index.rst:567 msgid "" "**artists** (required): a list of :ref:`object-artist` objects involved " "in the track (they can differ from the album artists)" msgstr "" #: ../../federation/index.rst:572 msgid "Library" msgstr "" #: ../../federation/index.rst:576 msgid "" "This object is not standard but inherits its behaviour and properties " "from Actor and Collection." msgstr "" #: ../../federation/index.rst:601 msgid "**id** (required): a uri identifying the library over federation" msgstr "" #: ../../federation/index.rst:602 msgid "**actor** (required): the id of the actor managing the library" msgstr "" #: ../../federation/index.rst:603 msgid "**name** (required): the name of the library" msgstr "" #: ../../federation/index.rst:604 msgid "**followers** (required): the id of the library's followers collection" msgstr "" #: ../../federation/index.rst:605 msgid "" "**totalItems** (required): the number of audio objects available in the " "library" msgstr "" #: ../../federation/index.rst:606 msgid "**first** (required): the URL of the first page of the library" msgstr "" #: ../../federation/index.rst:607 msgid "**last** (required): the URL of the last page of the library" msgstr "" #: ../../federation/index.rst:608 msgid "**summary** (optional): a description for the library" msgstr "" #: ../../federation/index.rst:612 msgid "" "Crawling library pages requires authentication and an approved follow, " "unless the library is public." msgstr "" #: ../../federation/index.rst:618 msgid "Audio" msgstr "" #: ../../federation/index.rst:622 msgid "" "This object `is specified in ActivityStreams `_, but Funkwhale needs non-" "standard attributes to handle it." msgstr "" #: ../../federation/index.rst:651 msgid "**id** (required): a uri identifying the audio over federation" msgstr "" #: ../../federation/index.rst:652 msgid "" "**name** (required): a human-friendly title for the audio (We concatenate" " track name, album title and artist name)" msgstr "" #: ../../federation/index.rst:653 msgid "**size** (required, non-standard): the size of the audio, in bytes" msgstr "" #: ../../federation/index.rst:654 msgid "**bitrate** (required, non-standard): the bitrate of the audio, in bytes/s" msgstr "" #: ../../federation/index.rst:655 msgid "**duration** (required): the duration of the audio, in seconds" msgstr "" #: ../../federation/index.rst:656 msgid "" "**library** (required, non-standard): the id of the :ref:`object-Library`" " object that contains the object" msgstr "" #: ../../federation/index.rst:658 msgid "" "**updated** (required): the last update date of the entity (on the " "federation)" msgstr "" #: ../../federation/index.rst:659 msgid "" "**url** (required): a ``Link`` object with an ``audio/`` mediaType where " "the audio file is downloadable" msgstr "" #: ../../federation/index.rst:660 msgid "" "**track** (required, non-standard): the :ref:`object-track` the :ref" ":`object-audio` is bound to" msgstr "" #: ../../federation/index.rst:664 msgid "" "Accessing the Audio file via its url requires authentication and an " "approved follow on the containing library, unless the library is public." msgstr "" #: ../../federation/index.rst:671 msgid "Audio fetching on restricted libraries" msgstr "" #: ../../federation/index.rst:673 msgid "" ":ref:`object-library` and :ref:`object-audio` url objects may require " "additional authentication to be accessed." msgstr "" #: ../../federation/index.rst:676 msgid "For :ref:`object-library` objects:" msgstr "" #: ../../federation/index.rst:678 msgid "" "If the library is public, library pages can be accessed without " "restriction" msgstr "" #: ../../federation/index.rst:679 msgid "" "Otherwise, the HTTP request must be signed by an actor with an approved " "follow on the library" msgstr "" #: ../../federation/index.rst:682 msgid "For :ref:`object-audio` url objects:" msgstr "" #: ../../federation/index.rst:684 msgid "" "If the audio's library is public, audio file can be accessed without " "restriction" msgstr "" #: ../../federation/index.rst:685 msgid "" "Otherwise, the HTTP request must be signed by an actor with an approved " "follow on the audio's library" msgstr "" #: ../../federation/index.rst:689 msgid "Properties" msgstr "" #: ../../federation/index.rst:694 msgid "attributedTo" msgstr "" #: ../../federation/index.rst:696 msgid "" "Funkwhale will generally use the ``attributedTo`` property to communicate" " who is responsible for a given object. When an object has the " "``attributedTo`` attribute, the associated actor has the permission to " ":ref:`activity-update`, :ref:`activity-delete` or more generally apply " "any kind of activity on the object." msgstr "" #: ../../federation/index.rst:701 msgid "" "In addition, Funkwhale consider all the objects of a domain as attributed" " to its corresponding :ref:`service-actor`." msgstr ""