Compare commits

..

9 commits

11 changed files with 575 additions and 64 deletions

10
bluesky/README.md Normal file
View file

@ -0,0 +1,10 @@
Bluesky Addon
==============
This addon currently supports posting to Bluesky.
The import is under development and will hopefully come soon.
No setup is needed for the admins to make it work for their users.
Bluesky itself is under development as well. It is planned to make it decentral.
The addon is prepared to support different servers. But it isn't enabled yet.

387
bluesky/bluesky.php Normal file
View file

@ -0,0 +1,387 @@
<?php
/**
* Name: Bluesky Connector
* Description: Post to Bluesky
* Version: 1.0
* Author: Michael Vogel <https://pirati.ca/profile/heluecht>
*/
use Friendica\Content\Text\BBCode;
use Friendica\Content\Text\Plaintext;
use Friendica\Core\Config\Util\ConfigFileManager;
use Friendica\Core\Hook;
use Friendica\Core\Logger;
use Friendica\Core\Renderer;
use Friendica\DI;
use Friendica\Model\Item;
use Friendica\Model\Photo;
use Friendica\Network\HTTPClient\Client\HttpClientAccept;
use Friendica\Network\HTTPClient\Client\HttpClientOptions;
use Friendica\Util\DateTimeFormat;
function bluesky_install()
{
Hook::register('load_config', __FILE__, 'bluesky_load_config');
Hook::register('hook_fork', __FILE__, 'bluesky_hook_fork');
Hook::register('post_local', __FILE__, 'bluesky_post_local');
Hook::register('notifier_normal', __FILE__, 'bluesky_send');
Hook::register('jot_networks', __FILE__, 'bluesky_jot_nets');
Hook::register('connector_settings', __FILE__, 'bluesky_settings');
Hook::register('connector_settings_post', __FILE__, 'bluesky_settings_post');
}
function bluesky_load_config(ConfigFileManager $loader)
{
DI::app()->getConfigCache()->load($loader->loadAddonConfig('bluesky'), \Friendica\Core\Config\ValueObject\Cache::SOURCE_STATIC);
}
function bluesky_settings(array &$data)
{
if (!DI::userSession()->getLocalUserId()) {
return;
}
$enabled = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'bluesky', 'post') ?? false;
$def_enabled = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'bluesky', 'post_by_default') ?? false;
$host = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'bluesky', 'host') ?: 'https://bsky.social';
$handle = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'bluesky', 'handle');
$did = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'bluesky', 'did');
$token = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'bluesky', 'access_token');
$status = $token ? DI::l10n()->t("You are authenticated to Bluesky. For security reasons the password isn't stored.") : DI::l10n()->t('You are not authenticated. Please enter the app password.');
$t = Renderer::getMarkupTemplate('connector_settings.tpl', 'addon/bluesky/');
$html = Renderer::replaceMacros($t, [
'$enable' => ['bluesky', DI::l10n()->t('Enable Bluesky Post Addon'), $enabled],
'$bydefault' => ['bluesky_bydefault', DI::l10n()->t('Post to Bluesky by default'), $def_enabled],
'$host' => ['bluesky_host', DI::l10n()->t('Bluesky host'), $host, '', '', 'readonly'],
'$handle' => ['bluesky_handle', DI::l10n()->t('Bluesky handle'), $handle],
'$did' => ['bluesky_did', DI::l10n()->t('Bluesky DID'), $did, DI::l10n()->t('This is the unique identifier. It will be fetched automatically, when the handle is entered.'), '', 'readonly'],
'$password' => ['bluesky_password', DI::l10n()->t('Bluesky app password'), '', DI::l10n()->t("Please don't add your real password here, but instead create a specific app password in the Bluesky settings.")],
'$status' => $status
]);
$data = [
'connector' => 'bluesky',
'title' => DI::l10n()->t('Bluesky Export'),
'image' => 'images/bluesky.jpg',
'enabled' => $enabled,
'html' => $html,
];
}
function bluesky_settings_post(array &$b)
{
if (empty($_POST['bluesky-submit'])) {
return;
}
$old_host = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'bluesky', 'host');
$old_handle = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'bluesky', 'handle');
$old_did = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'bluesky', 'did');
$host = $_POST['bluesky_host'];
$handle = $_POST['bluesky_handle'];
DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'bluesky', 'post', intval($_POST['bluesky']));
DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'bluesky', 'post_by_default', intval($_POST['bluesky_bydefault']));
DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'bluesky', 'host', $host);
DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'bluesky', 'handle', $handle);
if (!empty($host) && !empty($handle)) {
if (empty($old_did) || $old_host != $host || $old_handle != $handle) {
DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'bluesky', 'did', bluesky_get_did(DI::userSession()->getLocalUserId()));
}
} else {
DI::pConfig()->delete(DI::userSession()->getLocalUserId(), 'bluesky', 'did');
}
if (!empty($_POST['bluesky_password'])) {
bluesky_create_token(DI::userSession()->getLocalUserId(), $_POST['bluesky_password']);
}
}
function bluesky_jot_nets(array &$jotnets_fields)
{
if (!DI::userSession()->getLocalUserId()) {
return;
}
if (DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'bluesky', 'post')) {
$jotnets_fields[] = [
'type' => 'checkbox',
'field' => [
'bluesky_enable',
DI::l10n()->t('Post to Bluesky'),
DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'bluesky', 'post_by_default')
]
];
}
}
function bluesky_hook_fork(array &$b)
{
if ($b['name'] != 'notifier_normal') {
return;
}
$post = $b['data'];
if (($post['created'] !== $post['edited']) && !$post['deleted']) {
DI::logger()->info('Editing is not supported by the addon');
$b['execute'] = false;
return;
}
if (!strstr($post['postopts'] ?? '', 'bluesky') || ($post['parent'] != $post['id']) || $post['private']) {
$b['execute'] = false;
return;
}
}
function bluesky_post_local(array &$b)
{
if ($b['edit']) {
return;
}
if (!DI::userSession()->getLocalUserId() || (DI::userSession()->getLocalUserId() != $b['uid'])) {
return;
}
if ($b['private'] || $b['parent']) {
return;
}
$bluesky_post = intval(DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'bluesky', 'post'));
$bluesky_enable = (($bluesky_post && !empty($_REQUEST['bluesky_enable'])) ? intval($_REQUEST['bluesky_enable']) : 0);
// if API is used, default to the chosen settings
if ($b['api_source'] && intval(DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'bluesky', 'post_by_default'))) {
$bluesky_enable = 1;
}
if (!$bluesky_enable) {
return;
}
if (strlen($b['postopts'])) {
$b['postopts'] .= ',';
}
$b['postopts'] .= 'bluesky';
}
function bluesky_send(array &$b)
{
if (($b['created'] !== $b['edited']) && !$b['deleted']) {
return;
}
if ($b['gravity'] != Item::GRAVITY_PARENT) {
return;
} elseif ($b['private'] || !strstr($b['postopts'], 'bluesky')) {
return;
}
bluesky_create_post($b);
}
function bluesky_create_post(array $item)
{
$uid = $item['uid'];
$token = bluesky_get_token($uid);
if (empty($token)) {
return;
}
$did = DI::pConfig()->get($uid, 'bluesky', 'did');
$msg = Plaintext::getPost($item, 300, false, BBCode::CONNECTORS);
$parent = $root = [];
foreach ($msg['parts'] as $key => $part) {
$record = [
'text' => $part,
'createdAt' => DateTimeFormat::utcNow(DateTimeFormat::ATOM),
'$type' => 'app.bsky.feed.post'
];
if (!empty($root)) {
$record['reply'] = ['root' => $root, 'parent' => $parent];
}
if ($key == count($msg['parts']) - 1) {
$record = bluesky_add_embed($uid, $msg, $record);
}
$post = [
'collection' => 'app.bsky.feed.post',
'repo' => $did,
'record' => $record
];
$parent = bluesky_post($uid, '/xrpc/com.atproto.repo.createRecord', json_encode($post), ['Content-type' => 'application/json', 'Authorization' => ['Bearer ' . $token]]);
if (empty($parent)) {
return;
}
Logger::debug('Posting done', ['return' => $parent]);
if (empty($root)) {
$root = $parent;
}
}
}
function bluesky_add_embed(int $uid, array $msg, array $record): array
{
if (($msg['type'] != 'link') && !empty($msg['images'])) {
$images = [];
foreach ($msg['images'] as $image) {
$photo = Photo::selectFirst(['resource-id'], ['id' => $image['id']]);
$photo = Photo::selectFirst([], ["`resource-id` = ? AND `scale` > ?", $photo['resource-id'], 0], ['order' => ['scale']]);
$blob = bluesky_upload_blob($uid, $photo);
if (!empty($blob) && count($images) < 4) {
$images[] = ['alt' => $image['description'], 'image' => $blob];
}
}
if (!empty($images)) {
$record['embed'] = ['$type' => 'app.bsky.embed.images', 'images' => $images];
}
} elseif ($msg['type'] == 'link') {
$record['embed'] = [
'$type' => 'app.bsky.embed.external',
'external' => [
'uri' => $msg['url'],
'title' => $msg['title'],
'description' => $msg['description'],
]
];
if (!empty($msg['image'])) {
$photo = Photo::createPhotoForExternalResource($msg['image']);
$blob = bluesky_upload_blob($uid, $photo);
if (!empty($blob)) {
$record['embed']['external']['thumb'] = $blob;
}
}
}
return $record;
}
function bluesky_upload_blob(int $uid, array $photo): ?stdClass
{
$content = Photo::getImageForPhoto($photo);
$data = bluesky_post($uid, '/xrpc/com.atproto.repo.uploadBlob', $content, ['Content-type' => $photo['type'], 'Authorization' => ['Bearer ' . bluesky_get_token($uid)]]);
if (empty($data)) {
return null;
}
Logger::debug('Uploaded blob', ['return' => $data]);
return $data->blob;
}
function bluesky_get_timeline(int $uid)
{
$data = bluesky_get($uid, '/xrpc/app.bsky.feed.getTimeline', HttpClientAccept::JSON, [HttpClientOptions::HEADERS => ['Authorization' => ['Bearer ' . bluesky_get_token($uid)]]]);
if (empty($data)) {
return;
}
if (empty($data->feed)) {
return;
}
foreach ($data->feed as $entry) {
// TODO Add Functionality to read the timeline
print_r($entry);
}
}
function bluesky_get_did(int $uid): string
{
$data = bluesky_get($uid, '/xrpc/com.atproto.identity.resolveHandle?handle=' . DI::pConfig()->get($uid, 'bluesky', 'handle'));
if (empty($data)) {
return '';
}
Logger::debug('Got DID', ['return' => $data]);
return $data->did;
}
function bluesky_get_token(int $uid): string
{
$token = DI::pConfig()->get($uid, 'bluesky', 'access_token');
$created = DI::pConfig()->get($uid, 'bluesky', 'token_created');
if (empty($token)) {
return '';
}
if ($created + 300 < time()) {
return bluesky_refresh_token($uid);
}
return $token;
}
function bluesky_refresh_token(int $uid): string
{
$token = DI::pConfig()->get($uid, 'bluesky', 'refresh_token');
$data = bluesky_post($uid, '/xrpc/com.atproto.server.refreshSession', '', ['Authorization' => ['Bearer ' . $token]]);
if (empty($data)) {
return '';
}
Logger::debug('Refreshed token', ['return' => $data]);
DI::pConfig()->set($uid, 'bluesky', 'access_token', $data->accessJwt);
DI::pConfig()->set($uid, 'bluesky', 'refresh_token', $data->refreshJwt);
DI::pConfig()->set($uid, 'bluesky', 'token_created', time());
return $data->accessJwt;
}
function bluesky_create_token(int $uid, string $password): string
{
$did = DI::pConfig()->get($uid, 'bluesky', 'did');
$data = bluesky_post($uid, '/xrpc/com.atproto.server.createSession', json_encode(['identifier' => $did, 'password' => $password]), ['Content-type' => 'application/json']);
if (empty($data)) {
return '';
}
Logger::debug('Created token', ['return' => $data]);
DI::pConfig()->set($uid, 'bluesky', 'access_token', $data->accessJwt);
DI::pConfig()->set($uid, 'bluesky', 'refresh_token', $data->refreshJwt);
DI::pConfig()->set($uid, 'bluesky', 'token_created', time());
return $data->accessJwt;
}
function bluesky_post(int $uid, string $url, string $params, array $headers): ?stdClass
{
try {
$curlResult = DI::httpClient()->post(DI::pConfig()->get($uid, 'bluesky', 'host') . $url, $params, $headers);
} catch (\Exception $e) {
Logger::notice('Exception on post', ['exception' => $e]);
return null;
}
if (!$curlResult->isSuccess()) {
Logger::notice('API Error', ['error' => json_decode($curlResult->getBody()) ?: $curlResult->getBody()]);
return null;
}
return json_decode($curlResult->getBody());
}
function bluesky_get(int $uid, string $url, string $accept_content = HttpClientAccept::DEFAULT, array $opts = []): ?stdClass
{
try {
$curlResult = DI::httpClient()->get(DI::pConfig()->get($uid, 'bluesky', 'host') . $url, $accept_content, $opts);
} catch (\Exception $e) {
Logger::notice('Exception on get', ['exception' => $e]);
return null;
}
if (!$curlResult->isSuccess()) {
Logger::notice('API Error', ['error' => json_decode($curlResult->getBody()) ?: $curlResult->getBody()]);
return null;
}
return json_decode($curlResult->getBody());
}

