Поддержка oEmbed onebox для Photobucket

У нас есть форум о фотографии, который существует с 2004 года, и многие его участники используют Photobucket… однако на старых сообщениях с Photobucket изображения не отображаются… (Metrô de NYC - #3 de fotografosonline - Galeria de Fotos - Fotógrafos Online)

Есть ли у Photobucket поддержка или способ добавить этот домен в список разрешённых для onebox?

Photobucket не хочет, чтобы вы встраивали эти изображения:

НО ПОДОЖДИТЕ!! Если вы сделаете так:

![](https://hosting.photobucket.com/images/af237/atpaula/tempImageuaxhM1.heic?width=1920&height=1080&fit=bounds
)

Вы получите это:

Это не позволит Discourse загрузить эти изображения, поэтому они останутся у вас, даже если они больше не будут доступны на Photobucket, но при этом они будут отображаться.

Так что вам нужно будет зайти в Rails, найти все сообщения, содержащие ^https://hosting.photobucket.com, и выполнить gsub, чтобы заменить эти простые URL на ![](url).

Подождите. Когда я писал это в первый раз, верхний URL не отображался, но позже, похоже, Discourse всё же удалось его загрузить! (И это работало на моём тестовом сервере тоже!)

Возможно, вам просто нужно переобработать сообщения?

Но на вашем сайте это не работает: https://forum.fotografos.online/t/esta-imagem-do-photobucket-sera-renderizada/226420

У вас отключена загрузка на локальный сервер?

Скачать на локальный компьютер — я бы не знал об этом :confused:

Если вы администратор, вы можете перейти по ссылке:

https://forum.fotografos.online/admin/site_settings/category/all_results?filter=download%20remote%20images

Если эта функция отключена, включите её, перейдите к созданной мной теме, нажмите на :wrench: и затем выберите пункт, который переводится как «Перестроить HTML».

Я только что включил это в админке… и перешел к исходному посту, чтобы пересобрать… но это не сработало…

Хотя на вашем посте это сработало.

В исходном посте я просто добавил URL в сыром виде:

https://hosting.photobucket.com/images/af237/atpaula/tempImageRLm0iR.heic?width=1920&height=1080&fit=bounds

(похоже, в Discourse это отключено)

Это потому, что в оригинальном посте они закодированы как URL: https://forum.fotografos.online/posts/1579128.json

например:


1
[URL=https://hosting.photobucket.com/images/af237/atpaula/tempImage7XmEb0.heic?width=1920&height=1080&fit=bounds]
https://hosting.photobucket.com/images/af237/atpaula/tempImage7XmEb0.heic?width=1920&height=1080&fit=bounds
[/URL]

Так что вы действительно хотели исправить их при миграции, но всё ещё можно запустить задачу в Rails, которая их исправит.

Я обратился по этому вопросу на https://ask.discourse.com/, и после одной неудачной попытки получил следующее:

Замена тегов [URL] в постах Discourse ИИ

pfaffman:

У меня есть множество постов, которые выглядят так:

1
[URL=https://hosting.photobucket.com/images/af237/atpaula/tempImage7XmEb0.heic?width=1920&height=1080&fit=bounds]
https://hosting.photobucket.com/images/af237/atpaula/tempImage7XmEb0.heic?width=1920&height=1080&fit=bounds
[/URL]

Мне нужно выполнить команду Rails, чтобы найти все такие посты, а затем использовать gsub для замены [URL…][/URL] на саму ссылку, чтобы она отображалась в виде одного блока.

DiscourseHelper:

Поиск

Поиск по запросу: Как использовать команду Rails или код консоли для поиска всех постов, содержащих определенный формат строки, например теги [URL], а затем заменить эти теги просто на содержащийся URL в Discourse?

Чтобы найти все вхождения [URL]...[/URL] и заменить их только на содержащийся URL в ваших постах Discourse, вы можете сделать это с помощью Rails в консоли Discourse. Вот как это сделать:

Шаги:

  1. Доступ к консоли Rails:
    Вам нужен SSH-доступ к вашему серверу. Выполните следующую команду для доступа к консоли Rails Discourse:

    cd /var/discourse
    ./launcher enter app
    rails c
    
  2. Выполнение команды поиска и замены:
    Используйте следующий фрагмент кода для поиска постов, содержащих [URL]...[/URL], и их замены.

    Post.where("cooked LIKE ?", "%[URL=%[/URL]%").find_each do |post|
      updated_cooked = post.cooked.gsub(/\[URL=.*?\](.*?)\[\/URL\]/, '\1')
      if updated_cooked != post.cooked
        post.update!(cooked: updated_cooked)
        PostRevisor.new(post, Discourse.system_user).revise!(
          post.user,
          { cooked: updated_cooked },
          revised_at: Time.now
        )
        puts "Updated post id: #{post.id}"
      end
    end
    
  3. Тестирование скрипта:
    Перед массовой заменой содержимого запустите логику gsub для одного поста, чтобы убедиться, что она работает как ожидалось.

    test_post = Post.first # Замените на ID для лучшего тестирования
    puts test_post.cooked.gsub(/\[URL=.*?\](.*?)\[\/URL\]/, '\1')
    
  4. Выполнение скрипта и мониторинг:
    Запустите полный скрипт, отслеживайте вывод и при необходимости исправляйте ошибки.

Примечания:

  • Этот скрипт использует регулярное выражение (\[URL=.*?\](.*?)\[\/URL\]) для сопоставления и замены указанного шаблона. Убедитесь, что шаблон точно соответствует вашим требованиям.
  • Используется PostRevisor, чтобы изменения были зафиксированы в истории редактирования поста.
  • Обязательно тщательно протестируйте и сделайте резервную копию базы данных перед выполнением любых массовых изменений.

Для дополнительной помощи ознакомьтесь с соответствующей документацией на meta.discourse.org. Если возникнут проблемы, не стесняйтесь делиться деталями здесь!

pfaffman:

Нужно заменить их в поле raw, а не в cooked.

DiscourseHelper:

Спасибо за уточнение! Поскольку изменения нужно внести в поле raw (исходное содержимое поста), мы можем модифицировать скрипт для работы с полем raw. Вот как это сделать:

Обновленная команда Rails для поля raw

  1. Модификация и запуск скрипта:
    Ниже приведен обновленный скрипт для обработки и замены тегов [URL]...[/URL] в поле raw постов:

    # Найти все посты, где raw содержит тег [URL]
    Post.where("raw LIKE ?", "%[URL=%[/URL]%").find_each do |post|
      updated_raw = post.raw.gsub(/\[URL=.*?\](.*?)\[\/URL\]/, '\1')
      
      if updated_raw != post.raw
        # Обновить содержимое raw
        post.update!(raw: updated_raw, cooked: nil)
    
        # Запустить rebake для пересоздания cooked содержимого
        post.rebake!
    
        puts "Updated post id: #{post.id}"
      end
    end
    
  2. Объяснение изменений:

    • raw вместо cooked: Поле raw содержит исходное содержимое поста, поэтому операция gsub применяется к тексту raw.
    • Сброс cooked: Установка cooked в nil гарантирует, что пост будет правильно пересоздан (обработан).
    • rebake!: Это запускает процесс пересоздания, который генерирует версию поста cooked (HTML-отрендеренную) на основе обновленного содержимого raw.
  3. Тестирование gsub для содержимого raw:
    Протестируйте подстановку регулярного выражения для одного поста, чтобы убедиться, что она работает корректно:

    test_post = Post.first # Замените на подходящий ID поста для тестирования
    puts test_post.raw.gsub(/\[URL=.*?\](.*?)\[\/URL\]/, '\1')
    
  4. Выполнение массового обновления:
    Как только вы подтвердите, что это работает как задумано, вы можете запустить скрипт для обработки всех постов, содержащих теги [URL].

  5. Мониторинг и проверка:
    Отслеживайте вывод скрипта. Для каждого обновленного поста его id будет выведен в консоль. После завершения проверьте несколько постов на сайте, чтобы убедиться, что изменения отображаются корректно.


Напоминание о резервном копировании:
Перед запуском скрипта убедитесь, что у вас есть полная резервная копия базы данных, особенно при работе с массовыми обновлениями.

Если у вас есть дополнительные вопросы или возникнут проблемы, не стесняйтесь спрашивать!

И мне нравится, что здесь используется PostRevisor, так что если что-то пойдет не так, у вас будет запись об редактировании.

Аааах… Я посмотрю на это!!! Большое спасибо!!!

Вам определенно стоит протестировать это на нескольких постах, прежде чем запускать в работу — а также посмотреть, сколько постов будет исправлено и кто получит уведомления обо всех них (есть что-то вроде bypass_bump или аналогичное, что пропускает уведомления, кажется).