Helpviewer/Bookmarks/BookmarksImporters/FirefoxImporter.py

changeset 1725
d7a3430f7cbf
parent 1719
c65aefefa2ff
child 2302
f29e9405c851
equal deleted inserted replaced
1723:6e690a8f5971 1725:d7a3430f7cbf
6 """ 6 """
7 Module implementing an importer for Firefox bookmarks. 7 Module implementing an importer for Firefox bookmarks.
8 """ 8 """
9 9
10 import os 10 import os
11 import sqlite3
11 12
12 from PyQt4.QtCore import QCoreApplication, QDate, Qt, QUrl 13 from PyQt4.QtCore import QCoreApplication, QDate, Qt, QUrl
13 from PyQt4.QtSql import QSqlDatabase, QSqlQuery
14 14
15 from ..BookmarkNode import BookmarkNode 15 from ..BookmarkNode import BookmarkNode
16 16
17 from .BookmarksImporter import BookmarksImporter 17 from .BookmarksImporter import BookmarksImporter
18 18
30 """ 30 """
31 if id == "firefox": 31 if id == "firefox":
32 if Globals.isWindowsPlatform(): 32 if Globals.isWindowsPlatform():
33 standardDir = os.path.expandvars( 33 standardDir = os.path.expandvars(
34 "%APPDATA%\\Mozilla\\Firefox\\Profiles") 34 "%APPDATA%\\Mozilla\\Firefox\\Profiles")
35 elif Globals.isMacPlatform():
36 standardDir = os.path.expanduser(
37 "~/Library/Application Support/Firefox/Profiles")
35 else: 38 else:
36 standardDir = os.path.expanduser("~/.mozilla/firefox") 39 standardDir = os.path.expanduser("~/.mozilla/firefox")
37 return ( 40 return (
38 UI.PixmapCache.getPixmap("chrome.png"), 41 UI.PixmapCache.getPixmap("chrome.png"),
39 "Mozilla Firefox", 42 "Mozilla Firefox",
83 self._error = True 86 self._error = True
84 self._errorString = self.trUtf8("File '{0}' does not exist.")\ 87 self._errorString = self.trUtf8("File '{0}' does not exist.")\
85 .format(self.__fileName) 88 .format(self.__fileName)
86 return False 89 return False
87 90
88 self.__db = QSqlDatabase.addDatabase("QSQLITE") 91 try:
89 self.__db.setDatabaseName(self.__fileName) 92 self.__db = sqlite3.connect(self.__fileName)
90 opened = self.__db.open() 93 except sqlite3.DatabaseError as err:
91
92 if not opened:
93 self._error = True 94 self._error = True
94 self._errorString = self.trUtf8("Unable to open database.\nReason: {0}")\ 95 self._errorString = self.trUtf8("Unable to open database.\nReason: {0}")\
95 .format(self.__db.lastError().text()) 96 .format(str(err))
96 return False 97 return False
97 98
98 return True 99 return True
99 100
100 def importedBookmarks(self): 101 def importedBookmarks(self):
101 """ 102 """
102 Public method to get the imported bookmarks. 103 Public method to get the imported bookmarks.
103 104
104 @return imported bookmarks (BookmarkNode) 105 @return imported bookmarks (BookmarkNode)
105 """ 106 """
106 importRootNode = BookmarkNode(BookmarkNode.Folder) 107 importRootNode = BookmarkNode(BookmarkNode.Root)
107 108
108 # step 1: build the hierarchy of bookmark folders 109 # step 1: build the hierarchy of bookmark folders
109 folders = {} 110 folders = {}
110 query = QSqlQuery(self.__db)
111 query.exec_(
112 "SELECT id, parent, title FROM moz_bookmarks WHERE type = 2 and title !=''")
113 while query.next():
114 id_ = int(query.value(0))
115 parent = int(query.value(1))
116 title = query.value(2)
117 if parent in folders:
118 folder = BookmarkNode(BookmarkNode.Folder, folders[parent])
119 else:
120 folder = BookmarkNode(BookmarkNode.Folder, importRootNode)
121 folder.title = title.replace("&", "&&")
122 folders[id_] = folder
123 111
124 query = QSqlQuery(self.__db) 112 try:
125 query.exec_( 113 cursor = self.__db.cursor()
126 "SELECT parent, title, fk, position FROM moz_bookmarks" 114 cursor.execute(
127 " WHERE type = 1 and title != '' ORDER BY position") 115 "SELECT id, parent, title FROM moz_bookmarks "
128 while query.next(): 116 "WHERE type = 2 and title !=''")
129 parent = int(query.value(0)) 117 for row in cursor:
130 title = query.value(1).replace("&", "&&") 118 id_ = row[0]
131 placesId = int(query.value(2)) 119 parent = row[1]
132 120 title = row[2]
133 query2 = QSqlQuery(self.__db) 121 if parent in folders:
134 query2.exec_("SELECT url FROM moz_places WHERE id = {0}".format(placesId)) 122 folder = BookmarkNode(BookmarkNode.Folder, folders[parent])
135 if not query2.next(): 123 else:
136 continue 124 folder = BookmarkNode(BookmarkNode.Folder, importRootNode)
137 125 folder.title = title.replace("&", "&&")
138 url = QUrl(query2.value(0)) 126 folders[id_] = folder
139 if not title or url.isEmpty() or url.scheme() in ["place", "about"]: 127 except sqlite3.DatabaseError as err:
140 continue 128 self._error = True
141 129 self._errorString = self.trUtf8("Unable to open database.\nReason: {0}")\
142 if parent in folders: 130 .format(str(err))
143 bookmark = BookmarkNode(BookmarkNode.Bookmark, folders[parent]) 131 return None
144 else:
145 bookmark = BookmarkNode(BookmarkNode.Bookmark, importRootNode)
146 bookmark.url = url.toString()
147 bookmark.title = title.replace("&", "&&")
148 132
149 if query.lastError().isValid(): 133 try:
134 cursor = self.__db.cursor()
135 cursor.execute(
136 "SELECT parent, title, fk, position FROM moz_bookmarks"
137 " WHERE type = 1 and title != '' ORDER BY position")
138 for row in cursor:
139 parent = row[0]
140 title = row[1]
141 placesId = row[2]
142
143 cursor2 = self.__db.cursor()
144 cursor2.execute(
145 "SELECT url FROM moz_places WHERE id = {0}".format(placesId))
146 row2 = cursor2.fetchone()
147 if row2:
148 url = QUrl(row2[0])
149 if not title or url.isEmpty() or url.scheme() in ["place", "about"]:
150 continue
151
152 if parent in folders:
153 bookmark = BookmarkNode(BookmarkNode.Bookmark, folders[parent])
154 else:
155 bookmark = BookmarkNode(BookmarkNode.Bookmark, importRootNode)
156 bookmark.url = url.toString()
157 bookmark.title = title.replace("&", "&&")
158 except sqlite3.DatabaseError as err:
150 self._error = True 159 self._error = True
151 self._errorString = query.lastError().text() 160 self._errorString = self.trUtf8("Unable to open database.\nReason: {0}")\
161 .format(str(err))
162 return None
152 163
164 importRootNode.setType(BookmarkNode.Folder)
153 if self._id == "firefox": 165 if self._id == "firefox":
154 importRootNode.title = self.trUtf8("Mozilla Firefox Import") 166 importRootNode.title = self.trUtf8("Mozilla Firefox Import")
155 else: 167 else:
156 importRootNode.title = self.trUtf8("Imported {0}")\ 168 importRootNode.title = self.trUtf8("Imported {0}")\
157 .format(QDate.currentDate().toString(Qt.SystemLocaleShortDate)) 169 .format(QDate.currentDate().toString(Qt.SystemLocaleShortDate))

eric ide

mercurial