3 mars 2018

Résoudre un bug des marques-pages de Firefox qui se multiplient

D'avance désolé pour les impressions d'écrans en 4K.

Peu après avoir activé la synchronisation de mon très vieux profile Firefox (que je me copie de PC en PC) vers mon "Compte Firefox", je me suis retrouvé avec un bug gênant...
- une partie de mes favoris se sont retrouvés dupliqués des milliers de fois
- des lignes "étiquettes récentes" en dizaines d'exemplaires
- parfois impossible d'ajouter un favoris par l'étoile dans la barre d'adresse (et elle pouvait même être "cochée" alors que l'URL n'avait jamais été ajoutée...)
- impossible de déplacer un marque-page d'un dossier à un autre depuis le gestionnaire de marque-pages
- impossible d'exporter les marque-pages ni en json ni en html (la fonction demande le chemin de destination mais le fichier n'est jamais créé)



Ma solution va consister à nettoyer le fichier local des favoris de Firefox pour repérer et supprimer les marque-pages qui se sont démultipliés.
Pour cela, on aura besoin de SQLite Brower (gratuit) dispo ici : https://github.com/sqlitebrowser/sqlitebrowser
Ouvrir le fichier c:\users\<user>\AppData\Roaming\Mozilla\Firefox\Profiles\<votre profile ID>\places.sqlite (par sécurité, avant de modifier le fichier, j'en ai fais une copie)



Nous allons devoir faire quelques requêtes SQL pour nettoyer, mais avant vous pouvez consulter l'onglet Browse Data et choisir la table moz_bookmarks et voir en bas le nombre d'entrées (j'en avais plus de 70 000).



Les requêtes sont à exécuter dans l'onglet Execute SQL.

La première requête consiste à lister les favoris qui existent en plusieurs exemplaires :
select count(fk) as c, fk from moz_bookmarks group by fk order by c desc



Ceci va afficher une liste avec deux colonnes, la première est le nombre d’occurrences et la seconde les ID des favoris.

Je sélectionne (en maintenant Ctrl enfoncé) toutes les cellules des ID dont l'occurrence > 50 et Ctrl+C (mes favoris bugués sont en 2600 exemplaires dans mon cas). Je colle dans Notepad++ et je fais un remplacement "\r\n" en , pour obtenir une liste d'ID séparées par virgule.



La requête suivante consiste à lister les URL des favoris que nous allons supprimer. Je les copies et j'aurai à les refaire manuellement s'ils m'intéressent toujours.
select distinct * from moz_places where id in(40,46,47,65,99,110,111,112,113,115,116,118,119,120,2516,107,108,109,114,117)
Pareil, on peut copier la colonne en résultat pour une sauvegarde.

Maintenant que notre sauvegarde est faite, la dernière requête va permettre de supprimer tous ces marques pages d'un coup :
delete from moz_bookmarks where fk in(40,46,47,65,99,110,111,112,113,115,116,118,119,120,2516,107,108,109,114,117)

Le problème n'est pas terminé car on se retrouve avec des dossiers de marque-pages qui n'ont pas été supprimés (car ils n'ont pas d'URL...). Pour cela, on va lister tous les dossiers qui possèdent le plus d'éléments (et on devrait trouver le dossier qui contient ces milliers de dossier vide) :
select count(parent) as c, parent from moz_bookmarks group by parent order by c desc

J'obtiens 2 résultats dont l'occurrence est supérieur à 1000 (ça veut dire que ces dossiers possèdent plus de 1000 enfants directs). On va supprimer tous ces enfants de type dossier (cela ne supprimera pas les favoris de ce dossier).

Une première requête pour voir ce qui va être supprimé :
select title from moz_bookmarks where parent in(11279,1529) and type=2
Une dernière requête pour supprimer pour de bon (type=2 permet de ne cibler que les dossiers).
delete from moz_bookmarks where parent in(11279,1529) and type=2



On retourne dans l'onglet Browse Data et on constate que le nombre d'entrées à bien diminué (je suis passé de 70 000 à 14 000). On valide l'écriture du fichier.



On lance Firefox pour voir. Nickel, tout fonctionne à nouveau.