В чем проблема

Как известно ссылки часто бывают слишком длинными, например меня на идею автоматизировать линкшортингх (врядли есть такое слово, но теперь - да) пока я смотрел стрим одно известного вертолета будучи модером в чате, и было зареквестировано скинуть ссылку на другой канал в чат, однако ютуб тупо обрезает ссылки в чате, почему сслыка вида https://www.youtube.com/channel/UCJLorkdDK41pOQyoVQbFqJQ была бы отправлена примерно как https://www.youtube.com/channel/UCJLor... и была бы бесполезна. Тогда(пару часов назад) я просто сгенерил пост со ссылкой внутри, но сейчас хотелось бы более автоматизированное решение.

1. Создаем шаблон(архетип) hugo

В hugo встроены такие штуки как архитипы(archetypes), которые используются как шаблон при создании нового контента с помощью hugo new, например hugo new posts/post_name.md заюзает archetypes/posts.md если он есть, или default.md если его нет.

Я создал такой архетип:

<html>
    <head>
        <title>Redirect</title>
        <meta http-equiv = "refresh" content = "2; url = {% url %}" />
    </head>
    <body>
        <h1>Thanks for trusting slnt-opp shortener!</h1>
        <h2>Redirecting to </h2>
        <h3> * точка . dot <h3>
        <h5> это типа спиннер(не тот кторый для аутистов, а который показывает загрузку) </h5>
    </body>
    <script>
        console.log("всякая гугол онолитека")
    </script>
</html>

Из чего же он состоит

  • Самое главное: редирект на url урл прописан как рельсовый шаблон, но не обманывайтесь, здесь ничего это не будет, ибо зачем. Редиректит через 2 секунды после загрузки страницы
  • Какое-то вранье
  • Куда редиректит
  • там написано

2. Пишем скрит обработчик

2.1 Что делает сокращатели уникальными?

ID конечно, благо все уже придумано, поэтому я генерирую названия для ссылки из данного пользователем(мной) названия и uuid

require "securerandom"
uuid = SecureRandom.hex(3)
=> eb0cd2

2.2 Какие еще данные?

Имя для ссылки и урл берем из аргументов:

name, url = ARGV

То есть вызовываться это будет ./shortcut heli https://www.youtube.com/channel/UCJLorkdDK41pOQyoVQbFqJQ

2.3 Генерируем ссылку

В первую очередь создаем страницу из архитипа с названием созданным из имени и uuid:

filename = name + uuid
`hugo new s/#{filename}.html`

Вписываем данные:

template = File.read("content/s/#{filename}.html").gsub('{% name %}', name).gsub('{% url %}', url)

И записываем файл назад:

File.open("content/s/#{filename}.html", 'w') do |f|
    f.write template
end

Дальше уже дело ваше, но лично я запускаю мой скрипт deploy, который заливает новую версию сайта на сервер, а после красивенько вывожу ссылку:

puts "New link generated:"
puts "\n\thttps://slnt-opp.xyz/s/#{filename}\t\n\n"

По итогу весь процесс занимает пару секунд и выглядит так от начала до конца:

slnt_opp@slnt-opp-mbp slnt-opp.xyz % ./shortcut heli https://www.youtube.com/channel/UCJLorkdDK41pOQyoVQbFqJQ
New link generated:

        https://slnt-opp.xyz/s/helib9947b

slnt_opp@slnt-opp-mbp slnt-opp.xyz %

Спасибо за внимание, обращайся если нужны короткие ссылки, хех