From d280f961f5a3491c07cd81211cafa5b82c37d3d6 Mon Sep 17 00:00:00 2001 From: Ben Busby Date: Tue, 21 Jun 2022 15:53:16 -0600 Subject: [PATCH] Prepend `/u/` for Bibliogram redirects if not present Bibliogram links require a "/u/" prefix when viewing a user's profile, which does not match Instagram's URL paradigm. This adds a bit of logic for Bibliogram links to prepend this prefix if the user is not visiting a post (indicated by a "/p/" prefix, which Bibliogram and Instagram BOTH use) or the home page of an instance (indicated by an empty path value). --- lib/farside.ex | 47 ++++++++++++++++++++++++++++++++++--------- lib/farside/router.ex | 2 ++ 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/lib/farside.ex b/lib/farside.ex index 21e5076..679b9e5 100644 --- a/lib/farside.ex +++ b/lib/farside.ex @@ -6,16 +6,26 @@ defmodule Farside do # Define relation between available services and their parent service. # This enables Farside to redirect with links such as: # farside.link/https://www.youtube.com/watch?v=dQw4w9WgXcQ + @youtube_regex ~r/youtu(.be|be.com)|invidious|piped/ + @reddit_regex ~r/reddit.com|libreddit|teddit/ + @instagram_regex ~r/instagram.com|bibliogram/ + @twitter_regex ~r/twitter.com|nitter/ + @wikipedia_regex ~r/wikipedia.org|wikiless/ + @medium_regex ~r/medium.com|scribe/ + @odysee_regex ~r/odysee.com|librarian/ + @imgur_regex ~r/imgur.com|rimgo/ + @gtranslate_regex ~r/translate.google.com|lingva/ + @parent_services %{ - ~r/youtu(.be|be.com)/ => ["invidious", "piped"], - ~r/reddit.com/ => ["libreddit", "teddit"], - ~r/instagram.com/ => ["bibliogram"], - ~r/twitter.com/ => ["nitter"], - ~r/wikipedia.org/ => ["wikiless"], - ~r/medium.com/ => ["scribe"], - ~r/odysee.com/ => ["librarian"], - ~r/imgur.com/ => ["rimgo"], - ~r/translate.google.com/ => ["lingva"] + @youtube_regex => ["invidious", "piped"], + @reddit_regex => ["libreddit", "teddit"], + @instagram_regex => ["bibliogram"], + @twitter_regex => ["nitter"], + @wikipedia_regex => ["wikiless"], + @medium_regex => ["scribe"], + @odysee_regex => ["librarian"], + @imgur_regex => ["rimgo"], + @gtranslate_regex => ["lingva"] } def get_services_map do @@ -127,10 +137,27 @@ defmodule Farside do result end - instance end + def amend_instance(instance, service, path) do + cond do + String.match?(service, @instagram_regex) -> + # Bibliogram doesn't have a 1:1 matching to Instagram URLs for users, + # so a "/u" is appended if the requested path doesn't explicitly include + # "/p" for a post or an empty path for the home page. + if String.length(path) > 0 and + !String.starts_with?(path, "p/") and + !String.starts_with?(path, "u/") do + "#{instance}/u" + else + instance + end + true -> + instance + end + end + def get_last_updated do {:ok, last_updated} = Redix.command( diff --git a/lib/farside/router.ex b/lib/farside/router.ex index 85994bc..ed667e4 100644 --- a/lib/farside/router.ex +++ b/lib/farside/router.ex @@ -66,9 +66,11 @@ defmodule Farside.Router do conn.assigns[:throttle] != nil -> Farside.get_service(service_name) |> Farside.last_instance + |> Farside.amend_instance(service_name, path) true -> Farside.get_service(service_name) |> Farside.pick_instance + |> Farside.amend_instance(service_name, path) end # Redirect to the available instance