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:
# Balázs Úr, 2020-2021
# Balázs Úr, 2020-2021,2023
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-21 19:15-0500\n"
"PO-Revision-Date: 2014-06-23 09:54+0000\n"
"Last-Translator: Balázs Úr, 2020-2021\n"
"Language-Team: Hungarian (http://www.transifex.com/Friendica/friendica/language/hu/)\n"
"Last-Translator: Balázs Úr, 2020-2021,2023\n"
"Language-Team: Hungarian (http://app.transifex.com/Friendica/friendica/language/hu/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\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"
msgstr "Beállítások mentése"
#: mailstream.php:301
#: mailstream.php:311
msgid "Re:"
msgstr "Vá:"
#: mailstream.php:314 mailstream.php:317
#: mailstream.php:324 mailstream.php:327
msgid "Friendica post"
msgstr "Friendica-bejegyzés"
#: mailstream.php:320
#: mailstream.php:330
msgid "Diaspora post"
msgstr "Diaspora-bejegyzés"
#: mailstream.php:330
#: mailstream.php:340
msgid "Feed item"
msgstr "Hírforráselem"
#: mailstream.php:333
#: mailstream.php:343
msgid "Email"
msgstr "E-mail"
#: mailstream.php:335
#: mailstream.php:345
msgid "Friendica Item"
msgstr "Friendica-elem"
#: mailstream.php:404
#: mailstream.php:419
msgid "Upstream"
msgstr "Távoli"
#: mailstream.php:405
#: mailstream.php:420
msgid "URI"
msgstr "URI"
#: mailstream.php:421
msgid "Local"
msgstr "Helyi"
#: mailstream.php:481
#: mailstream.php:499
msgid "Enabled"
msgstr "Engedélyezve"
#: mailstream.php:486
#: mailstream.php:504
msgid "Email Address"
msgstr "E-mail-cím"
#: mailstream.php:488
#: mailstream.php:506
msgid "Leave blank to use your account email address"
msgstr "Hagyja üresen a fiókja e-mail-címének használatához"
#: mailstream.php:492
#: mailstream.php:510
msgid "Exclude Likes"
msgstr "Kedvelések kizárása"
#: mailstream.php:494
#: mailstream.php:512
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"
#: mailstream.php:498
#: mailstream.php:516
msgid "Attach Images"
msgstr "Képek csatolása"
#: mailstream.php:500
#: mailstream.php:518
msgid ""
"Download images in posts and attach them to the email. Useful for reading "
"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."
#: mailstream.php:507
#: mailstream.php:525
msgid "Mail Stream Settings"
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['Friendica Item'] = 'Friendica-elem';
$a->strings['Upstream'] = 'Távoli';
$a->strings['URI'] = 'URI';
$a->strings['Local'] = 'Helyi';
$a->strings['Enabled'] = 'Engedélyezve';
$a->strings['Email Address'] = 'E-mail-cím';

View file

