Olá a todos,
Este componente permite que seus usuários adicionem modelos 3D às suas postagens usando o componente Google model viewer. Criei este componente para permitir que os usuários do meu SaaS de Fotogrametria Beholder compartilhem modelos que criam em nosso novo fórum Discourse e pensei em compartilhá-lo aqui caso seja útil para outras pessoas. Não consegui encontrar outro componente semelhante, mas fiz apenas uma pesquisa muito rápida…
Instruções e capturas de tela mostrando como usar o componente estão abaixo.
Qualquer feedback ou pensamento sobre este componente é muito apreciado. O componente model viewer que uso para exibir os modelos tem bastante funcionalidade, então há um escopo considerável para expandir este componente, expondo parte dessa funcionalidade aos usuários. Criei este componente copiando, colando e modificando os componentes insert video e mermaid, então também agradeceria muito se alguém com mais experiência em escrever componentes do Discourse pudesse dar uma olhada no código e me dizer quais erros cometi.
Atenciosamente
Alan
Uso
Quando o componente for instalado, os usuários poderão adicionar modelos 3D às suas
postagens clicando no novo ícone de cubo no compositor.
Atualmente, o visualizador 3D não fará o download e exibirá o modelo 3D imediatamente; em vez disso, exibirá um pôster (que pode ser personalizado) e carregará o modelo somente quando o usuário clicar no botão ‘Carregar Modelo 3D’. A ideia por trás disso é ajudar usuários com largura de banda limitada.
Você também provavelmente precisará aumentar o limite do tamanho máximo do anexo.
Esta é provavelmente a principal limitação para usar este componente no Discourse hospedado, pois lá, nos planos de assinatura mais baixos, o tamanho máximo é limitado a 30 MB. Para ser justo, porém, você provavelmente não quer que seus usuários façam upload de arquivos enormes e os arquivos .glb e .gltf podem ser muito reduzidos em tamanho se forem gerados por um programa que suporta compressão de malha Draco.
O mesmo aconteceu no meu fórum. Olhando para a postagem, o que acho que aconteceu é que, após alguns dias, o Discourse decidiu que a imagem do pôster carregada e o modelo 3D não são mais necessários, então os excluiu do servidor.
Eu “consertou” isso temporariamente no meu site, reenviando o modelo e o pôster, mas agora vou ler a documentação do tema do Discourse para ver se consigo consertar isso corretamente. Pela rápida análise que fiz ao escrever o componente do tema, vi que a documentação diz que, desde que um ativo seja referenciado por uma postagem, ele será mantido no servidor, mas obviamente os URLs que este componente insere na postagem não estão fazendo isso por algum motivo. Se algum outro escritor de plugin puder oferecer conselhos sobre isso, seria muito apreciado…
Sim, minha teoria atual é que, quando crio o markdown para referenciar o visualizador de modelos, de alguma forma a URL do modelo carregado não está na forma correta para a lógica que verifica os posts para reconhecer os uploads usados.
Atualmente, estou analisando outros 2 locais no Discourse onde os arquivos são carregados. No modal de upload de imagem/arquivo, uma referência é mantida a um ‘short_url’ que tem o formato upload:// em vez da URL final que será usada pelo navegador para baixar o recurso. Então, talvez eu precise descobrir como usar isso? Alternativamente, o componente GitHub - discourse/discourse-insert-video, no qual baseei meu componente, usa a URL do recurso diretamente. Ou esse componente sofre do mesmo bug (improvável ) ou essas URLs são reconhecidas porque são inseridas na mensagem markdown como tags HTML (não posso fazer isso com a tag model-viewer, pois ela não está na lista de permissões de tags HTML).
Esse é o meu pensamento atual, ou pode ser algo totalmente diferente. Agora, vou ver se consigo encontrar o código que identifica uploads órfãos em um site Discourse…
Desculpe pela demora em responder a isto. Estive ocupado com trabalho de contrato na semana passada.
De qualquer forma, dei outra olhada agora e acho que identifiquei o código que decide se um upload vive ou morre. No código do lado do servidor para processar uma postagem, há uma rotina chamada ‘each_upload_url’ que gerará uma lista de arquivos carregados que são referenciados em uma postagem.
Agora, não sou um desenvolvedor Ruby, mas pelo que entendi, ele procura URLs referenciadas por uma lista predefinida de tags HTML. Portanto, para o componente de tema de inserção de vídeo que copiei, o atributo src de qualquer elemento HTML <source> é reconhecido como um upload, e o atributo poster de qualquer elemento HTML <video> é reconhecido como um upload. Para o meu componente de inserção de modelo 3D, no entanto, o elemento HTML <model-viewer> não está na lista e, portanto, os ativos que ele referencia não são reconhecidos como uploads e, após alguns dias, serão purgados.
A correção de longo prazo para isso pode ser alterar o código do lado do servidor para que os atributos model-viewer sejam reconhecidos como uma fonte de uploads, mas acho que também deve ser possível contornar isso por enquanto, adicionando explicitamente tags HTML <a> vinculando aos uploads.
Vou postar na categoria Bug para verificar se meu entendimento está correto, mas na remota possibilidade de meu entendimento estar correto, enviei uma correção para o componente de tema Insert Model 3D que insere algumas tags <a> HTML ocultas na postagem que referenciam o modelo e o pôster carregados. @patrickemin Se você tiver tempo, poderia verificar se isso resolve o problema para você? Você precisaria atualizar o componente e, em seguida, reenviar quaisquer ativos de modelo 3D que foram purgados.
Alan, não tenho certeza se isso resolverá o enigma, mas já nos impactou no passado, onde houve bugs nessa área.
Uploads órfãos são excluídos periodicamente. Como parte de um upload, você deve ter uma entrada na tabela uploads. Se, por qualquer motivo, ela estiver faltando, o upload será removido eventualmente.
Pode ser uma linha de investigação.
Para verificar o modelo Upload, você pode entrar no console do Rails a partir do diretório do Discourse e, por exemplo:
Ah, isso é útil de saber, obrigado Robert. Você sabe se é possível realizar essa verificação ou algo equivalente no Discourse hospedado? Presumo que não, então @patrickemin, se o seu servidor por acaso for auto-hospedado, esta pode ser uma boa coisa para verificar.
Alternativamente, tenho uma configuração local do Discourse baseada em Docker que eu estava trabalhando até desistir e recorrer ao Discourse hospedado. Esta pode ser uma boa desculpa para voltar a ele.
Mas se estiver claro que isso está acontecendo com vários usuários, vale a pena investigar em uma instância auto-hospedada antes de abrir um ticket, eu suspeito.
Olá, voltei depois de alguns meses… Aproveitei a oportunidade que a Microsoft lançou seu modelo Copilot 2D para 3D para testar e seu TC agora está funcionando bem, com o código adicionado o modelo não deve desaparecer, veja aqui.