Fotos de Shotwell perdem edições quando faltam arquivos

0

Eu tenho minhas fotos armazenadas no meu computador desktop, usando o Shotwell. Eu recentemente fui em um feriado prolongado e queria levar meu laptop para editar e organizar fotos com Shotwell, então eu copiei todas as fotos para um disco externo e copiei através do banco de dados Shotwell para o meu laptop. Com links simbólicos apropriados, tudo funcionou bem. Shotwell embora nada tivesse mudado. Eu também fiz um backup do banco de dados neste momento.

Pensei que poderia importar novas fotos para o disco rígido interno do meu laptop para evitar que eu precisasse de um externo. Então eu destaquei o externo, e quando eu abri o Shotwell, todas as fotos foram marcadas como "Missing". Como esperado. Passei vários meses importando novas fotos, marcando-as e fazendo edições, usando exclusivamente programas externos da Shotwell e salvando as edições como _modified.jpg. Tudo correu muito bem, eu estava assumindo que Shotwell iria pegar as fotos que faltam quando eu finalmente reconectar o disco.

Para meu horror, descobri que isso não aconteceu tão bem quanto eu queria. Quando cheguei em casa e conectei novamente o disco externo, o Shotwell fez uma nova varredura nas fotos, mas perdeu todas as referências às minhas fotos editadas. Arquivei um bug para isso .

Eu tenho um backup do banco de dados que corretamente tem todas as minhas edições antes de ir de férias, e eu tenho um backup do banco de dados com todas as minhas novas edições. Existe uma maneira de mesclá-los para corrigir as edições ausentes?

P.S. A mensagem para levar para casa é: SEMPRE TENHA BACKUPS! O Shotwell tem um bug onde o campo "editable_id" dos registros no "phototable" do banco de dados sqlite é apagado quando a foto desaparece. Isso é facilmente corrigido restaurando o photos.db.bk automático, mas é um grande problema se você continuar importando e editando fotos.

    
por seanlano 31.01.2014 / 13:10

1 resposta

2

OK, eu percebi isso. A idéia geral era copiar as novas partes do banco de dados para o antigo, tendo assim um banco de dados totalmente funcional. Ao longo do tempo, refiro-me às fotos "antigas" / banco de dados como a que funcionava antes de remover o armazenamento e as "novas" fotos / banco de dados como as que funcionam após uma determinada data (que provavelmente tem um local de armazenamento diferente ou foram adicionadas depois que as fotos foram excluídas), mas onde as fotos "antigas" não funcionam corretamente. Espero que isso faça sentido. :)

Para que isso funcione, você precisa ter feito backups do banco de dados Shotwell. Então eu estou supondo que você sabe um pouco sobre onde isso é armazenado.

Preparação

Faça backups de tudo! Não estou brincando, não há garantias de que isso funcionará.

O primeiro passo é instalar o sqliteman

sudo apt-get install sqliteman

Depois disso, abra seu banco de dados Shotwell de backup usando o Sqliteman. Em seguida, insira isso na caixa de entrada:

SELECT id, filename, flags FROM phototable;

Pressione F9 para executar o comando. Você deve ver referências a todas as suas fotos na caixa de rolagem. Role até o final e verifique se a última foto tem um campo "sinalizadores" de "0". Isso indica que o arquivo está presente e funcionando na última vez que o Shotwell foi executado. Anote o último valor de ID. Vamos chamá-lo de "phototable_max".

Agora, exclua o comando anterior e execute este:

SELECT id, filepath, flags FROM backingphototable;

Isso mostra todas as edições que você fez. Novamente, anote o último valor de ID. Chame de "backingphototable_max".
Novamente delete o comando e execute isto:

SELECT id, name FROM eventtable;

Você verá a lista de eventos. Mais uma vez, observe o último valor. Este é "eventtable_max". Isso está ficando um pouco repetitivo, mas agora delete o comando e execute isto:

SELECT id, name FROM tagtable;

Anote o valor mais alto. "tagtable_max".

OK, agora temos os números de ID que funcionaram no Shotwell antes de quebrá-lo. Após este ponto, estou assumindo que o banco de dados funciona - ou seja, após o ponto em que você fez o backup, todas as fotos não foram marcadas como ausentes.

Hora do SQLite!

Agora, copie o novo banco de dados para o antigo.
Definitivamente, faça vários backups de seus backups . Há uma boa chance de você estragar tudo. Você não quer perder seu banco de dados Shotwell para sempre.

OK, feche o Sqliteman. É hora de algum trabalho do CLI. Aqui estou assumindo que o seu antigo banco de dados shotwell está localizado em "~ / .local / share / shotwell-old / data / photo.db" e o novo em "~ / .local / share / shotwell-new / data / photo .db "

sqlite3 ~/.local/share/shotwell-old/data/photo.db

Agora você terá um prompt do SQLite. Para isso, digite:

ATTACH "/home/sean/.local/share/shotwell-new/data/photo.db" AS new;

Não esqueça do; e obviamente substitua "sean" pelo seu nome de usuário. E sim, você tem que usar o caminho completo.

Agora podemos apenas fazer esses comandos e pronto! Você precisa substituir os valores _max pelos que você anotou anteriormente.

INSERT INTO phototable SELECT * FROM new.phototable WHERE new.phototable.id > phototable_max;
INSERT INTO backingphototable SELECT * FROM new.backingphototable WHERE new.backingphototable.id > backingphototable_max;
INSERT INTO eventtable SELECT * FROM new.eventtable WHERE new.eventtable.id > eventtable_max;
INSERT INTO tagtable SELECT * FROM new.tagtable WHERE new.tagtable.id > tagtable_max;
DELETE FROM videotable;
INSERT INTO videotable SELECT * FROM new.videotable;

O que estamos fazendo aqui é copiar todos os valores mais recentes para o antigo banco de dados de trabalho a partir da parte funcional do novo banco de dados. As duas últimas linhas excluem e copiam o vídeo, que se adapta bem quando restaura arquivos perdidos.

Em seguida, pressione Ctrl + D para fechar o interpretador sqlite3.

Agora você pode mover o arquivo photo.db para o local da Shotwell, em "~ / .local / share / shotwell / data / photo.db" e abrir o Shotwell e tudo deve funcionar! Certifique-se de ter seu disco rígido ou armazenamento externo conectado neste momento.

Eu descobri que Shotwell correu um pouco devagar uma vez que eu abri, mas acabou recarregando tudo e começou de novo.

Além disso, note que, por causa da maneira como copiamos a tabela de tags, as tags existentes aplicadas a novas fotos foram perdidas. No entanto, todas as tags novas devem sobreviver e, da mesma forma, todas as tags antigas em fotos antigas também sobreviveriam. Isso é por causa da maneira estranha como o Shotwell armazena informações de tags - cada registro de tag no banco de dados armazena quais fotos ele marca.

    
por seanlano 01.02.2014 / 00:58