Skip to content
Snippets Groups Projects
Commit 8d96145d authored by Mathieu Loiseau's avatar Mathieu Loiseau
Browse files

json exports

parent 2d80b69a
No related branches found
No related tags found
No related merge requests found
......@@ -5,13 +5,59 @@ import argparse
import os, sys, os.path
import getpass
import sqlite3
import json
import re #regular expression
parser = argparse.ArgumentParser(description="Extraire les notes d'une liseuse Vivlio")
parser.add_argument("-s", "--source", help="le dossier de la liseuse", type=str, default=None)
parser.add_argument("-f","--format", help="le format d'export (JSON ou wiki)", type=str, default=None)
parser.add_argument("-d", "--destination", default=None, help="le chemin et nom du dossier d'export (un fichier par livre)", type=str)
parser.add_argument("-d", "--destination", default=".", help="le chemin et nom du dossier d'export (un fichier par livre)", type=str)
args = parser.parse_args()
def getPage(anchor):
output = re.search("page\=(\d+)",anchor)
if output is not None:
output = output.group(1)
return int(output)
class Annotation:
BM = "bookmark" #bookmark
QUOTE = "citation" #citation
NOTE = "note" #note
def __init__(self, dbString):
tmp = json.loads(dbString)
self.text = None
self.endP = None
if len(tmp)==3:
self.type = Annotation.NOTE
tmp[0].update(tmp[1])
tmp[0]["note"] = tmp[2]["text"].replace("\n","")
self.note = tmp[0]["note"]
elif len(tmp[1]) == 1:
self.type = Annotation.BM
else:
tmp[0].update(tmp[1])
self.type = Annotation.QUOTE
#TODO mistakes Crayon for a quote, quoting "crayon"
self.raw = tmp[0]
self.p = getPage(tmp[0]["anchor"])
if "begin" in tmp[0] :
self.p = getPage(tmp[0]["begin"])
if "end" in tmp[0] :
self.endP = getPage(tmp[0]["end"])
if "text" in tmp[0] :
self.text = tmp[0]["text"].replace("\n","")
def toJSON(self):
json_note = {"raw":self.raw,"type":self.type,"p":self.p}
if self.text != None :
json_note["text"] = self.text
if self.endP != None :
json_note["endP"] = self.endP
return json_note
def getSource():
print("Warning, this only works for linux systems")
basepath = "/media/"+getpass.getuser()
......@@ -33,16 +79,40 @@ def getSource():
def connect(sourceDir):
try:
path = sourceDir+'/system/config/books.db'
if not os.path.isfile(path):
raise ValueError ("Failed to connect to DB ("+path+").")
else:
conn = sqlite3.connect(path)
print("Connected to '"+path+"'.")
conn = sqlite3.connect("file://"+path+'?mode=ro', uri=True)
print("Connected to '"+path+"'.")
except (ValueError,sqlite3.Error) as e:
print (str(e))
conn = None
return conn
def retrieveData(conn):
query = "SELECT `Books`.`Title` as `title`, `Books`.`Authors` as `author`, '['||GROUP_CONCAT(`Tags`.`Val`, ',')||']' as `data` FROM `Books`, `Items`, `Tags` WHERE (`Tags`.`TagID` = 101 OR `Tags`.`TagID` = 104 OR `Tags`.`TagID` = 105) AND `Tags`.`ItemID`= `Items`.`OID` AND `Items`.`ParentID`=`Books`.`OID` GROUP BY `Items`.`OID` ORDER BY `author`, `title`;"
cur = conn.cursor()
cur.execute(query)
return cur.fetchall()
#while conn.fetchone()
def dataToJSON(data, directory):
curfile = None
for comment in data:
fileName = directory+"/"+comment[1]+"_"+comment[0]+".json"
if curfile != fileName:
if curfile != None:
JSON_store(curdata, curfile)
curfile = fileName
curdata = {"title":comment[0],"author":comment[1],"data":[]}
jj = Annotation(comment[2])
curdata["data"].append(jj.toJSON())
fileName = None
if curfile != None:
JSON_store(curdata, curfile)
def JSON_store(data, filename):
out_file = open(filename, "w")
json.dump(data, out_file, indent = 2, ensure_ascii=False)
out_file.close()
#main
if __name__ == "__main__":
if args.source == None:
......@@ -52,4 +122,7 @@ if __name__ == "__main__":
if source != None:
conn = connect(source)
if conn != None:
data = retrieveData(conn)
conn.close()
if data != None:
dataToJSON(data, args.destination)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment