Ah ! Très bien ! Mais, je dors !!! Plus tard !
Ah ! Très bien ! Mais, je dors !!! Plus tard !
https://github.com/laurentbouleau/Exemple : Mars 04 (04/03/2025)
Ok !Si je comprends "bien", vous voulez que les 0 en début de numéro d'épisode ne servent que de "padding" pour que tous les numéros d'une saison est la même longueur ?
Normalement, vous devriez être capable de le faire vous-même.
Une solution à l'arrache :
Ok !
Code : Sélectionner tout - Visualiser dans une fenêtre à part numero_str = std::to_wstring(m_episode.m_saison.m_numero) + m_keyColor[1] + L'x' + m_valuesColor + ((m_episode.m_numero < 10 && m_episode.m_saison.m_nombre_episodes>10) ? L"0" : L"") + std::to_wstring(m_episode.m_numero) + m_keyColor[1] + L" : " + m_valuesColor;
Mais : serie.cpp :
Kaleidoscope et Love, Death + Robots : 0min !!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 std::wstring Serie::calcul_Duree_affichage() const { std::wstring duree_str; long minutes = (m_duree % (60 * 60)) / 60; long secondes = m_duree % 60; duree_str = L' ' + std::to_wstring(minutes) + m_keyColor[0] + m_espace3 + (minutes <= 1 ? m_labelMinuteSingulier : m_labelMinutePluriel) + m_valuesColor; return duree_str; }
Et : sans épisodes !!! (en mince...)
Vous faites toujours les mêmes erreurs.std::wstring Serie::calcul_Duree_affichage() const
Utilisez le débugueur.
Vous aviez le même problème dans la fonction "SequenceVisionnage::calcul_Duree_affichage(int numero_sequence) const".
Comparez les 2 codes.
Vous verrez que ce " % (60 * 60)" n' aucun sens si "m_duree" de serie fonctionne comme "m_duree_en_second" de SequenceVisionnage.
"(60 * 60)", c'est pour convertir des heures en secondes.
La similitude entre les 2 fonctions montre, encore une fois, qu'enlever le code d'affichage de ces classes métier permettrait une grande factorisation du code.
https://github.com/laurentbouleau/Exemple : Mars 05 (04/03/2025)
Bon, ils fonctionnent !
Pourquoi :
std::wstring Serie::calcul_Duree_affichage() const : m_duree
et
std::wstring SequenceVisionnage::calcul_Duree_affichage(int numero_sequence) const : m_duree_en_seconde
???
Merci![]()
Ne voyez-vous pas que c'est quasiment le même code et qu'il serait plus "malin" de factoriser le code ?Pourquoi :
std::wstring Serie::calcul_Duree_affichage() const : m_duree
et
std::wstring SequenceVisionnage::calcul_Duree_affichage(int numero_sequence) const : m_duree_en_seconde
Factoriser le code : fusionner les parties pour en faire un seul bloc utilisable à plusieurs endroits, en en faisant une fonction libre, par exemple : "std::wstring miseEnFormeDuree(long dureeEnSeconde, xyz)"
EDIT :
m_duree Versus m_duree_en_seconde ???
Bin c'est vous qui n'avez pas suivi les mêmes règles de nommage dans ces 2 classes.
Il faudrait donc mieux renommer le champ m_duree de la classe Serie en m_duree_en_seconde (utilisez la fonctionnalité de Visual Studio pour le faire, pas à la main, SVP) pour que cela soit plus explicite.
https://github.com/laurentbouleau/Exemple : Mars 06 (06/03/2025)
Ok !Ne voyez-vous pas que c'est quasiment le même code et qu'il serait plus "malin" de factoriser le code ?
Factoriser le code : fusionner les parties pour en faire un seul bloc utilisable à plusieurs endroits, en en faisant une fonction libre, par exemple : "std::wstring miseEnFormeDuree(long dureeEnSeconde, xyz)"
Le nom et l'ordre des paramètres de la nouvelle fonction sont perfectibles, mais vous avez compris la logique. très bien.![]()
https://github.com/laurentbouleau/Exemple : Mars 07 (06/03/2025)
serie.h
serie.cpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 struct InfosVisionnage { ... long m_NumeroSaison{}; long m_NumeroEpisode{}; bool m_Chiffres_ou_pas{ true }; ... };
serie.h :
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 InfosVisionnage::InfosVisionnage(const Saison& saison, fs::path const& m_cheminFichier) : m_saison{ saison } { ... if (file_content.size() > 0) { const std::wregex numeroPlusTitres_rg{ L"(?:(\\d)+\\.)?(.*)" }; std::wsmatch titles_match; std::regex_match(file_content[0], titles_match, numeroPlusTitres_rg); if (titles_match[1].matched) { int numeroDansFichier = std::stoi(titles_match[1]); if (numeroDansFichier != m_NumeroEpisode) { std::wstring message = L"Le fichier " + nomFichier + L" contient un numéro d'épisode différent de celui dans son nom."; OutputDebugStringW(message.c_str()); } m_Chiffres_ou_pas = true; } else { m_Chiffres_ou_pas = false; } ... }
serie.cpp :
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 struct SequenceVisionnage { SequenceVisionnage(const Episode& episode, const SequenceVisionnage& src) : m_episode{ episode }, m_titres{ src.m_titres }, m_streaming{ src.m_streaming }, m_duree_en_seconde{ src.m_duree_en_seconde }, m_resume{ src.m_resume }, m_DatesVisionnage{ src.m_DatesVisionnage }, /*m_numero{src.m_numero},*/ m_NumeroEpisode{src.m_NumeroEpisode}, m_keyColor{ src.m_keyColor }, m_valuesColor{ src.m_valuesColor }, m_labelMinuteSingulier{ src.m_labelMinuteSingulier }, m_labelMinutePluriel{ src.m_labelMinutePluriel }, m_espace3{ src.m_espace3 } , m_Chiffres_ou_pas{src.m_Chiffres_ou_pas } { }; SequenceVisionnage(const Episode& episode, const InfosVisionnage& info_vis) : m_episode{ episode }, m_titres{ info_vis.m_titres }, m_streaming{ info_vis.m_streaming }, m_duree_en_seconde{ info_vis.m_duree_en_seconde }, m_resume{ info_vis.m_resume }, m_DatesVisionnage{ info_vis.m_DatesVisionnage }, /*m_numero{info_vis.m_numero}, */m_NumeroEpisode{info_vis.m_NumeroEpisode}, m_keyColor{ info_vis.m_keyColor }, m_valuesColor{ info_vis.m_valuesColor } //, m_labelMinuteSingulier{ info_vis.m_labelMinuteSingulier }, m_labelMinutePluriel{ info_vis.m_labelMinutePluriel } , m_Chiffres_ou_pas{ info_vis.m_Chiffres_ou_pas } { }; ... long m_NumeroEpisode{ -1 }; bool m_Chiffres_ou_pas{ true }; ... };
serie.cpp :
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 void SequenceVisionnage::Print(int numero_sequence, bool hors_saison, bool chiffres_ou_pas) const { std::wstring numero_str; std::wstring titre_str; std::wstring duree_str; if (hors_saison /* && chiffres_ou_pas*/) // Je sais pas ! { if(chiffres_ou_pas) // de même ! numero_str = std::to_wstring(m_episode.m_numero) + m_keyColor[1] + L" : " + m_valuesColor; } else { if (chiffres_ou_pas) // de même ! numero_str = std::to_wstring(m_episode.m_saison.m_numero) + m_keyColor[1] + L'x' + m_valuesColor + ((m_episode.m_numero < 10 && m_episode.m_saison.m_nombre_episodes>10) ? L"0" : L"") + std::to_wstring(m_episode.m_numero) + m_keyColor[1] + L" : " + m_valuesColor; } ... }
Ok ou pas ! La question ? Pouvez-vous corriger ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void Episode::Print(bool hors_saison) { int numero_sequence = 1; for (const auto& sequence : m_liste_sequence_visionnages_ordonnee_chronologiquement) { //sequence.Print(numero_sequence, hors_saison); sequence.Print(numero_sequence, hors_saison, m_liste_sequence_visionnages_ordonnee_chronologiquement[0].m_Chiffres_ou_pas); numero_sequence++; } }
------------------------------------------
Et :
en
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 std::wstring m_espace1{ L" " }; std::wstring m_espace2{ L" " }; std::wstring m_espace3{ L" " };
std::vector<std::wstring>space {L" ", L" ", L" "} : ok ou pas ?
------------------------------------------
Et :
Matomo <===> https://www.b-lolo.fr : ok !
Matomo <=/=> https://github.com/laurentbouleau
Gratuit : Matomo
Par contre : https://www.b-lolo.fr (WordPress : https://wordpress.com/)
Merci![]()
Je ne suis pas convaincu par votre ajout.
Le nom n'est pas clair, surtout pour un booléen.
Une variable booléenne devrait être un truc de la forme "Estxxx". Votre "Chiffres_ou_pas", c'est "EstChiffre" ou "EstPasChiffre" ?
C'est pas clair.
En plus, c'est encore lié à un machin d'affichage, ce qui n'a rien à foutre dans une classe métier.
S'il y a une logique à garder cette information dans l'objet, il doit avoir un sens bien plus intrinsèque que juste 'j'affiche un truc, ou j'affiche pas un truc".
Une information comme, "le numéro d'épisode est fiable" ou "le numéro d'épisode n'est pas fiable".
Pourquoi ne pas stocker le numéro trouvé dans le nom du fichier ET le numéro trouvé dans le contenu du fichier ?
Ainsi, la classe métier a les informations "nécessaires".
C'est à l'affichage que la manière d'afficher le fait que ces 2 données ne sont pas cohérentes incombe. Mais ne polluez pas votre classe SequenceVisionnage avec des champs aux noms cryptiques.
Et si on décortique la logique implémentée, elle n'a pas de sens "évident".
On affiche le numéro de l'épisode quand on affiche une séquence de visionnage si :
Le contenu du fichier est vide
ou
si la première ligne du fichier respecte L"(?\\d)+\\.)?(.*)"
Donc, on affiche le numéro d'épisode même si le numéro dans le nom du fichier et celui dans la première ligne du fichier ne correspondent pas.
C'est pas logique pour moi.
EXPLIQUEZ EN FRANCAIS LA "LOGIQUE" DE VOTRE AFFICHAGE !!!
Pour moi, elle n'a pas de sens.
Et ça encore moins de sens quand, en fait, ce n'est pas dans le cadre d'une séquence de visionnage que la décision est prise, mais dans le cadre de la première séquence de visionnage de l'épisode qui est propagé à l'ensemble des séquences de cet épisode.
C'est peut-être clair dans votre tête mais ce n'est clairement pas le cas dans le code que vous avez pondu.
En résumé, vous complexifiez atrocement votre code pour un bidule abscons qui semble un détail "à la con".
C'est le genre de chose qu'on fait, peut-être, mais à la toute fin du projet.
Ah !!! Ok !!! AprèsJe ne suis pas convaincu par votre ajout.
Le nom n'est pas clair, surtout pour un booléen.
Une variable booléenne devrait être un truc de la forme "Estxxx". Votre "Chiffres_ou_pas", c'est "EstChiffre" ou "EstPasChiffre" ?
...
En résumé, vous complexifiez atrocement votre code pour un bidule abscons qui semble un détail "à la con".
C'est le genre de chose qu'on fait, peut-être, mais à la toute fin du projet.
Mais :
https://github.com/laurentbouleau/Exemple : Mars 08 (07/03/2025)
===> std::vector<std::wstring>m_spaces{ L" ", L" ", L" " };
Comme faire ?
Merci![]()
Vous ne voyez pas l'absurdité de la situation ?Ah !!! Ok !!! AprèsJe ne suis pas convaincu par votre ajout.
Le nom n'est pas clair, surtout pour un booléen.
Une variable booléenne devrait être un truc de la forme "Estxxx". Votre "Chiffres_ou_pas", c'est "EstChiffre" ou "EstPasChiffre" ?
...
En résumé, vous complexifiez atrocement votre code pour un bidule abscons qui semble un détail "à la con".
C'est le genre de chose qu'on fait, peut-être, mais à la toute fin du projet.
Vous construisez des usines à gaz sur usine à gaz jusqu'à ce que cela vous pête à la figure.
Non, vous vous plantez complètement de priorité.
Il faut appliquer le principe KISS : Keep It Simple and Stupid.
Si vous ne pouvez pas correctement me justifier cette cochonnerie, dégagez-moi cette "merde", maintenant.
Très bof.std::vector<std::wstring>space {L" ", L" ", L" "} : ok ou pas ?
C'est mieux que 3 champs à la con.
Mais le fait qu'il doit avoir 3 et uniquement 3 machins "spaces", c'est perdu car un std::vector, c'est un nombre arbitraire de valeurs.
Comme utilisé dans le constructeur de "AffichagePersonnalisation", un "std::tuple<std::wstring, std::wstring, std::wstring>", c'est bien plus "safe" et "correct".
Vous êtes bien gentil avec cette déclaration, mais elle est où l'implémentation ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 class AffichagePersonnalisation { public: AffichagePersonnalisation() {}; /*AffichagePersonnalisation(std::tuple<std::wstring, std::wstring, std::wstring> espaces, std::pair<std::wstring, std::wstring> labelsHeure, std::pair<std::wstring, std::wstring> labelsMinute) : m_espace1{ std::get<0>(espaces) }, m_espace2{ std::get<1>(espaces) }, m_espace3{ std::get<2>(espaces) }, m_labelsHeure{ labelsHeure }, m_labelsMinute{ labelsMinute } { };*/ AffichagePersonnalisation(std::vector<std::wstring>m_spaces, std::pair<std::wstring, std::wstring> labelsHeure, std::pair<std::wstring, std::wstring> labelsMinute); ...
Commencez par enfin m'écouter, dégagez le code d'affichage des classes métiers.===> std::vector<std::wstring>m_spaces{ L" ", L" ", L" " };
Comme faire ?
Ainsi, si votre classe "AffichagePersonnalisation" aurait un sens, ce ne serait que comme paramètre de fonctions libres en charge des affichages, donc pas de prise de gueule avec la règle des 5.
Séries :Une information comme, "le numéro d'épisode est fiable" ou "le numéro d'épisode n'est pas fiable".
https://www.allocine.fr/series/fiche.../saison-36426/
S03E13 - La cité où tout a commencé
et
https://www3.stage.netflix.com/fr/title/70299043
50. La cité où tout a commencé
Alors, comment faire ?
Le rapport ???
J'ai déjà signalé que le scapping de site Internet est casse-gueule et qu'il faudrait changer de source de données.
Mais je ne vois pas le rapport entre ces pages Web et votre atavisme à mettre des noms abscons avec des concepts peu explicites.
Comment faire quoi ?Alors, comment faire ?
Vous voulez bêtement avoir le même affichage ???
Vous avez des sources de données différentes et qui même dans une seule source peut ne pas respecter une règle quelconque.
Implémentez vos règles et laissez les conneries marketing des autres à l'extérieur de votre projet.
https://github.com/laurentbouleau/Exemple : Mars 09 (08/03/2025)
Avec : L'Attaque des Titans.[2013- Crunchyroll].Manga
Comme faire ??? Et le métier : j'en sais rien !!!Pourquoi ne pas stocker le numéro trouvé dans le nom du fichier ET le numéro trouvé dans le contenu du fichier ?
Ainsi, la classe métier a les informations "nécessaires".
C'est à l'affichage que la manière d'afficher le fait que ces 2 données ne sont pas cohérentes incombe. Mais ne polluez pas votre classe SequenceVisionnage avec des champs aux noms cryptiques.
Et si on décortique la logique implémentée, elle n'a pas de sens "évident".
On affiche le numéro de l'épisode quand on affiche une séquence de visionnage si :
Le contenu du fichier est vide
ou
si la première ligne du fichier respecte L"(?\\d)+\\.)?(.*)"
Donc, on affiche le numéro d'épisode même si le numéro dans le nom du fichier et celui dans la première ligne du fichier ne correspondent pas.
C'est pas logique pour moi.
EXPLIQUEZ EN FRANCAIS LA "LOGIQUE" DE VOTRE AFFICHAGE !!!
Pour moi, elle n'a pas de sens.
Et ça encore moins de sens quand, en fait, ce n'est pas dans le cadre d'une séquence de visionnage que la décision est prise, mais dans le cadre de la première séquence de visionnage de l'épisode qui est propagé à l'ensemble des séquences de cet épisode.
C'est peut-être clair dans votre tête mais ce n'est clairement pas le cas dans le code que vous avez pondu.
???Commencez par enfin m'écouter, dégagez le code d'affichage des classes métiers.
Et : InfosVisionnage::InfosVisionnage(const Saison& saison, fs::path const& m_cheminFichier) : m_saison{ saison }
???
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 if (file_content.size() > 0) { const std::wregex numeroPlusTitres_rg{ L"(?:(\\d)+\\.)?(.*)" }; std::wsmatch titles_match; std::regex_match(file_content[0], titles_match, numeroPlusTitres_rg); if (titles_match[1].matched) { //int numeroDansFichier = std::stoi(titles_match[1]); long numeroDansFichier = std::stoi(titles_match[1]); if (numeroDansFichier != m_NumeroEpisode) { //std::wstring message = L"Le fichier " + nomFichier + L" contient un numéro d'épisode différent de celui dans son nom."; //OutputDebugStringW(message.c_str()); m_numero = numeroDansFichier; } else { m_numero = m_NumeroEpisode; } } else { m_numero = -1; }
Merci![]()
Je suis crevé !!!
Alors, comment faire ?
Merci beaucoupOk, vous êtes "satisfait" du résultat ?
Si oui, il faut maintenant que vous nettoyez vos classes métier des machins qui n'ont rien à y faire, comme l'affichage.
Commencez par ajouter la déclaration d'une fonction libre comme la ligne suivante dans "serie.h" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
std::wostream& PrintSerieOnOutstream(/*const*/ Serie& serie, std::wostream& out);
Et les lignes suivantes dans "serie.cpp":
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Remplacer dans "Exemple.cpp" la ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 std::wostream& PrintSerieOnOutstream(/*const*/ Serie& serie, std::wostream& out) { serie.Print(); return out; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Par:
Code : Sélectionner tout - Visualiser dans une fenêtre à part serie.Print();
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Après, il faudra remplacer "serie.Print()" par un code "externe" à la classe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part PrintSerieOnOutstream(serie, std::wcout);
Puis décommenter les "const" pour que la fonction libre est une signature "correcte".
Et ainsi de suite avec les autres classes métier![]()
https://github.com/laurentbouleau/Exemple : Mars 10 (09/03/2025)
Et : L'Attaque des Titans.[2013- Crunchyroll].Manga : Mars 10 (09/03/2025)
Ok !Ok, vous êtes "satisfait" du résultat ?
Si oui, il faut maintenant que vous nettoyez vos classes métier des machins qui n'ont rien à y faire, comme l'affichage.
...
Par:
Après, il faudra remplacer "serie.Print()" par un code "externe" à la classe.
Puis décommenter les "const" pour que la fonction libre est une signature "correcte".
Et ainsi de suite avec les autres classes métier
Alors ?
Merci vraiment![]()
C'est pourtant clair.
Ligne 33 de serie.h :
Comment le compilateur sait ce que veut dire "Serie" à ce moment de l'analyse du fichier ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::wostream& PrintSerieOnOutstream(/*const*/ Serie& serie, std::wostream& out);
C'est ligne 40 qu'il commencerait à savoir :
Mais c'est trop tard !!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part class Serie;
Mettez cette ligne "std::wostream& PrintSerieOnOutstream(/*const*/ Serie& serie, std::wostream& out);" après la ligne 377, pour que cette fonction libre reste à côté de la déclaration de la classe "Serie", mais APRES.
Comprenez et corrigez la première erreur, etc...
Vous avez créé 7 versions différentes du dépôt GitHub, juste pour ajouter et supprimer ces fichiers sans jamais chercher à comprendre et corriger le problème.Et : L'Attaque des Titans.[2013- Crunchyroll].Manga : Mars 10 (09/03/2025)
C'est pas en mettant la tête dans le sol, comme une autruche, que vous allez corriger le problème.
Votre programme crashe à la ligne 208 de "serie.cpp" : "m_NumeroEpisode = std::stoi(match[filename_numero_episode_index]);" dans le constructeur "InfosVisionnage::InfosVisionnage(const Saison& saison, fs::path const& m_cheminFichier)" parce que la variable "match" initialisée ligne 134 de "serie.cpp" :
est aux fraises.
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::regex_match(str, match, filename_format_rg);
Sachant que les lignes 136-137 :
Donc le cas où tout ou partie du nom du fichier ne correspond pas au format attendu est déjà pris en compte.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if (match[filename_numero_saison_index].matched) m_NumeroSaison = std::stoi(match[filename_numero_saison_index]);
Alors pourquoi croire ligne 208 que le nom du fichier contient toujours le "filename_numero_episode_index" mais pas forcément le "filename_numero_saison_index" ???
Pourquoi ces 2 lignes sont si éloignées d'abord ? Faites des fonctions courtes et simple, pas ces usines à gaz.
Vous vous retrouvez dans cette situation complexe parce que ligne 724 de "serie.cpp" :
Pourquoi l'expression régulière ici n'est pas la même que dans le constructeur d'"InfosVisionnage" ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part if (std::regex_match(nomFichier, std::wregex{ L"([[:digit:]]{1,2})x(.)+" }))
Résultat de cette incohérence, le fichier ".\L'Attaque des Titans.[2013- Crunchyroll].Manga\2013-04-06\1x02.2017.04-29.txt" passe le test de la ligne 724 mais plante l'initialisation ligne 134.
Soit vous corrigez le nom du fichier, soit vous "corrigez" l'expression régulière :
(Mais, bon, c'est pas très "logique" comme format de nom de fichier)
Code : Sélectionner tout - Visualiser dans une fenêtre à part const std::wstring date_year_month_day_format = L"([[:digit:]]{4})(?:-|\\.)([[:digit:]]{2})-([[:digit:]]{2})";
Ok pour ce diagramme, en début de projet, quand vous n'aviez pas des dizaines et des dizaines de champs pour customiser l'affichage de vos séries et films.
Et la "Console", ici, ce n'est pas forcement "std::wout", pour un affichage complexe, mais une console "technique", pour du débogage, car elle n'a pas le niveau d'abstraction pour "comprendre" ce qu'est un film ou une série.
Vous avez émis le souhait de pouvoir utiliser une interface graphique à la place d'une console et vous avez atrocement complexifié votre affichage, il faut donc séparer l'affichage du classe Film et Serie pour qu'elles restent gérables.
J'ai quand même dit que c'était mieux que les 3 champs à la con.Très bof.std::vector<std::wstring>space {L" ", L" ", L" "} : ok ou pas ?
C'est mieux que 3 champs à la con.
Alors pourquoi être revenu au "3 champs à la con" ???
J'avais interprété cela comme un format différent en fonction de la source des données : Allociné ou Netflix.S03E13 - La cité où tout a commencé
...
50. La cité où tout a commencé
...
Mais la nature de la donnée est différente.
13, c'est le numéro de l'épisode dans la saison, 50, c'est le numéro de l'épisode dans la série.
Renommez le champ "m_NumeroEpisode" en "m_NumeroEpisodeDansSaison" et "m_numero" en "m_NumeroEpisodeDansSerie" dans les classes qui vont bien.
Et si le format du texte dans le fichier respect la convention "Netflix" :
Nommez correctement les choses, SVP.
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 (file_content.size() > 0) { const std::wregex numeroPlusTitres_rg{ L"(?:(\\d)+\\.)?(.*)" }; std::wsmatch titles_match; std::regex_match(file_content[0], titles_match, numeroPlusTitres_rg); if (titles_match[1].matched) { m_NumeroEpisodeDansSerie = std::stoi(titles_match[1]); } std::wstring titres = titles_match[2]; trim(titres); ... }
Après ces modifications, vous allez vous prendre des craches dans la figure mais vous devriez être capable de voir leurs causes avec le débogueur.
https://github.com/laurentbouleau/Exemple : Mars 11 (10/03/2025)
L'Attaque des Titans :
1x02.2017-04-29.txtOk !
et
2x10.2024-12-13.txt
Pourquoi ??? Pouvez-vous expliquer ?Vous avez créé 7 versions différentes du dépôt GitHub, juste pour ajouter et supprimer ces fichiers sans jamais chercher à comprendre et corriger le problème.
C'est pas en mettant la tête dans le sol, comme une autruche, que vous allez corriger le problème.
Et problème :
J'ai oublié !!!
Merci![]()
C'est juste un constat, vous avez fait 7+2 versions dans GitHub, juste pour ajouter ou supprimer la totalité des fichiers du répertoire contenant les fichiers pour cette série.Pourquoi ??? Pouvez-vous expliquer ?
Alors que soit la modification de nom d'un seul fichier ou la "correction" d'une expression régulière aurait suffi.
Vous avez choisi de modifier/corriger les noms de 2 fichiers, ok, mais pourquoi supprimer et ajouter tous ces fichiers ?
Comme vous ne commentez pas vos checkin/push, c'est compliqué de comprendre ce qui a été corrigé.
Mes remarques sur l'usage incohérent des expressions régulières reste d'actualité, même si vous n'avez pas à les "corriger/étendre".
C'est quoi le problème ?Et problème :
Les espaces dans la formulation du temps en minutes ?
Vous avez déjà la classe "AffichagePersonnalisation" qui regroupe les informations de mise en forme de l'affichage.
Ajouter un paramètre de ce type à la fonction "PrintSerieOnOutstream", et passer le de proche en proche jusqu'à l'endroit où ces informations sont utiles.
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::wostream& PrintSerieOnOutstream(/*const*/ Serie& serie, const AffichagePersonnalisation& perso, std::wostream& out);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 std::wostream& PrintSerieOnOutstream(/*const*/ Serie& serie, const AffichagePersonnalisation& perso, std::wostream& out) { serie.Print(perso); return out; }etc...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 void Serie::Print(const AffichagePersonnalisation& perso) {...}
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 void SequenceVisionnage::Print(int numero_sequence, bool hors_saison, const AffichagePersonnalisation& perso) const { std::wstring numero_str; std::wstring titre_str; std::wstring duree_str; if (hors_saison) { numero_str = std::to_wstring(m_episode.m_numero) + perso.m_keyColor[1] + L" : " + perso.m_valuesColor; } else { numero_str = std::to_wstring(m_episode.m_saison.m_numero) + perso.m_keyColor[1] + L'x' + perso.m_valuesColor + ((m_episode.m_numero < 10 && m_episode.m_saison.m_nombre_episodes>10) ? L"0" : L"") + std::to_wstring(m_episode.m_numero) + perso.m_keyColor[1] + L" : " + perso.m_valuesColor; } assert((m_titres.size() > 0 && m_titres[0].size() > 0) || numero_sequence > 1); std::vector<std::wstring> titres = m_titres; if (m_titres.size() == 0 || (m_titres.size() == 1 && m_titres[0].size() == 0)) { titres = m_episode.m_liste_sequence_visionnages_ordonnee_chronologiquement[0].m_titres; } std::vector<std::wstring> titre_prefixe_list{ perso.m_keyColor[1] , perso.m_valuesColor }; std::wstring titre_prefixe = titre_prefixe_list[0]; unsigned int titre_prefixe_index = 0; for (auto& titre : titres) { titre_str += titre_prefixe_list[titre_prefixe_index] + titre; titre_prefixe_index = ((titre_prefixe_index + 1) % titre_prefixe_list.size()); } if (titre_str.size() > 0) titre_str += perso.m_valuesColor; duree_str = calcul_Duree_affichage(numero_sequence,perso); std::wstring dates_str = perso.m_keyColor[1] + L" : " + perso.m_valuesColor + Print_Dates_de_visionnage(); std::wstring resume_str; if (numero_sequence == 1) { resume_str += L"\r\n"; for (auto r : m_resume) resume_str += r; } std::wcout << numero_str << titre_str << duree_str << dates_str << resume_str << L"\r\n"; }
Pardon, mais (attention) :
Azertyuiop £££.[2024].Mini-série
Azertyuiop £££.[2024-].Mini-série : ok !
L'Attaque des Titans.[2013- Crunchyroll].Manga : Problème !!! Hors saison !!!
Et :
blablabla [2024- sur -]
Merci![]()
Partager