# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2022, The Funkwhale Collective
# This file is distributed under the same license as the funkwhale package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: funkwhale 1.2.7\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-07-23 12:18+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\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 <https://dev.funkwhale.audio/funkwhale/funkwhale/blob/develop/api/funkwhale_api/federation/models.py>`_"
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 <https://dev.funkwhale.audio/funkwhale/funkwhale/blob/develop/api/funkwhale_api/federation/routes.py>`_"
msgstr ""

#: ../../federation/index.rst:101
msgid "`Delivery logic for activities <https://dev.funkwhale.audio/funkwhale/funkwhale/blob/develop/api/funkwhale_api/federation/tasks.py>`_"
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 <https://www.w3.org/TR/activitystreams-vocabulary/#dfn-audio>`_, 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 ""