View file

@ -0,0 +1,72 @@
# ADDON bluesky
# Copyright (C)
# This file is distributed under the same license as the Friendica bluesky addon package.
#
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-05-21 19:24+0000\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"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: bluesky.php:51
msgid ""
"You are authenticated to Bluesky. For security reasons the password isn't "
"stored."
msgstr ""
#: bluesky.php:51
msgid "You are not authenticated. Please enter the app password."
msgstr ""
#: bluesky.php:55
msgid "Enable Bluesky Post Addon"
msgstr ""
#: bluesky.php:56
msgid "Post to Bluesky by default"
msgstr ""
#: bluesky.php:57
msgid "Bluesky host"
msgstr ""
#: bluesky.php:58
msgid "Bluesky handle"
msgstr ""
#: bluesky.php:59
msgid "Bluesky DID"
msgstr ""
#: bluesky.php:59
msgid ""
"This is the unique identifier. It will be fetched automatically, when the "
"handle is entered."
msgstr ""
#: bluesky.php:60
msgid "Bluesky app password"
msgstr ""
#: bluesky.php:60
msgid ""
"Please don't add your real password here, but instead create a specific app "
"password in the Bluesky settings."
msgstr ""
#: bluesky.php:66
msgid "Bluesky Export"
msgstr ""
#: bluesky.php:116
msgid "Post to Bluesky"
msgstr ""

