friendica-addons/rt_replace/rt_replace.php
loma-one dbbc30e85c Dateien nach "rt_replace" hochladen
"URL Replace" is an addon that moves Nitter, Invidious to alternavie frontends. Invidious has an existing addon for Friendica that allows customised settings. If both addons are activated in parallel, this leads to multiple link references, which do not look nice and are a hindrance. In addition, selected URLs can be redirected to 12ft.io.

This addon removes the Invidious link and replaces it with a link for Instagram links to proxigram. Nitter and 12ft.io are still part of the addon.
2024-03-09 15:16:27 +01:00

130 lines
4.4 KiB
PHP

<?php
/**
* Name: Replace URL
* Description: Replaces occurrences of specified URLs with the address of alternative servers in all displays of postings on a node.
* Version: 1.1
* Author: Dr. Tobias Quathamer <https://social.anoxinon.de/@toddy>
* Author: Matthias Ebers <https://loma.ml/profile/feb>
* Maintainer: Matthias Ebers <https://loma.ml/profile/feb>
*/
use Friendica\Core\Hook;
use Friendica\Core\Renderer;
use Friendica\DI;
function rt_replace_install()
{
Hook::register('prepare_body_final', 'addon/rt_replace/rt_replace.php', 'rt_replace_render');
}
/**
* Handle sent data from admin settings
*/
function rt_replace_addon_admin_post()
{
DI::config()->set('rt_replace', 'nitter_server', rtrim(trim($_POST['nitter_server']), '/'));
DI::config()->set('rt_replace', 'instagram_server', rtrim(trim($_POST['instagram_server']), '/'));
// Convert twelvefeet_sites into an array before setting the new value
$twelvefeet_sites = explode(PHP_EOL, $_POST['twelvefeet_sites']);
// Normalize URLs by using lower case, removing a trailing slash and whitespace
$twelvefeet_sites = array_map(fn($value): string => rtrim(trim(strtolower($value)), '/'), $twelvefeet_sites);
// Do not store empty lines or duplicates
$twelvefeet_sites = array_filter($twelvefeet_sites, fn($value): bool => !empty($value));
$twelvefeet_sites = array_unique($twelvefeet_sites);
// Ensure a protocol and default to HTTPS
$twelvefeet_sites = array_map(
fn($value): string => substr($value, 0, 4) !== 'http' ? 'https://' . $value : $value,
$twelvefeet_sites
);
asort($twelvefeet_sites);
DI::config()->set('rt_replace', 'twelvefeet_sites', $twelvefeet_sites);
}
/**
* Hook into admin settings to enable choosing a different server
* for twitter, instagram, and news sites.
*/
function rt_replace_addon_admin(string &$o)
{
$nitter_server = DI::config()->get('rt_replace', 'nitter_server');
$instagram_server = DI::config()->get('rt_replace', 'instagram_server');
$twelvefeet_sites = implode(PHP_EOL, DI::config()->get('rt_replace', 'twelvefeet_sites') ?? [] ?: []);
$t = Renderer::getMarkupTemplate('admin.tpl', 'addon/rt_replace/');
$o = Renderer::replaceMacros($t, [
'$nitter_server' => [
'nitter_server',
DI::l10n()->t('Nitter server'),
$nitter_server,
DI::l10n()->t('Specify the URL with protocol. The default is https://nitter.net.'),
null,
'placeholder="https://nitter.net"',
],
'$instagram_server' => [
'instagram_server',
DI::l10n()->t('Instagram server'),
$instagram_server,
DI::l10n()->t('Specify the URL with protocol. The default is https://proxigram.lunar.icu.'),
null,
'placeholder="https://proxigram.lunar.icu"',
],
'$twelvefeet_sites' => [
'twelvefeet_sites',
DI::l10n()->t('Sites which are accessed through 12ft.io'),
$twelvefeet_sites,
DI::l10n()->t('Specify the URLs with protocol, one per line.'),
null,
'rows="6"'
],
'$submit' => DI::l10n()->t('Save settings'),
]);
}
/**
* Replace proprietary URLs with their specified counterpart
*/
function rt_replace_render(array &$b)
{
$replaced = false;
$nitter_server = DI::config()->get('rt_replace', 'nitter_server');
if (empty($nitter_server)) {
$nitter_server = 'https://nitter.net';
}
$instagram_server = DI::config()->get('rt_replace', 'instagram_server');
if (empty($instagram_server)) {
$instagram_server = 'https://proxigram.lunar.icu';
}
// Handle some of twitter and instagram
$replacements = [
'https://mobile.twitter.com' => $nitter_server,
'https://twitter.com' => $nitter_server,
'https://mobile.x.com' => $nitter_server,
'https://x.com' => $nitter_server,
'https://www.instagram.com' => $instagram_server,
'https://ig.me' => $instagram_server,
];
foreach ($replacements as $server => $replacement) {
if (strpos($b['html'], $server) !== false) {
$b['html'] = str_replace($server, $replacement, $b['html']);
$replaced = true;
}
}
$twelvefeet_sites = DI::config()->get('rt_replace', 'twelvefeet_sites') ?? [] ?: [];
foreach ($twelvefeet_sites as $twelvefeet_site) {
if (strpos($b['html'], $twelvefeet_site) !== false) {
$b['html'] = str_replace($twelvefeet_site, 'https://12ft.io/' . $twelvefeet_site, $b['html']);
$replaced = true;
}
}
if ($replaced) {
$b['html'] .= '<hr><p><small>' . DI::l10n()->t('(URL replace addon enabled for X, Instagram and some news sites.)') . '</small></p>';
}
}