Avatar mancanti dopo l'importazione

Ho un’importazione da vBulletin per un cliente ospitato. Gli avatar sono scomparsi e ora vengono visualizzati come una sagoma generica di una persona vuota, come questa.

Sono quasi certo che in passato fossero presenti. Gli URL sembrano suggerire che dovrebbero contenere qualcosa. C’è un modo per ritrovarli?

Maybe related to that?

Do you have a backup where you can check the URL?
Are they in the tombstone?

I did a fresh import and all of the avatars are missing. Sidekiq still has 13M things to process, but I don’t see how that could be the problem. I did another import on another site with what I believe to be the same import script and the avatars are fine there.

pry(main)> User.find_by_username('MysteryManAvatar').uploaded_avatar
=> #<Upload:0x0000558a0d31b478
 id: 97,
 user_id: 114,
 original_filename: "clevername.jpg",
 filesize: 2028,
 width: 90,
 height: 67,
 url: "/uploads/default/original/1X/080817dcf59ddc838054fba9716b62fce9ae3d83.jpg",
 created_at: Thu, 19 Apr 2018 23:51:15 UTC +00:00,
 updated_at: Thu, 19 Apr 2018 23:51:15 UTC +00:00,
 sha1: "080817dcf59ddc838054fba9716b62fce9ae3d83",
 origin: nil,
 retain_hours: nil,
 extension: "jpg">

But that file isn’t in uploads (or tombstone).

I looked at Avatars not showing after import and that didn’t seem to be related.

Ho eseguito il ripristino del database da un backup (c’erano alcune migrazioni del database dalla versione precedente e backup.sql.gz includeva solo SQL, non gli upload).

Sfortunatamente, gli avatar non vengono visualizzati sul sito… (solo l’indicatore di posizione predefinito)

Sembra che siano correttamente nel database, l’URL sia corretto e il file PNG esista:

root@og-app:/var/www/discourse# rails c
[1] pry(main)> User.find_by_username('Overgrow').uploaded_avatar
=> #<Upload:0x0000565323a78880
 id: 2936,
 user_id: 1,
 original_filename: "avatar.png",
 filesize: 161585,
 width: nil,
 height: nil,
 url:     "/uploads/default/original/2X/f/fbba12aa89b1bc45676efcfa55affd4b7a76edf1.png",
 created_at: Sat, 03 Sep 2016 10:26:23 UTC +00:00,
 updated_at: Sat, 22 Feb 2020 11:57:35 UTC +00:00,
 sha1: "fbbe22aa89b1bc45676efcfa55affd4b7a76edf1",
 origin: nil,
 retain_hours: nil,
 extension: "unknown",
 thumbnail_width: nil,
 thumbnail_height: nil,
 etag: nil,
 secure: false,
 access_control_post_id: nil,
 original_sha1: nil>

Potete consigliarmi cosa provare dopo? Grazie in anticipo!

Aggiornamento:

Alcuni avatar sono stati rigenerati in background… Posso accelerare il processo? O eseguirlo manualmente?

Dalle mie osservazioni, questa parte potrebbe essere un segno del problema?

extension: "unknown",

Sembra che quelli rigenerati abbiano ora questo campo compilato:

extension: "JPG",

In qualche modo, dopo il ripristino del backup e la migrazione da Discourse 1.6 a 2.5, la mia database risultava priva dei valori width, height ed extension per la tabella Upload (i puntatori ai file erano corretti e i file erano al loro posto).

Ho finito per creare uno script che scorre tutti gli avatar caricati personalizzati, corregge l’estensione e le dimensioni e rigenera tutti gli OptimizedImage con le miniature della versione 2, che mi mancavano.

Per chiunque fosse interessato, ecco lo script:

fix-avatars.rb

require File.expand_path("../../config/environment", __FILE__)

generated_count = 0

scope = UserAvatar.where("custom_upload_id > 0")

scope.find_each do |ua|

  upload_id = ua.custom_upload_id

  upload = Upload.find_by(id: upload_id)
  
  unless upload
    puts "\nnessun upload trovato per questo avatar utente"
    next
  end
  
  # correggi sconosciuto
  if upload.extension === 'unknown'
    upload.extension = nil 
    upload.save!
    puts "\rupload_id #{upload.id} estensione sconosciuta -> nil"
  end

  if upload.extension.nil?
    puts "\rupload_id #{upload.id} correzione estensione"

    upload.fix_image_extension

    if upload.height == 0 || upload.width == 0
      puts "\rupload_id #{upload.id} correzione dimensioni"
      upload.fix_dimensions!
    end

    # verifica versione ottimizzata
    correct_optimized = OptimizedImage.where(upload_id: upload_id)
      .where(version: 2)

    if correct_optimized.count < 1
      puts "\rupload_id #{upload.id} non ha miniature della versione 2"

      # distruggi ottimizzati vecchi
      puts "\rupload_id #{upload.id} eliminazione avatar"
      optimized = OptimizedImage.where(upload_id: upload_id)

      if optimized
        optimized.destroy_all
      end

      # genera ottimizzati
      puts "\rupload_id #{upload.id} creazione avatar"
      Discourse.avatar_sizes.each {|size| OptimizedImage.create_for(upload, size, size, allow_animation: SiteSetting.allow_animated_avatars)}

      generated_count += 1

      puts "\rGenerati #{generated_count} avatar in totale"

    end
  end

end