View file

@ -0,0 +1,7 @@
<p>{{$status}}</p>
{{include file="field_checkbox.tpl" field=$enable}}
{{include file="field_checkbox.tpl" field=$bydefault}}
{{include file="field_input.tpl" field=$host}}
{{include file="field_input.tpl" field=$handle}}
{{include file="field_input.tpl" field=$did}}
{{include file="field_input.tpl" field=$password}}

View file

@ -4,15 +4,15 @@
# #
# #
# Translators: # Translators:
# Balázs Úr, 2020-2021 # Balázs Úr, 2020-2021,2023
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: friendica\n" "Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-21 19:15-0500\n" "POT-Creation-Date: 2021-11-21 19:15-0500\n"
"PO-Revision-Date: 2014-06-23 09:54+0000\n" "PO-Revision-Date: 2014-06-23 09:54+0000\n"
"Last-Translator: Balázs Úr, 2020-2021\n" "Last-Translator: Balázs Úr, 2020-2021,2023\n"
"Language-Team: Hungarian (http://www.transifex.com/Friendica/friendica/language/hu/)\n" "Language-Team: Hungarian (http://app.transifex.com/Friendica/friendica/language/hu/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
@ -31,68 +31,72 @@ msgstr "E-mail-cím, ahonnan úgy tűnik, hogy a folyam elemei származnak."
msgid "Save Settings" msgid "Save Settings"
msgstr "Beállítások mentése" msgstr "Beállítások mentése"
#: mailstream.php:301 #: mailstream.php:311
msgid "Re:" msgid "Re:"
msgstr "Vá:" msgstr "Vá:"
#: mailstream.php:314 mailstream.php:317 #: mailstream.php:324 mailstream.php:327
msgid "Friendica post" msgid "Friendica post"
msgstr "Friendica-bejegyzés" msgstr "Friendica-bejegyzés"
#: mailstream.php:320 #: mailstream.php:330
msgid "Diaspora post" msgid "Diaspora post"
msgstr "Diaspora-bejegyzés" msgstr "Diaspora-bejegyzés"
#: mailstream.php:330 #: mailstream.php:340
msgid "Feed item" msgid "Feed item"
msgstr "Hírforráselem" msgstr "Hírforráselem"
#: mailstream.php:333 #: mailstream.php:343
msgid "Email" msgid "Email"
msgstr "E-mail" msgstr "E-mail"
#: mailstream.php:335 #: mailstream.php:345
msgid "Friendica Item" msgid "Friendica Item"
msgstr "Friendica-elem" msgstr "Friendica-elem"
#: mailstream.php:404 #: mailstream.php:419
msgid "Upstream" msgid "Upstream"
msgstr "Távoli" msgstr "Távoli"
#: mailstream.php:405 #: mailstream.php:420
msgid "URI"
msgstr "URI"
#: mailstream.php:421
msgid "Local" msgid "Local"
msgstr "Helyi" msgstr "Helyi"
#: mailstream.php:481 #: mailstream.php:499
msgid "Enabled" msgid "Enabled"
msgstr "Engedélyezve" msgstr "Engedélyezve"
#: mailstream.php:486 #: mailstream.php:504
msgid "Email Address" msgid "Email Address"
msgstr "E-mail-cím" msgstr "E-mail-cím"
#: mailstream.php:488 #: mailstream.php:506
msgid "Leave blank to use your account email address" msgid "Leave blank to use your account email address"
msgstr "Hagyja üresen a fiókja e-mail-címének használatához" msgstr "Hagyja üresen a fiókja e-mail-címének használatához"
#: mailstream.php:492 #: mailstream.php:510
msgid "Exclude Likes" msgid "Exclude Likes"
msgstr "Kedvelések kizárása" msgstr "Kedvelések kizárása"
#: mailstream.php:494 #: mailstream.php:512
msgid "Check this to omit mailing \"Like\" notifications" msgid "Check this to omit mailing \"Like\" notifications"
msgstr "Jelölje be ezt a „Tetszik” értesítések elküldésének kihagyásához" msgstr "Jelölje be ezt a „Tetszik” értesítések elküldésének kihagyásához"
#: mailstream.php:498 #: mailstream.php:516
msgid "Attach Images" msgid "Attach Images"
msgstr "Képek csatolása" msgstr "Képek csatolása"
#: mailstream.php:500 #: mailstream.php:518
msgid "" msgid ""
"Download images in posts and attach them to the email. Useful for reading " "Download images in posts and attach them to the email. Useful for reading "
"email while offline." "email while offline."
msgstr "Képek letöltése a bejegyzésekből és csatolás az e-mailhez. Hasznos az e-mailek kapcsolat nélküli olvasásakor." msgstr "Képek letöltése a bejegyzésekből és csatolás az e-mailhez. Hasznos az e-mailek kapcsolat nélküli olvasásakor."
#: mailstream.php:507 #: mailstream.php:525
msgid "Mail Stream Settings" msgid "Mail Stream Settings"
msgstr "Levelezőfolyam beállításai" msgstr "Levelezőfolyam beállításai"

