https://github.com/laurentbouleau/Exemple : Mars 10
Ok ! Noté
Merci
https://github.com/laurentbouleau/Exemple : Mars 10
Ok ! Noté
Merci
Votre affichage de la saison 2 n'est pas "cohérent" parce que vous cherchez à initialiser le champ "episode" à 2 endroits différents dans le constructeur d'Episode.
Il y a la partie "simple", de mon "cru", qui prend les informations dans le nom du fichier, au début du constructeur.
Mais vous avez maintenu votre code peu fiable dans la seconde partie du constructeur.
Résultat, l'affichage de la seconde saison déconne.
Pourquoi ne pas supprimer tout ce code fragile et le remplacer par quelques lignes simples, qui ne font pas doublon avec la première partie ?
Utilisez le débugueur pour voir concrètement le problème du champ "episode" écrasé par votre code superfétatoire.
https://github.com/laurentbouleau/Exemple : Mars 11
Ok ou pas ?
Avec :
et :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 struct Saison_Episode { friend struct Episode; std::wstring titre; std::wstring deux_points; std::wstring sous_titre; unsigned short int numero{ 1 }; };
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 void Episode::Print() { if (affichage_Print_actif) { std::wstring wstr; bool chiffre_et_point_ou_pas = Print_Titre_chiffre_et_point_ou_pas(episode); if (chiffre_et_point_ou_pas) { wstr = std::to_wstring(saison); wstr += keyColor[1] + L'x' + valuesColor; wstr += std::to_wstring(episode); wstr += keyColor[1] + L" : " + valuesColor; } wstr += keyColor[1] + titre + valuesColor; if (deux_points != L"") wstr += deux_points + keyColor[1] + sous_titre + valuesColor; if (fichier_pas_zero) { saison_episode.numero = 1; wstr += keyColor[1] + L" (" + valuesColor + std::to_wstring(duree_en_seconde / 60) + keyColor[1] + min + L')' + valuesColor; } else { saison_episode.numero++; wstr += keyColor[1] + L" [" + valuesColor + std::to_wstring(saison_episode.numero) + keyColor[1] + L']' + valuesColor; } wstr += keyColor[1] + L" : " + valuesColor; wstr += Print_Date_ou_Dates(dates_de_diffusion); // phrases if (fichier_pas_zero)//titre != L"") wstr += L"\r\n" + phrases; std::wcout << wstr << std::endl; } }
Non, vous ne simplifiez pas votre code.Ok ou pas ?
Vous gardez des bouts de code avec des noms de variables complètement abscons. (exemple, la double détermination du numéro d'épisode : dans le nom du fichier/dans le contenu du fichier)
Vous vous noyez dans votre propre difficulté.
SIMPLIFIEZ !!!
"Saison_Episode", ça veut dire quoi ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 struct Saison_Episode { friend struct Episode; std::wstring titre; std::wstring deux_points; std::wstring sous_titre; unsigned short int numero{ 1 }; };
A part une association entre une saison et un épisode, je vois pas.
Si c'était juste une association, il n'y aurait que 2 champs, une référence vers une saison et une référence vers un épisode, ce n'est pas le cas ici.
Donc c'est quoi le rôle de "Saison_Episode", ET NOMMEZ LA EN FONCTION DE CE ROLE !!!
"friend" ? vraiment ? vous n'avez pas encore à vous soucier des problèmes de visibilité/abstraction, ce "friend" n'a rien à faire là pour l'instant.
"titre" et "sous_titre" sont des noms de champs avec un "sens", mais "deux_points", c'est quoi le rapport ???
"numero", c'est ambigu, car "Saison_Episode", on ne sait pas ce que sait.
Moi, ce que je comprends, c'est qu'il y a la notion de saison, d'épisode et de diffusion d'un épisode, et je ne vous rien dans votre modèle qui encapsule une diffusion.
Avant d'essayer d'afficher des trucs avec 10 champs avec des noms à coucher dehors, commencez par "modéliser" les types d'objets de votre problématique.
Comme, par exemple :
Une "Serie" qui contient un ensemble de saisons, chaque saison contenant un ensemble d'épisodes, chaque épisode contenant un ensemble de diffusions.
C'est après, et avec le minimum de complexité que vous essayeriez de construire une fonction "Print".
"fichier_pas-zero", "Print_Titre_chiffre_et_point_ou_pas", "affichage_Print_actif" sont des exemples de ces champs/fonctions qui n'ont pas de noms qui correspondent à leur "utilité" ou sont totalement inutile.
SIMPLIFIEZ !!!
(utilisez la fonction tamplate "wstring_format" pour rendre votre code plus lisible, avec des constantes de formatage explicites, et pas truffé de concaténation de chaines redondantes )
Bonjour,
L'aphasique !!!
Numero ===> 2 et 3
Quoi faire ?
Comment faire ? Les noms ? Et les auxiliaires de vie ! Elles comprennent pas !!!"fichier_pas-zero", "Print_Titre_chiffre_et_point_ou_pas", "affichage_Print_actif" sont des exemples de ces champs/fonctions qui n'ont pas de noms qui correspondent à leur "utilité" ou sont totalement inutile.
SIMPLIFIEZ !!!
Et vous : les noms ? Expliqué-moi ? (fichier_pas-zero, Print_Titre_chiffre_et_point_ou_pas, affichage_Print_actif...) !
Merci beaucoup
L'affichage que vous avez entouré en rouge provient du passage dans la partie "else" du code qui précède.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 if (fichier_pas_zero) { saison_episode.numero = 1; wstr += keyColor[1] + L" (" + valuesColor + std::to_wstring(duree_en_seconde / 60) + keyColor[1] + min + L')' + valuesColor; } else { saison_episode.numero++; wstr += keyColor[1] + L" [" + valuesColor + std::to_wstring(saison_episode.numero) + keyColor[1] + L']' + valuesColor; }
Donc parce que le champ "fichier_pas_zero" est à Faux/false.
Malgré le nom du champ assez obscure, Visual Studio nous indique que ce champ n'est initialisé que dans le constructeur d'un Episode, quand le fichier ne contient aucune donnée.
On est dans le cas où il y a, dans le répertoire "Azertyuiop - qsdfghjklm.[2021-2023 Netflix].Manga/2021-11-02/", les fichiers "1x1.2021-07-16_08-01_.txt", "1x1.2024-03-22_.txt" et "1x1.2024-03-24.txt", en plus d'autres ne commençant pas "1x1." (donc pas le même épisode).
De ce que j'essaye de comprendre de votre nomenclature de fichiers, c'est 3 fichiers commençant par "1x1." représentent des diffusions de l'épisode 1 de la saison 1.
Les fichiers "1x1.2024-03-22_.txt" et "1x1.2024-03-24.txt" sont vides, mais comme cela semble être des (re)diffusions, le contenu aurait été le même que celui du "1x1.2021-07-16_08-01_.txt".
Techniquement, ces 3 fichiers auraient pu être "fusionnés" en un fichier nommé "1x1.2021-07-16_08-01_2024-03-22_24.txt" (si je ne me trompe pas dans ce "calcul").
Si je ne me trompe pas sur cette nomenclature, vous ne pouvez plus juste vous servir d'un chemin vers un fichier pour créer un épisode, car, ici, il y a 3 fichiers pour le même épisode.
Donc, quand vous énumérez les fichiers d'un répertoire "saison" vous devriez stocker les informations dans une structure de données adaptées, comme un dictionnaire, avec comme clé : le numéro de l'épisode.
Et une fois tous les fichiers du répertoire "saison" ont été énumérés, utilisez la structure de données contenant les informations pour créer chaque épisode avec toutes les informations qui le concerne.
Et donc, pas besoin d'un champ "fichier_pas_zero" mystérieux ni d'une horrible variable globale "saison_episode" qui récupèrent n'importe quoi, n'importe comment, n'importe quand.
FAITES SIMPLE !!!!
Si vous ne pouvez pas justifier un champ ou une variable, c'est qu'ils sont en trop, et on dégage.
Donc, vous dégagez fissa "fichier_pas_zero" et autres "saison_episode", à moins que vous sachiez précisément à quoi ils servent.
C'est vous qui devriez être à même de nous expliquer à quoi elles servent.Et vous : les noms ? Expliqué-moi ? (fichier_pas-zero, Print_Titre_chiffre_et_point_ou_pas, affichage_Print_actif...) !
"fichier_pas_zero", ça indique juste si un fichier était vide mais n'a aucun sens au niveau de l'épisode, dont les informations peuvent venir de plusieurs fichiers, donc ça ne sert à rien !
"Print_Titre_chiffre_et_point_ou_pas" "sert" à savoir s'il faut afficher la partie "numéro de saison x numéro d'épisode : " en préfixe d'un affichage, mais pourquoi ce n'est pas systématiquement affiché ? Donc s'il n'y a pas de raison, on dégage !!!
Dans les faits, ça teste si le numéro d'épisode est bien renseigné, donc on cache une erreur de programmation en amont avec du code supplémentaire qui complexifie tout. NON, c'est le problème EN AMONT qu'il faut régler et pas le cacher sous le tapis.
J'ai l'impression que beaucoup de complexité est là pour "patcher" des erreurs de programmation en amont.
"affichage_Print_actif" : comme déjà indiqué plusieurs fois, c'est un champ complètement inutile qui, en plus, est utilisé à un endroit complètement illogique, ON DEGAGE.
P.S. Utilisez "wstring_format" (avec des formats "const wstring") et les expressions régulières pour simplifier votre code !!!
Ben non !!!Techniquement, ces 3 fichiers auraient pu être "fusionnés" en un fichier nommé "1x1.2021-07-16_08-01_2024-03-22_24.txt" (si je ne me trompe pas dans ce "calcul").
Exemple :
1x1.2021-07-16_08-01_.txt1. La phrase : verbre
148Min
À la mort du duc d'Halstead, son second fils hérite de tout son patrimoine : son titre, sa maison et ses terres, mais aussi une montagne d'ennuis.1x1.2024-03-22_.txtL""C'est comme sait !!!1x1.2024-03-24.txtL""
Et :
ou1x1.2021-07-16_08-01_.txt
égal :1x1.2024-03-22_.txt
pas-à-pas
et/ou
préquel ou pas !
et/ou
préquel
???
---------------
??? Erreur ou pas ou...
---------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 void Episode::Print() { std::wstring wstr; bool chiffre_et_point_ou_pas = Print_Titre_chiffre_et_point_ou_pas(episode); if (chiffre_et_point_ou_pas) { wstr = std::to_wstring(saison) + keyColor[1] + L'x' + valuesColor + std::to_wstring(episode) + keyColor[1] + L" : " + valuesColor; } wstr += keyColor[1] + titre + valuesColor; if (deux_points != L"") wstr += deux_points + keyColor[1] + sous_titre + valuesColor; if (numero == 1) { wstr += keyColor[1] + L" (" + valuesColor + std::to_wstring(duree_en_seconde / 60) + keyColor[1] + min + L')' + valuesColor; } else { wstr += keyColor[1] + L" [" + valuesColor + std::to_wstring(numero) + keyColor[1] + L']' + valuesColor; numero++; } wstr += keyColor[1] + L" : " + valuesColor; wstr += Print_Date_ou_Dates(dates_de_diffusion); // phrases if (numero == 1)//titre != L"") wstr += L"\r\n" + phrases; std::wcout << wstr << std::endl; }
Ok !"affichage_Print_actif" : comme déjà indiqué plusieurs fois, c'est un champ complètement inutile qui, en plus, est utilisé à un endroit complètement illogique, ON DEGAGE.
---------------
https://github.com/laurentbouleau/Exemple : Mars 12
Merci vraiment
OK alors donnez-nous l'affichage attendu si vous avez ces 3 fichiers.Ben non !!!
Quel seraient les différences si vous n'aviez qu'un fichier "1x1.2021-07-16_08-01_2024-03-22_24_.txt" avec le même contenu que "1x1.2021-07-16_08-01_.txt" ?
Que signifie "concrètement" ces lignes "1x1 : [2] : 22/03/2024" et "1x1 : [2] : 24/03/2024" dans la copie d'écran de votre dernier post ?
L'apparition des chaines "[pas-à-pas]", "[préquel ou pas !]" ou encore "[préquel]" me semblent complètement arbitraires.
Pouvez-vous expliquer concrètement ce que cela veut dire et quand elles doivent apparaitre dans l'affichage ?
C'est vous qui savez à quoi devrait ressembler l'affichage à la fin, non ???? Erreur ou pas ou...
Qu'est-ce qui n'est pas conforme à vos attentes dans cette copie d'écran ?
Vous avez remplacé la constante globale "saison_episode" par le champ "numero", c'est très bien.
(vous vous en servez encore de "saison_episode" ligne 321 de serie.cpp, VIREZ-MOI CA !!!)
Mais c'est quoi la différence entre le champ "episode" et le champ "numero" ?
Pour le coup, "numero" semble un bien meilleur nom qu'"episode".
N'ayez pas des champs en trop, ça complexifie inutilement le code.
Dans le nom de fichier "1x1.2021-07-16_08-01_.txt", le deuxième 1 (entre le "x" et le "."), c'est bien le numéro de l'épisode, non ?
Par construction, il est obligatoire dans le nom du fichier mais vous vous obstinez aussi à vouloir le lire dans la première ligne du fichier, mais il n'apparait pas systématique.
Pourquoi vous prendre la tête avec le contenu du fichier alors que le nom suffit ?
Si l'on supprime le champ "episode" pour le remplacer par le champ "numero", vous pouvez simplement remplacer la ligne 208 de serie.cpp :
par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part episode = std::stoi(match[filename_numero_episode_index]);
Tout le reste du code qui manipule "numero" en écriture devrait disparaitre ou juste vérifier que le contenu du fichier est cohérent avec le nom du fichier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part numero = std::stoi(match[filename_numero_episode_index]);
Et le "return" ligne 217 de serie.cpp, c'est une connerie, faites un effort pour rendre simple votre code.
Vous avez commencé à utiliser les expressions régulières mais de manières assez maladroites, ce qui rend le code verbeux :
Voici une proposition de simplification du constructeur d'épisode (en faisant l'assertion qu'un semble chemin de fichier permet de construire correctement un objet "Episode") :
Et votre "Episode:: Print()" me semble toujours trop complexe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159 Episode::Episode(fs::path const& cheminFichier) { // ([[:digit:]]+)x([[:digit:]]{1,3})\\.(((([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})|([[:digit:]]{2})-([[:digit:]]{2})|([[:digit:]]{2})))(_?))+)(\\s(.+))? const std::wstring numero_saison_format = L"([[:digit:]]{1,2})"; // saison const std::wstring sep_numero_saison = L"x"; // x const std::wstring numero_episode_format = L"([[:digit:]]{1,3})"; // episode const std::wstring sep_episode_saison = L"\\."; //. const std::wstring date_year_month_day_format = L"([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})"; const std::wstring date_month_day_format = L"([[:digit:]]{2})-([[:digit:]]{2})"; const std::wstring date_day_format = L"([[:digit:]]{2})"; const std::wstring stream_format = L"(\\s(.+))?"; const std::wstring dates_format = L"((" + date_year_month_day_format + L"|" + date_month_day_format + L"|" + date_day_format + L")(_?))"; const int dates_full_match_index = 0; const int dates_date_year_month_day_year_index = dates_full_match_index + 3; const int dates_date_year_month_day_month_index = dates_date_year_month_day_year_index + 1; const int dates_date_year_month_day_day_index = dates_date_year_month_day_month_index + 1; const int dates_date_month_day_month_index = dates_date_year_month_day_day_index + 1; const int dates_date_month_day_day_index = dates_date_month_day_month_index + 1; const int dates_date_day_day_index = dates_date_month_day_day_index + 1; const int dates_someFlag_index = dates_date_day_day_index + 2; const std::wregex filename_format_rg{ numero_saison_format + sep_numero_saison + numero_episode_format + sep_episode_saison + L"(" + dates_format + L"+)" + stream_format }; const int filename_full_match_index = 0; const int filename_numero_saison_index = filename_full_match_index + 1; const int filename_numero_episode_index = filename_numero_saison_index + 1; const int filename_dates_index = filename_numero_episode_index + 1; const int filename_date_year_month_day_year_index = filename_dates_index + 2; const int filename_date_year_month_day_month_index = filename_date_year_month_day_year_index + 1; const int filename_date_year_month_day_day_index = filename_date_year_month_day_month_index + 1; const int filename_date_month_day_month_index = filename_date_year_month_day_day_index + 1; const int filename_date_month_day_day_index = filename_date_month_day_month_index + 1; const int filename_date_day_day_index = filename_date_month_day_day_index + 1; const int filename_someFlag_index = filename_date_day_day_index + 2; const int filename_stream_index = filename_someFlag_index + 2; auto nomFichier = cheminFichier.filename().wstring(); assert(nomFichier.length() > 0 && L"Nom de fichier Episode vide"); auto stem = cheminFichier.stem().wstring(); assert((stem.length() > 9) && L"Nom de fichier Episode trop court pour avoir au moins une date"); assert(std::isdigit(stem[0]) && L"Nom de fichier Episode ne commençant pas par un nombre"); saison = std::stoi(stem); assert((saison <= 1000) && L"x <= 1000 !!!"); assert((stem.find(L"x", 0) != std::wstring::npos) && L"Saison::afficher_Episode() : x !!!"); assert(std::regex_match(stem, filename_format_rg) && L"Le nom du fichier n'est pas valide"); std::wsmatch match; auto str = stem; std::regex_match(str, match, filename_format_rg); std::wsmatch dates_match; auto dates_str = match[filename_dates_index].str(); while (std::regex_search(dates_str, dates_match, std::wregex{ dates_format })) { if (dates_match[dates_date_year_month_day_year_index].matched) { auto year = std::stoi(dates_match[dates_date_year_month_day_year_index]); auto month = std::stoi(dates_match[dates_date_year_month_day_month_index]); auto day = std::stoi(dates_match[dates_date_year_month_day_day_index]); assert(checkyear(year)); assert(checkmonth(month)); assert(checkday(month, day, year)); DateRecord dr{ {0,0,0,day,month - 1,year - 1900} }; dates_de_diffusion.emplace_back(dr); } else if (dates_match[dates_date_month_day_month_index].matched) { assert(dates_de_diffusion.size() > 0 && L"Utilisation d'un format mois-jour sans avoir d'année déduite."); auto month = std::stoi(dates_match[dates_date_month_day_month_index]); auto day = std::stoi(dates_match[dates_date_month_day_day_index]); auto lastDateRecord = dates_de_diffusion.back(); auto last_year = lastDateRecord.date.tm_year + 1900; assert(checkmonth(month)); assert(checkday(month, day, last_year)); DateRecord dr{ {0,0,0,day,month - 1,last_year - 1900} }; dates_de_diffusion.emplace_back(dr); } else if (dates_match[dates_date_day_day_index].matched) { assert(dates_de_diffusion.size() > 0 && L"Utilisation d'un format jour sans avoir de mois et d'années déduits."); auto day = std::stoi(dates_match[dates_date_day_day_index]); auto lastDateRecord = dates_de_diffusion.back(); auto last_year = lastDateRecord.date.tm_year + 1900; auto last_month = lastDateRecord.date.tm_mon + 1; assert(checkday(last_month, day, last_year)); DateRecord dr{ {0,0,0,day,last_month - 1,last_year - 1900} }; dates_de_diffusion.emplace_back(dr); } else { assert(true && L"format de date d'épisode inconnu."); } if (dates_match[dates_someFlag_index].matched) { dates_de_diffusion.back().someFlag = true; } dates_str = dates_match.suffix().str(); } if (match[filename_stream_index].matched) { streaming = match[filename_stream_index]; } numero = std::stoi(match[filename_numero_episode_index]); std::vector<std::wstring> t = lire_fichierTxt(cheminFichier.wstring(), { L"\n" }, false); const std::wregex first_line_format_rg{ L"([[:digit:]]*)(\\.?)(.+?) ?((\\-|:) (.+))?" }; std::wsmatch first_line_match; if (std::regex_match(t[0], first_line_match, first_line_format_rg)) { if (first_line_match[1].matched && first_line_match[1].length()>0) assert(numero == std::stoi(first_line_match[1]) && L"Le numero d'épisode dans le nom du fichier et dans le fichier ne correspondent pas."); if (first_line_match[3].matched) titre = first_line_match[3]; if (first_line_match[6].matched) sous_titre = first_line_match[6]; } else { titre = t[0]; } if (t.size() > 1) { initialiser_duree(t[1]); for (auto j = 2; j < t.size(); j++) { if (j > 2 && phrases.back() != L' ') { phrases += L" "; } phrases += t[j]; } } }
Vous pouvez séparer les calculs comme je l'ai fait pour le "sous_titre" pour rendre le code encore plus lisible, sans ces satanées "+=" dans tous les coins avec des "if" abscons.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 void Episode::Print() { const std::wstring print_format = L"%d" + keyColor[1] + L'x' + valuesColor + L"%d" + keyColor[1] + L" : " + valuesColor + keyColor[1] + L"%s" + valuesColor + L"%s" + keyColor[1] + L" (" + valuesColor + L"%d" + keyColor[1] + L" min)" + valuesColor + keyColor[1] + L" : " + valuesColor + L"%s"; auto sous_titre_str = sous_titre.length() > 0 ? L" : " + keyColor[1] + sous_titre.c_str() + valuesColor : L""; std::wstring res = wstring_format(print_format, saison, numero, titre.c_str(), sous_titre_str.c_str(), duree_en_seconde / 60, Print_Date_ou_Dates(dates_de_diffusion).c_str()); if (phrases.length() > 0) res += L"\r\n" + phrases; std::wcout << res << std::endl; }
Bonjour,
C'est le même épisode que j'ai vu plusieurs fois. Donc, on ne peux pas fusionner.OK alors donnez-nous l'affichage attendu si vous avez ces 3 fichiers.
Quel seraient les différences si vous n'aviez qu'un fichier "1x1.2021-07-16_08-01_2024-03-22_24_.txt" avec le même contenu que "1x1.2021-07-16_08-01_.txt" ?
Normalement, ça devrait être [2] et [3] car c'est la 2ème et la 3ème fois que j'ai regardé cet épisode.Que signifie "concrètement" ces lignes "1x1 : [2] : 22/03/2024" et "1x1 : [2] : 24/03/2024" dans la copie d'écran de votre dernier post ?
Je me rends compte que le mot "préquel" ne signifie pas ce que je pensais, donc je vais le changer.L'apparition des chaines "[pas-à-pas]", "[préquel ou pas !]" ou encore "[préquel]" me semblent complètement arbitraires.
Pouvez-vous expliquer concrètement ce que cela veut dire et quand elles doivent apparaitre dans l'affichage ?
[pas-à-pas] veut dire que j'ai visionné l'épisode en plusieurs fois, de la date 1 à la date 2.
[préquel ou pas !] veut dire que j'ai commencé à visionner l'épisode, mais que j'ai abandonné (trop dur) – Je vais remplacer par "stop ou pas". [1x1...]
[préquel] veut dire que j'ai abandonné le visionnage de l'épisode, mais que je vais peut-être le reprendre – Je vais remplacer par "à suivre" [1x2..., 1x3... etc]
(Réponses élaborées avec l'orthophoniste)
Merci beaucoup
Ah, Ok, ce n'est pas, ou pas que des diffusions, c'est plutôt ou aussi des visionnages, c'est ça ?
Ou est-ce que les fichiers "non vide" sont des diffusions et les fichiers vides sont des visionnages ?
"dates_de_diffusion" est un champ et aussi un nom de paramètre, s'il n'y pas de "date de diffusion" mais que des dates de visionnages, vous devriez renommer ces champs et paramètres en "dates_de_visionnage", par exemple.
S'il y a les 2 notions, des dates de diffusion et des dates de visionnage, il ne faudrait pas les mélanger.
Ca veut dire qu'on n'a pas que des dates de visionnages dans les noms de fichiers, sinon, on pourrait les fusionner sans problème, on est d'accord ?C'est le même épisode que j'ai vu plusieurs fois. Donc, on ne peux pas fusionner.OK alors donnez-nous l'affichage attendu si vous avez ces 3 fichiers.
Quel seraient les différences si vous n'aviez qu'un fichier "1x1.2021-07-16_08-01_2024-03-22_24_.txt" avec le même contenu que "1x1.2021-07-16_08-01_.txt" ?
Si vous pouvez nous donner l'affichage attendu si on a ces 3 fichiers : ("1x1.2021-07-16_08-01_.txt","1x1.2024-03-22_.txt" et "1x1.2024-03-24.txt"), ça pourrait simplifier notre compréhension de vos problèmes.
Ok, ce n'est donc pas un "épisode" qu'on affiche (avec ces dates de diffusion) mais un "épisode" (avec des dates de diffusions ou pas ?) et ses dates de visionnages.Normalement, ça devrait être [2] et [3] car c'est la 2ème et la 3ème fois que j'ai regardé cet épisode.Que signifie "concrètement" ces lignes "1x1 : [2] : 22/03/2024" et "1x1 : [2] : 24/03/2024" dans la copie d'écran de votre dernier post ?
Vous ne devriez donc pas créer un "Episode" pour chacun des fichiers correspondants, mais une date de visionnage que vous stockeriez dans l'objet Episode correspondant.
Sauf erreur, vous ne pouvez pas savoir à l'avance si le fichier correspond à une ou plusieurs diffusions ou s'il correspond à un ou plusieurs visionnages, juste avec son nom, si ?
Si c'est le cas, vous ne pouvez pas construire automatiquement un Episode pour chaque fichier qui respect "le format" que vous nous avez donné.
Il faut modifier le code qui scanne les répertoires pour qu'il analyse le contenu du fichier avant de demander la création d'un Episode, ou la création d'un ensemble de dates de visionnage d'un épisode.
Heu, il serait où le premier visionnage dans ce cas ???Normalement, ça devrait être [2] et [3]
L'ordre n'est pas une information "intrinsèque" (interne) d'une date de diffusion.
Si vous stockez les dates de visionnage dans un épisode chronologiquement, dans un objet "Episode", son numéro d'ordre chronologique sera automatiquement fourni par l'objet "Episode" qui connait l'ordre du visionnage, pas la date elle-même.
Ne cherchez pas à connaitre l'ordre du visionnage au moment de la création de la date de visionnage, mais uniquement lors de l'affichage de l'Episode, qui connait TOUTES les dates de visionnage et leur ordre chronologique.
Tout ceci est lié à des dates de visionnages, pas à des dates de diffusion.[pas-à-pas] veut dire que j'ai visionné l'épisode en plusieurs fois, de la date 1 à la date 2.
[préquel ou pas !] veut dire que j'ai commencé à visionner l'épisode, mais que j'ai abandonné (trop dur) – Je vais remplacer par "stop ou pas". [1x1...]
[préquel] veut dire que j'ai abandonné le visionnage de l'épisode, mais que je vais peut-être le reprendre – Je vais remplacer par "à suivre" [1x2..., 1x3... etc]
Si les dates de diffusion "n'existent pas" et qu'il n'y a que des dates de visionnage, ces dates proviennent de plusieurs fichiers et vous ne regroupez pas les dates de visionnage provenant de plusieurs fichiers dans un seul "Episode", donc difficile de pouvoir "correctement" faire une analyse sur l'ensemble des visionnages.
Y a-t-il une notion de "séquence de visionnage" qui permet de "voir" un même épisode, une fois en une fois (séquence d'1 date de visionnage) et pour le même épisode d'avoir une autre séquence de "date de visionnage" sur plusieurs jours, par exemple ?
Si oui, il faudra implémenter ce concept de "séquence de visionnage" dans votre conception.
Bonsoir,
Compliqué a dire ! Et, oui, c'est vraiment !
Exemple : [pas-à-pas][pas-à-pas] veut dire que j'ai visionné l'épisode en plusieurs fois, de la date 1 à la date 2.
Azertyuiop - qsdfghjklm.[2021-2023 Netflix].Manga/2021-11-02/Ok ?1x1.2021-07-16_08-01_.txt1. La phrase : verbre
148Min
À la mort du duc d'Halstead, son second fils hérite de tout son patrimoine : son titre, sa maison et ses terres, mais aussi une montagne d'ennuis.1x2.2021-07-18_18_18 France 5.txtBetter Call Saul.[2015-2022]/2015-02-092. Tackle Tommy: woo woo
63 min
Les aristos et leur garde-chasse traquent une nouvelle sorte de proie. Susie embauche de l'aide pour faire le ménage, et le manoir d'Halstead reçoit une sacrée visite.1x03.2024-02-02_02.txt3. Nacho
47 min
Pour blanchir son nouveau client et sauver sa peau par la même occasion, Jimmy doit orienter la police vers une autre piste, tout aussi crédible.
Merci d'avance
Après : l'orthophoniste et moi : Mardi 02/04/2024 !
Merci
On va commencer à attaquer dans le dur et pas juste "se battre" contre la syntaxe du C++.
Il faut commencer à prendre du recul pour avoir une conception qui tienne un peu la route.
Pour cela, il faut commencer par l'expression du besoin : "Pourquoi avez-vous besoin de ce programme ?".
C'est important pour rester focus sur l'objectif.
Sans ça, on (ceux qui essayent de vous aider) n'est un peu obliger de jouer aux astrologues et essayer de deviner vos objectifs.
Si on comprend bien, l'arborescence des fichiers que votre programme "scanne", ce n'est que des "séquence de séances de visionnage" de films et de série.
et un fichier "1x1.2021-07-16_08-01_2024-03-22_24_.txt" c'est UNE séquence de séances de visionnage (sur plus de 2 ans) alors que 3 fichiers : "1x1.2021-07-16_08-01_.txt", "1x1.2024-03-22_.txt" et "1x1.2024-03-24.txt" correspondent à 3 "séquences de séances de visionnage" du même épisode mais distinctes les une des autres (la première avec des séances qui s'étendent sur 15 jours, la 2ème séquence avec une ou plusieurs sessions de visionnage mais dans la même journée, idem pour la 3ème séquence à la 2ème).
Une séquence de séances de visionnage, c'est la liste des dates où vous avez regardé un bout de l'épisode en reprenant à partir du moment de la fin de la session de visionnage d'avant, dans la même séquence.
Il y a un fichier par séquence de séances de visionnage. Mais une séquence peut avoir plusieurs séances.
Ok ???
Si c'est bien le cas, la conception serait un peu différente :
Une série contient des Saisons, des Saisons contiennent des Episodes, les épisodes contiennent plusieurs séquences de séances de visionnage, chaque séquence contient plusieurs séances de visionnage.
C'est Ok pour vous comme conception ?
Dans ce cas un fichier ne correspond pas à un épisode mais à une séquence de séances de visionnage.
Donc le code ligne 613 à 629 de serie.cpp ci-après (numéros approximatifs car j'ai fais de modification pour présenter la version "simplifié" posté hier) :
(remarquez que l'utilisation d'une expression régulière pourrait éviter d'avoir 2 fois le même code et permettrait de faire un "if" bien plus simple et clair)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 if ( (nomFichier[0] == L'1' || nomFichier[0] == L'2' || nomFichier[0] == L'3' || nomFichier[0] == L'4' || nomFichier[0] == L'5' || nomFichier[0] == L'6' || nomFichier[0] == L'7' || nomFichier[0] == L'8' || nomFichier[0] == L'9') && nomFichier[1] == L'x' ) { Creer_Episode(cheminFichier); return; } if ( (nomFichier[0] == L'1' || nomFichier[0] == L'2' || nomFichier[0] == L'3' || nomFichier[0] == L'4' || nomFichier[0] == L'5' || nomFichier[0] == L'6' || nomFichier[0] == L'7' || nomFichier[0] == L'8' || nomFichier[0] == L'9') && (std::isdigit(nomFichier[1])) && nomFichier[2] == L'x' ) { Creer_Episode(cheminFichier); return; }
On pourrait remplacer ce code avec un truc comme :
C'est un code qui ne compilera pas mais si :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 if(std::regex_match(nomFichier, std::wregex{L"([[:digit:]]{1,2})x(.)+"})) { SequenceVisionnage seq_vis{cheminFichier}; if(m_liste_episodes.existe(seq_vis.numero_episode)) { m_liste_episodes[seq_vis.numero_episode].AjouterSequenceVisionnage(seq_vis); } else { Creer_Episode(seq_vis); } }
- vous créez la classe SequenceVisionnage avec un constructeur qui prend un nom de fichier et un champ "numero_episode" contenant le numéro de l'épisode donné dans le nom du fichier,
- que vous ajoutez un champ "m_liste_episodes" dans la classe Saison capable de savoir si un épisode avec un numéro donné existe déjà (via sa fonction "existe"), d'accéder à l'épisode numéro X via l'opérateur "[]",
- que vous ajoutiez à votre classe Episode la fonction "AjouterSequenceVisionnage"
- et que "Creer_Episode" mette à jour le champ "m_liste_episodes" et prenant en entré un objet SequenceVisionnage.
En implémentant ce qu'il faut dans ces fonctions, le code compilera et fera ce qu'il faut.
Et le code n'est-il pas clair ainsi ?
Posez des questions, SVP.
Bonsoir,
Je suis fatigué ! Demain ?
Vendredi : 14h - 16h : Complexe René-Tys : La musculation (groupe handicap)
Merci
Bonsoir,
Pardon ? Ben, non !!!et un fichier "1x1.2021-07-16_08-01_2024-03-22_24_.txt" c'est UNE séquence de séances de visionnage (sur plus de 2 ans)
Ben oui !!!alors que 3 fichiers : "1x1.2021-07-16_08-01_.txt", "1x1.2024-03-22_.txt" et "1x1.2024-03-24.txt" correspondent à 3 "séquences de séances de visionnage" du même épisode mais distinctes les une des autres (la première avec des séances qui s'étendent sur 15 jours, la 2ème séquence avec une ou plusieurs sessions de visionnage mais dans la même journée, idem pour la 3ème séquence à la 2ème).
Alors à quoi correspondrait un fichier avec un nom pareil ?Pardon ? Ben, non !!!
Merci pour ces informations qui permettent de fixer un peu le cadre du projet.
Mais, je ne vois toujours pas où est mon erreur d'interprétation de la "signification" du nom du fichier.
Mes définitions :
Un épisode : Dans la terminologie des séries télévisées, le terme « épisode » désigne plus spécifiquement chacun des segments composant une série, (Wikipédia)
Une séance de visionnage : le fait de regarder pendant un certain temps un bout de film ou d'un épisode.
Une séquence de séance de visionnage : plusieurs séances de visionnage où on reprend le visionnage où on en était resté à la séance précédente (sauf pour la première séance de la séquence où on commence le visionnage du film ou de l'épisode).
Sommes-nous d'accord sur ces définitions ?
Sinon, pouvez-vous expliquer ce qui ne va pas sur ces définitions ?
Si vous êtes d'accord avec ces définitions, pouvez-vous faire les actions que je vous ai proposé (création de la classe "SequenceVisionnage", etc...) ?
Sinon, pouvez-vous expliquer pourquoi ?
Si c'est un problème avec le langage C++ ou la conception "objet", pouvez-vous nous indiquer ce qui vous bloque ?
et un fichier "1x1.2021-07-16_08-01_2024-03-22_24_.txt" c'est UNE séquence de séances de visionnage (sur plus de 2 ans)Ce fichier ne correspond à rien. Je n'ai pas utilisé ce type de nom de fichier.Alors à quoi correspondrait un fichier avec un nom pareil ?
Je suis d'accord avec vos définitions.Si vous êtes d'accord avec ces définitions, pouvez-vous faire les actions que je vous ai proposé (création de la classe "SequenceVisionnage", etc...) ?
Sinon, pouvez-vous expliquer pourquoi ?
Si c'est un problème avec le langage C++ ou la conception "objet", pouvez-vous nous indiquer ce qui vous bloque ?
Je suis d'accord pour faire les actions que vous avez demandées.
C'est très difficile pour moi de lire de longues phrases. (J'utilise le narrateur de l'ordi.)
Je voudrais le faire étape par étape.
Je vais essayer de faire la 1ère action et je vous demanderai si c'est bon, si vous en êtes d'accord.
Ensuite, je ferai la 2ème, etc.
Quand vous me faites des très longues réponses, je suis perdu.
Merci beaucoup.
(Fait avec l'aide de l'orthophoniste)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager