|
@@ -9,59 +9,53 @@ def parse_facebook_exports_from_folder(folder_path: str) -> FacebookExport:
|
9
|
9
|
Parcourt un dossier, lit chaque fichier JSON et les fusionne dans un seul objet FacebookExport.
|
10
|
10
|
|
11
|
11
|
:param folder_path: Chemin vers le dossier contenant les fichiers JSON
|
12
|
|
- :return: Un objet FacebookExport
|
|
12
|
+ :return: Un objet FacebookExport ou None si aucun résultat trouvé
|
13
|
13
|
"""
|
14
|
|
- if not os.path.isdir(folder_path):
|
15
|
|
- raise FileNotFoundError(f"Le dossier {folder_path} n'existe pas.")
|
16
|
|
-
|
17
|
|
- json_files = [f for f in os.listdir(folder_path) if f.endswith('.json')]
|
18
|
|
-
|
19
|
|
- if not json_files:
|
20
|
|
- raise FileNotFoundError(f"Aucun fichier JSON trouvé dans le dossier {folder_path}.")
|
21
|
|
-
|
22
|
14
|
merged_facebook_export = None
|
23
|
15
|
|
24
|
|
- for file_name in json_files:
|
25
|
|
- #file_path = os.path.join(folder_path, file_name)
|
|
16
|
+ with os.scandir(folder_path) as it:
|
|
17
|
+ for entry in it:
|
|
18
|
+ if not (entry.is_file() and entry.name.endswith('.json')): continue
|
26
|
19
|
|
27
|
|
- facebook_export = parse_facebook_export(file_name)
|
|
20
|
+ facebook_export = parse_facebook_export(entry.path)
|
28
|
21
|
|
29
|
|
- if merged_facebook_export is None:
|
30
|
|
- merged_facebook_export = facebook_export
|
31
|
|
- else:
|
32
|
|
- merged_facebook_export.messages.extend(facebook_export.messages)
|
33
|
|
- merged_facebook_export.participants.update(facebook_export.participants)
|
|
22
|
+ if merged_facebook_export is None:
|
|
23
|
+ merged_facebook_export = facebook_export
|
|
24
|
+ else:
|
|
25
|
+ merged_facebook_export.messages.extend(facebook_export.messages)
|
|
26
|
+
|
|
27
|
+ if merged_facebook_export is None: return None
|
34
|
28
|
|
35
|
|
- if merged_facebook_export is None:
|
36
|
|
- raise ValueError(f"Aucun fichier valide n'a été trouvé ou parsé dans le dossier {folder_path}.")
|
|
29
|
+ merged_facebook_export.messages = sorted(merged_facebook_export.messages, key=lambda m: m.date_time)
|
|
30
|
+ merged_facebook_export.participants = sorted(merged_facebook_export.participants, key=lambda m: m.name)
|
37
|
31
|
|
38
|
32
|
return merged_facebook_export
|
39
|
33
|
|
40
|
|
-def parse_facebook_export(file_name: str) -> FacebookExport:
|
|
34
|
+def parse_facebook_export(file_path: str) -> FacebookExport:
|
41
|
35
|
"""
|
42
|
|
- Parse un fichier JSON en instance de la classe model.FacebookExport
|
|
36
|
+ Parse un fichier JSON en instance de la classe FacebookExport
|
43
|
37
|
|
44
|
|
- :param file_name: Le chemin du fichier à ouvrir
|
|
38
|
+ :param file_path: Le chemin du fichier à ouvrir
|
45
|
39
|
:return: Une instance de FacebookExport initialisée avec les données du fichier JSON
|
46
|
40
|
"""
|
47
|
|
- if not file_name.lower().endswith('.json') or not os.path.exists(file_name):
|
48
|
|
- raise ValueError(f"Le fichier {file_name} n'existe pas ou n'est pas un fichier JSON.")
|
|
41
|
+ if not file_path.lower().endswith('.json') or not os.path.exists(file_path):
|
|
42
|
+ raise ValueError(f"Le fichier {file_path} n'existe pas ou n'est pas un fichier JSON.")
|
49
|
43
|
|
50
|
44
|
try:
|
51
|
|
- json_data = read_broken_fb_json(file_name)
|
|
45
|
+ json_data = read_broken_fb_json(file_path)
|
52
|
46
|
return FacebookExport.from_dict(json_data)
|
53
|
47
|
except Exception as e:
|
54
|
48
|
raise Exception(f"Erreur lors de la conversion du JSON en FacebookExport: {str(e)}")
|
55
|
49
|
|
56
|
|
-def read_broken_fb_json(file_name: str) -> Any:
|
|
50
|
+def read_broken_fb_json(file_path: str) -> Any:
|
57
|
51
|
"""
|
58
|
52
|
Lit un fichier JSON issu de Facebook et renvoie le contenu après correction de l'encodage
|
59
|
53
|
|
60
|
|
- :param file_name: Le chemin du fichier à ouvrir
|
|
54
|
+ :param file_path: Le chemin du fichier à ouvrir
|
61
|
55
|
:return: Le contenu du fichier JSON sous forme d'objet
|
62
|
56
|
"""
|
63
|
57
|
# https://stackoverflow.com/questions/50008296/facebook-json-badly-encoded
|
64
|
|
- with open(file_name, 'rb') as f:
|
|
58
|
+ with open(file_path, 'rb') as f:
|
65
|
59
|
binary_data = f.read()
|
66
|
60
|
repaired = re.sub(
|
67
|
61
|
rb'\\u00([\da-f]{2})',
|