View file

@ -15,6 +15,7 @@ $a->strings['Feed item'] = 'Hírforráselem';
$a->strings['Email'] = 'E-mail'; $a->strings['Email'] = 'E-mail';
$a->strings['Friendica Item'] = 'Friendica-elem'; $a->strings['Friendica Item'] = 'Friendica-elem';
$a->strings['Upstream'] = 'Távoli'; $a->strings['Upstream'] = 'Távoli';
$a->strings['URI'] = 'URI';
$a->strings['Local'] = 'Helyi'; $a->strings['Local'] = 'Helyi';
$a->strings['Enabled'] = 'Engedélyezve'; $a->strings['Enabled'] = 'Engedélyezve';
$a->strings['Email Address'] = 'E-mail-cím'; $a->strings['Email Address'] = 'E-mail-cím';

View file

@ -4,28 +4,28 @@
# #
# #
# Translators: # Translators:
# Balázs Úr, 2020-2021 # Balázs Úr, 2020-2021,2023
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: friendica\n" "Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-02-01 18:15+0100\n" "POT-Creation-Date: 2023-05-01 07:39+0200\n"
"PO-Revision-Date: 2014-06-23 11:18+0000\n" "PO-Revision-Date: 2014-06-23 11:18+0000\n"
"Last-Translator: Balázs Úr, 2020-2021\n" "Last-Translator: Balázs Úr, 2020-2021,2023\n"
"Language-Team: Hungarian (http://www.transifex.com/Friendica/friendica/language/hu/)\n" "Language-Team: Hungarian (http://app.transifex.com/Friendica/friendica/language/hu/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: hu\n" "Language: hu\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: piwik.php:87 #: piwik.php:96
msgid "" msgid ""
"This website is tracked using the <a href='http://www.matomo.org'>Matomo</a>" "This website is tracked using the <a href='http://www.matomo.org'>Matomo</a>"
" analytics tool." " analytics tool."
msgstr "Ez a weboldal a <a href='http://www.matomo.org'>Matomo</a> analitikai eszköz használatával van követve." msgstr "Ez a weboldal a <a href='http://www.matomo.org'>Matomo</a> analitikai eszköz használatával van követve."
#: piwik.php:90 #: piwik.php:99
#, php-format #, php-format
msgid "" msgid ""
"If you do not want that your visits are logged in this way you <a " "If you do not want that your visits are logged in this way you <a "
@ -33,28 +33,32 @@ msgid ""
"visits of the site</a> (opt-out)." "visits of the site</a> (opt-out)."
msgstr "Ha nem szeretné, hogy a látogatásai ilyen módon naplózva legyenek, akkor <a href='%s'>beállíthat egy sütit annak megakadályozásához, hogy a Matomo vagy a Piwik kövesse az oldal további meglátogatásait</a> (lemondás)." msgstr "Ha nem szeretné, hogy a látogatásai ilyen módon naplózva legyenek, akkor <a href='%s'>beállíthat egy sütit annak megakadályozásához, hogy a Matomo vagy a Piwik kövesse az oldal további meglátogatásait</a> (lemondás)."
#: piwik.php:97 #: piwik.php:108
msgid "Save Settings" msgid "Save Settings"
msgstr "Beállítások mentése" msgstr "Beállítások mentése"
#: piwik.php:98 #: piwik.php:109
msgid "Matomo (Piwik) Base URL" msgid "Matomo (Piwik) Base URL"
msgstr "Matomo (Piwik) alap URL" msgstr "Matomo (Piwik) alap URL"
#: piwik.php:98 #: piwik.php:109
msgid "" msgid ""
"Absolute path to your Matomo (Piwik) installation. (without protocol " "Absolute path to your Matomo (Piwik) installation. (without protocol "
"(http/s), with trailing slash)" "(http/s), with trailing slash)"
msgstr "Abszolút útvonal a Matomo (Piwik) telepítéséhez (http vagy https protokoll nélkül, de lezáró perjellel)." msgstr "Abszolút útvonal a Matomo (Piwik) telepítéséhez (http vagy https protokoll nélkül, de lezáró perjellel)."
#: piwik.php:99 #: piwik.php:110
msgid "Site ID" msgid "Site ID"
msgstr "Oldalazonosító" msgstr "Oldalazonosító"
#: piwik.php:100 #: piwik.php:111
msgid "Show opt-out cookie link?" msgid "Show opt-out cookie link?"
msgstr "Megjeleníti a lemondó süti hivatkozását?" msgstr "Megjeleníti a lemondó süti hivatkozását?"
#: piwik.php:101 #: piwik.php:112
msgid "Asynchronous tracking" msgid "Asynchronous tracking"
msgstr "Aszinkron követés" msgstr "Aszinkron követés"
#: piwik.php:113
msgid "Shortcut path to the script ('/js/' instead of '/piwik.js')"
msgstr "A parancsfájl rövidített útvonala („/js/” a „/piwik.js” helyett)"