@ -4,28 +4,28 @@
#
#
# Translators:
# Balázs Úr, 2020-2021
# Balázs Úr, 2020-2021,2023
msgid ""
msgstr ""
"Project-Id-Version: friendica\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"
"Last-Translator: Balázs Úr, 2020-2021\n"
"Language-Team: Hungarian (http://www.transifex.com/Friendica/friendica/language/hu/)\n"
"Last-Translator: Balázs Úr, 2020-2021,2023\n"
"Language-Team: Hungarian (http://app.transifex.com/Friendica/friendica/language/hu/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: hu\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: piwik.php:87
#: piwik.php:96
msgid ""
"This website is tracked using the <a href='http://www.matomo.org'>Matomo</a>"
" analytics tool."
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
msgid ""
"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)."
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"
msgstr "Beállítások mentése"
#: piwik.php:98
#: piwik.php:109
msgid "Matomo (Piwik) Base URL"
msgstr "Matomo (Piwik) alap URL"
#: piwik.php:98
#: piwik.php:109
msgid ""
"Absolute path to your Matomo (Piwik) installation. (without protocol "
"(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)."
#: piwik.php:99
#: piwik.php:110
msgid "Site ID"
msgstr "Oldalazonosító"
#: piwik.php:100
#: piwik.php:111
msgid "Show opt-out cookie link?"
msgstr "Megjeleníti a lemondó süti hivatkozását?"
#: piwik.php:101
#: piwik.php:112
msgid "Asynchronous tracking"
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['Show opt-out cookie link?'] = 'Megjeleníti a lemondó süti hivatkozását?';
$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:
# Balázs Úr, 2020-2021
# Balázs Úr, 2020-2021,2023
msgid ""
msgstr ""
"Project-Id-Version: friendica\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"
"Last-Translator: Balázs Úr, 2020-2021\n"
"Language-Team: Hungarian (http://www.transifex.com/Friendica/friendica/language/hu/)\n"
"Last-Translator: Balázs Úr, 2020-2021,2023\n"
"Language-Team: Hungarian (http://app.transifex.com/Friendica/friendica/language/hu/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: hu\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: tumblr.php:39
#: tumblr.php:243
msgid "Permission denied."
msgstr "Engedély megtagadva."
#: tumblr.php:69
#: tumblr.php:296
msgid "Save Settings"
msgstr "Beállítások mentése"
#: tumblr.php:71
#: tumblr.php:297
msgid "Consumer Key"
msgstr "Felhasználói kulcs"
#: tumblr.php:72
#: tumblr.php:298
msgid "Consumer Secret"
msgstr "Felhasználói titok"
#: tumblr.php:177
msgid "You are now authenticated to tumblr."
msgstr "Most már hitelesítve van a Tumblr-hez."
#: tumblr.php:299
msgid "Maximum tags"
msgstr "Legtöbb címke"
#: tumblr.php:178
msgid "return to the connector page"
msgstr "visszatérés a csatlakozó oldalára"
#: tumblr.php:299
msgid ""
"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
msgid "Post to Tumblr"
msgstr "Beküldése a Tumblr-re"
#: tumblr.php:225
#: tumblr.php:336
msgid "Post to page:"
msgstr "Beküldés az oldalra:"
#: tumblr.php:231
#: tumblr.php:342
msgid "(Re-)Authenticate your tumblr page"
msgstr "A Tumblr-oldal (újra)hitelesítése"
#: tumblr.php:232
#: tumblr.php:343
msgid "You are not authenticated to tumblr"
msgstr "Nincs hitelesítve van a Tumblr-hez"
#: tumblr.php:237
#: tumblr.php:348
msgid "Enable Tumblr Post Addon"
msgstr "A Tumblr-beküldő bővítmény engedélyezése"
#: tumblr.php:238
#: tumblr.php:349
msgid "Post to Tumblr by default"
msgstr "Beküldés a Tumblr-re alapértelmezetten"
#: tumblr.php:244
msgid "Tumblr Export"
msgstr "Tumblr exportálás"
#: tumblr.php:350
msgid "Import the remote timeline"
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['Consumer Key'] = 'Felhasználói kulcs';
$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['return to the connector page'] = 'visszatérés a csatlakozó oldalára';
$a->strings['Post to Tumblr'] = 'Beküldése a Tumblr-re';
$a->strings['Maximum tags'] = 'Legtöbb címke';
$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 page:'] = 'Beküldés az oldalra:';
$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['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['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;
}
$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) {
$notification_data['profiles'][] = $own_user['url'];
$notification_data['profiles'][] = $own_user['alias'];
@ -1262,6 +1262,11 @@ function tumblr_get_contact_by_url(string $url): ?array
return null;
}
if (is_array($data->response->blog)) {
Logger::warning('Unexpected blog format', ['blog' => $blog, 'data' => $data]);
return null;
}
$baseurl = 'https://tumblr.com';
$url = $baseurl . '/' . $data->response->blog->name;
@ -1282,8 +1287,8 @@ function tumblr_get_contact_by_url(string $url): ?array
'priority' => 0,
'guid' => $data->response->blog->uuid,
'about' => HTML::toBBCode($data->response->blog->description),
'photo' => $data->response->blog->avatar[0]->url,
'header' => $data->response->blog->theme->header_image_focused,
'photo' => $data->response->blog->avatar[0]->url,
'header' => $data->response->blog->theme->header_image_focused,
];
}