Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Mac OS X] Firefox 3 où sont les bookmarks ???

12 réponses
Avatar
unbewusst.sein
comme j'ai un script Ruby qui me transforme le fichier bookmarks.html de
FF 2 en xml (via tidy) puis en base MySQL, je m'interroge sur la
pérénité du schimiliblick ;-)

où sont passés ces bookmarks avec FF 3 ?

je souhaiterais éviter un export manuel.

ils sont en quel format ? SQLite3 ???

--
Une Bévue

2 réponses

1 2
Avatar
Pierre Goiffon
SAM wrote:
Le jSon n'est pas compliqué,
c'est la lecture (humaine) de ce fichier en une ligne qui n'est pas
adaptée ;-)

A ce que j'ai compris c'est quasi du XML
(du XML en une ligne ça doit pas être beau à voir non plus)



Pas vraiment du XML.
Voir le site officiel : http://www.json.org/
Avatar
unbewusst.sein
SAM wrote:

Mazette !
Je ne te demande pas comment tu as fais (ss doute très simplement en
XMLant du ruby via le PHP qui miraculeusement active le terminal qui va
chercher sur le net qques béquilles javascript ou C ... etc ... etc)



le code Ruby qui utilise le dernier json dans "~/Library/Application
Support/Firefox/Profiles/*.default/bookmarkbackups/" (Mac OS X) :
------------------------------------------------------------------------
#! /usr/bin/env ruby

# Traitement des doublons, voir:
# fr.comp.applications.sgbd
# Message-Id:

require 'json/pure'
require "mysql"

def file_date(file)
return
File.basename(file).gsub(/^bookmarks-d{2}(d{2})-(d{2})-(d{2}).json$
/, 'màj le 3 2 1')
end
def suppress_backslash_U(txt)
txt=txt.gsub(/*U[0-9a-f]{4}/,' ').gsub(/s+/,' ')
txt=suppress_backslash_U(txt) if //===txt
return txt
end
def get_folder(json,title='Barre personnelle')
return json if json['title']&&json['title']==title
json.each do |k,v|
case(v.class.to_s)
when 'Hash':
bm=get_folder(v,title)
return bm if bm
when 'Array':
v.each do |vv|
if vv.class==Hash
bm=get_folder(vv,title)
return bm if bm
end
end
end
end
return nil
end
def insert_folders(dbh, h, pid=0)
if !UNWANTED_FOLDERS.include?(h['title'])
h['dateAdded']=h['dateAdded'] ? (h['dateAdded']/1000000).to_i :
Time.now.to_i
h['lastModified']=h['lastModified'] ?
(h['lastModified']/1000000).to_i : Time.now.to_i
h['name']=h['title'].gsub(/'/,"''")
h['parent_id']=pid
pid=insert_folder(dbh, h)
h['children'].each do |child|
case(child['type'])
when 'text/x-moz-place-container':
insert_folders(dbh, child, pid)
when 'text/x-moz-place':
insert_bookmark(dbh, child, pid)
end
end
end
end
def insert_folder(dbh, h)
stmt="INSERT INTO folders (name, parent_id, dateAdded, lastModified)
VALUES ('#{h['name']}', #{h['parent_id']}, #{h['dateAdded']},
#{h['lastModified']} ) ;"
dbh.query(stmt)
last_id=nil;
stmt="SELECT LAST_INSERT_ID();"
resÛh.query(stmt)
res.each do |row|
last_id=row[0]
end
res.free
return last_id
end
def insert_bookmark(dbh, h, fid)
if !UNWANTED_BOOKMARKS.include?(h['title'])
h['dateAdded']=h['dateAdded'] ? (h['dateAdded']/1000000).to_i :
Time.now.to_i
h['lastModified']=h['lastModified'] ?
(h['lastModified']/1000000).to_i : Time.now.to_i
h['name']=suppress_backslash_U(h['title']).gsub(/'/,"''")
stmt="INSERT INTO bookmarks (folder_id, name, url, dateAdded,
lastModified)
VALUES ( #{fid}, '#{h['name']}', '#{h['uri']}',
#{h['dateAdded']}, #{h['lastModified']} );"
dbh.query(stmt)
end
end

json_file=Dir.glob("#{ENV['HOME']}/Library/Application
Support/Firefox/Profiles/*.default/bookmarkbackups/*.json").last
puts json_file
puts file_date(json_file)
json_data=''
File.open(json_file,"r").each {|l| json_data<<l }
json = JSON.load(json_data)
UNWANTED_FOLDERS=['Classeur']
UNWANTED_BOOKMARKS=['Les plus visités','Marqués récemment','Étiquettes
récentes']
begin
# connexion au serveur MySQL
dbh = Mysql.real_connect("localhost", "user", "pass", "bookmarks_db")

# création table "folders"
dbh.query("DROP TABLE IF EXISTS folders")
dbh.query("CREATE TABLE folders
(
id int(10) unsigned NOT NULL auto_increment,
parent_id int(10) unsigned NOT NULL DEFAULT 0,
dateAdded int(10) unsigned NOT NULL DEFAULT 0,
lastModified int(10) unsigned NOT NULL DEFAULT 0,
name varchar(255) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY ( id ),
KEY id ( id)
)
")

# création table "bookmarks"
dbh.query("DROP TABLE IF EXISTS bookmarks")
dbh.query("CREATE TABLE bookmarks
(
id int(10) unsigned NOT NULL auto_increment,
folder_id int(10) unsigned NOT NULL,
name varchar(255) collate utf8_unicode_ci NOT NULL,
url varchar(255) collate utf8_unicode_ci NOT NULL,
dateAdded int(10) unsigned NOT NULL DEFAULT 0,
lastModified int(10) unsigned NOT NULL DEFAULT 0,
description varchar(2048) collate utf8_unicode_ci,
PRIMARY KEY ( id ),
KEY id ( id)
)
")

# insertions
puts
puts "insertions"
insert_folders(dbh, get_folder(json))

# delete 'file://' bookmarks
puts
puts "delete 'file://' bookmarks"
resÛh.query("SELECT * FROM bookmarks WHERE url LIKE 'file://%' ;")
urls={}
res.each do |row|
urls[row[0]]=row[3]
end
puts "Nombre de lignes renvoyées : #{res.num_rows}"
urls.each do |id,url|
qry="DELETE FROM bookmarks WHERE id = #{id} ;"
resÛh.query(qry)
puts "id = #{id}, url = #{url} deleted!"
end

# set bookmarks to lowest folder id if duplicate folder name and same
folder parent
qry="UPDATE bookmarks SET folder_id = ( SELECT min(b.id)
FROM folders a JOIN folders b ON a.parent_id = b.parent_id
AND a.name = b.name WHERE a.id = bookmarks.folder_id ) ;"
resÛh.query(qry)

# select lowest folder id if duplicate name and same folder parent
qry="SELECT * FROM folders a WHERE id != ( SELECT min(id)
FROM folders b WHERE a.parent_id = b.parent_id AND a.name b.name ) ;"
resÛh.query(qry)

# delete folders of duplicate name and same folder parent
puts
puts "delete folders of duplicate name and same folder parent"
ids={}
res.each do |row|
ids[row[4]]=row[0]
end
puts "Nombre de lignes renvoyées : #{res.num_rows}"
puts "Folder to suppress:" if ids.length>0
ids.each do |name,id|
qry="DELETE FROM folders WHERE id = #{id} ;"
resÛh.query(qry)
puts "#{name}, id = #{id} deleted!"
end


rescue Mysql::Error => e
puts "Code d'erreur : #{e.errno}"
puts "Message d'erreur : #{e.error}"
puts "SQLSTATE d'erreur : #{e.sqlstate}" if e.respond_to?("sqlstate")
ensure
# déconnexion du serveur
dbh.close if dbh
end
------------------------------------------------------------------------

QQ remarques :
- la fonction suppress_backslash_U() est utilisée pour supprimer dans
certains noms de folder|bookmark des trucs du genre :
\\\\U3044\\\\U24af

qui sont apparus au cours de l'usage de FF2, le nombre de ""
augmentant avec le temps ;

- bien sûr il faut avoir installé MySQL, le gem mysql pour ruby et le
gem json/pure pour ruby ;

- la bd générée (MySQL) est très simple : deux tables : folders et
bookmarks, facilement lisible en php ;

- changer la ligne :
def get_folder(json,title='Barre personnelle')
en accord avec le dossier à partir duquel (inclus) tu souhaites
enregistrer les bookmarks. Par exemple, pour ramener "Tous les
marque-pages", remplacer cette ligne par :
def get_folder(json,title='Tous les marque-pages')

- le script est configurable par deux constantes globales :

UNWANTED_FOLDERS=['Classeur']
UNWANTED_BOOKMARKS=['Les plus visités','Marqués récemment','Étiquettes
récentes']

--
Une Bévue
1 2