View file

@ -13,3 +13,4 @@ $a->strings['Absolute path to your Matomo (Piwik) installation. (without protoco
$a->strings['Site ID'] = 'Oldalazonosító'; $a->strings['Site ID'] = 'Oldalazonosító';
$a->strings['Show opt-out cookie link?'] = 'Megjeleníti a lemondó süti hivatkozását?'; $a->strings['Show opt-out cookie link?'] = 'Megjeleníti a lemondó süti hivatkozását?';
$a->strings['Asynchronous tracking'] = 'Aszinkron követés'; $a->strings['Asynchronous tracking'] = 'Aszinkron követés';
$a->strings['Shortcut path to the script (\'/js/\' instead of \'/piwik.js\')'] = 'A parancsfájl rövidített útvonala („/js/” a „/piwik.js” helyett)';

View file

@ -4,69 +4,86 @@
# #
# #
# Translators: # Translators:
# Balázs Úr, 2020-2021 # Balázs Úr, 2020-2021,2023
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: friendica\n" "Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-21 19:17-0500\n" "POT-Creation-Date: 2023-04-29 06:56+0000\n"
"PO-Revision-Date: 2014-06-23 12:58+0000\n" "PO-Revision-Date: 2014-06-23 12:58+0000\n"
"Last-Translator: Balázs Úr, 2020-2021\n" "Last-Translator: Balázs Úr, 2020-2021,2023\n"
"Language-Team: Hungarian (http://www.transifex.com/Friendica/friendica/language/hu/)\n" "Language-Team: Hungarian (http://app.transifex.com/Friendica/friendica/language/hu/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: hu\n" "Language: hu\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: tumblr.php:39 #: tumblr.php:243
msgid "Permission denied." msgid "Permission denied."
msgstr "Engedély megtagadva." msgstr "Engedély megtagadva."
#: tumblr.php:69 #: tumblr.php:296
msgid "Save Settings" msgid "Save Settings"
msgstr "Beállítások mentése" msgstr "Beállítások mentése"
#: tumblr.php:71 #: tumblr.php:297
msgid "Consumer Key" msgid "Consumer Key"
msgstr "Felhasználói kulcs" msgstr "Felhasználói kulcs"
#: tumblr.php:72 #: tumblr.php:298
msgid "Consumer Secret" msgid "Consumer Secret"
msgstr "Felhasználói titok" msgstr "Felhasználói titok"
#: tumblr.php:177 #: tumblr.php:299
msgid "You are now authenticated to tumblr." msgid "Maximum tags"
msgstr "Most már hitelesítve van a Tumblr-hez." msgstr "Legtöbb címke"
#: tumblr.php:178 #: tumblr.php:299
msgid "return to the connector page" msgid ""
msgstr "visszatérés a csatlakozó oldalára" "Maximum number of tags that a user can follow. Enter 0 to deactivate the "
"feature."
msgstr "A címkék legnagyobb száma, amit egy felhasználó követhet. Adjon meg 0 értéket a funkció kikapcsolásához."
#: tumblr.php:194 #: tumblr.php:336
msgid "Post to Tumblr"
msgstr "Beküldése a Tumblr-re"
#: tumblr.php:225
msgid "Post to page:" msgid "Post to page:"
msgstr "Beküldés az oldalra:" msgstr "Beküldés az oldalra:"
#: tumblr.php:231 #: tumblr.php:342
msgid "(Re-)Authenticate your tumblr page" msgid "(Re-)Authenticate your tumblr page"
msgstr "A Tumblr-oldal (újra)hitelesítése" msgstr "A Tumblr-oldal (újra)hitelesítése"
#: tumblr.php:232 #: tumblr.php:343
msgid "You are not authenticated to tumblr" msgid "You are not authenticated to tumblr"
msgstr "Nincs hitelesítve van a Tumblr-hez" msgstr "Nincs hitelesítve van a Tumblr-hez"
#: tumblr.php:237 #: tumblr.php:348
msgid "Enable Tumblr Post Addon" msgid "Enable Tumblr Post Addon"
msgstr "A Tumblr-beküldő bővítmény engedélyezése" msgstr "A Tumblr-beküldő bővítmény engedélyezése"
#: tumblr.php:238 #: tumblr.php:349
msgid "Post to Tumblr by default" msgid "Post to Tumblr by default"
msgstr "Beküldés a Tumblr-re alapértelmezetten" msgstr "Beküldés a Tumblr-re alapértelmezetten"
#: tumblr.php:244 #: tumblr.php:350
msgid "Tumblr Export" msgid "Import the remote timeline"
msgstr "Tumblr exportálás" msgstr "A távoli idővonal importálása"
#: tumblr.php:351
msgid "Subscribed tags"
msgstr "Feliratkozott címkék"
#: tumblr.php:351
#, php-format
msgid ""
"Comma separated list of up to %d tags that will be imported additionally to "
"the timeline"
msgstr "Legfeljebb %d címke vesszővel elválasztott listája, amelyek szintén importálásra kerülnek az idővonalon felül"
#: tumblr.php:357
msgid "Tumblr Import/Export"
msgstr "Tumblr importálás és exportálás"
#: tumblr.php:375
msgid "Post to Tumblr"
msgstr "Beküldése a Tumblr-re"

View file

@ -9,12 +9,15 @@ $a->strings['Permission denied.'] = 'Engedély megtagadva.';
$a->strings['Save Settings'] = 'Beállítások mentése'; $a->strings['Save Settings'] = 'Beállítások mentése';
$a->strings['Consumer Key'] = 'Felhasználói kulcs'; $a->strings['Consumer Key'] = 'Felhasználói kulcs';
$a->strings['Consumer Secret'] = 'Felhasználói titok'; $a->strings['Consumer Secret'] = 'Felhasználói titok';
$a->strings['You are now authenticated to tumblr.'] = 'Most már hitelesítve van a Tumblr-hez.'; $a->strings['Maximum tags'] = 'Legtöbb címke';
$a->strings['return to the connector page'] = 'visszatérés a csatlakozó oldalára'; $a->strings['Maximum number of tags that a user can follow. Enter 0 to deactivate the feature.'] = 'A címkék legnagyobb száma, amit egy felhasználó követhet. Adjon meg 0 értéket a funkció kikapcsolásához.';
$a->strings['Post to Tumblr'] = 'Beküldése a Tumblr-re';
$a->strings['Post to page:'] = 'Beküldés az oldalra:'; $a->strings['Post to page:'] = 'Beküldés az oldalra:';
$a->strings['(Re-)Authenticate your tumblr page'] = 'A Tumblr-oldal (újra)hitelesítése'; $a->strings['(Re-)Authenticate your tumblr page'] = 'A Tumblr-oldal (újra)hitelesítése';
$a->strings['You are not authenticated to tumblr'] = 'Nincs hitelesítve van a Tumblr-hez'; $a->strings['You are not authenticated to tumblr'] = 'Nincs hitelesítve van a Tumblr-hez';
$a->strings['Enable Tumblr Post Addon'] = 'A Tumblr-beküldő bővítmény engedélyezése'; $a->strings['Enable Tumblr Post Addon'] = 'A Tumblr-beküldő bővítmény engedélyezése';
$a->strings['Post to Tumblr by default'] = 'Beküldés a Tumblr-re alapértelmezetten'; $a->strings['Post to Tumblr by default'] = 'Beküldés a Tumblr-re alapértelmezetten';
$a->strings['Tumblr Export'] = 'Tumblr exportálás'; $a->strings['Import the remote timeline'] = 'A távoli idővonal importálása';
$a->strings['Subscribed tags'] = 'Feliratkozott címkék';
$a->strings['Comma separated list of up to %d tags that will be imported additionally to the timeline'] = 'Legfeljebb %d címke vesszővel elválasztott listája, amelyek szintén importálásra kerülnek az idővonalon felül';
$a->strings['Tumblr Import/Export'] = 'Tumblr importálás és exportálás';
$a->strings['Post to Tumblr'] = 'Beküldése a Tumblr-re';

View file

@ -79,7 +79,7 @@ function tumblr_check_item_notification(array &$notification_data)
return; return;
} }
$own_user = Contact::selectFirst(['url', 'alias'], ['uid' => $notification_data['uid'], 'poll' => 'tumblr::'.$page]); $own_user = Contact::selectFirst(['url', 'alias'], ['uid' => $notification_data['uid'], 'poll' => 'tumblr::' . $page]);
if ($own_user) { if ($own_user) {
$notification_data['profiles'][] = $own_user['url']; $notification_data['profiles'][] = $own_user['url'];
$notification_data['profiles'][] = $own_user['alias']; $notification_data['profiles'][] = $own_user['alias'];
@ -1262,6 +1262,11 @@ function tumblr_get_contact_by_url(string $url): ?array
return null; return null;
} }
if (is_array($data->response->blog)) {
Logger::warning('Unexpected blog format', ['blog' => $blog, 'data' => $data]);
return null;
}
$baseurl = 'https://tumblr.com'; $baseurl = 'https://tumblr.com';
$url = $baseurl . '/' . $data->response->blog->name; $url = $baseurl . '/' . $data->response->blog->name;
@ -1282,8 +1287,8 @@ function tumblr_get_contact_by_url(string $url): ?array
'priority' => 0, 'priority' => 0,
'guid' => $data->response->blog->uuid, 'guid' => $data->response->blog->uuid,
'about' => HTML::toBBCode($data->response->blog->description), 'about' => HTML::toBBCode($data->response->blog->description),
'photo' => $data->response->blog->avatar[0]->url, 'photo' => $data->response->blog->avatar[0]->url,
'header' => $data->response->blog->theme->header_image_focused, 'header' => $data->response->blog->theme->header_image_focused,
]; ];
} }