[C++/C#] Suivre une chaîne YouTube ou RealityGaming grâce au flux RSS !

  • Auteur de la discussion delete221380
  • Créé le
D

delete221380

1406845428-social23.png



Hello les premium, c'est DEVR0 GTP, aujourd'hui je vous propose un petit tutoriel assez sympa
qui va consister à vous montrer comment suivre une Chaîne YouTube avec les flux RSS dans
une application Windows (C#.Net et C++)

Le tutoriel est assez simple à réaliser, je vais vous montrer l'exemple pour suivre UNE
chaîne en particulier, vous pouvez vous même améliorer le système pour pouvoir suivre
plusieurs Chaîne en même temps.
Je rappel aussi que c'est une substitution a la page d'abonnement YouTube, mais peut être
utiles si on à pas envie de ré-ouvrir son navigateur et si on change de compte Google (pas
besoin de rajouter toutes les chaînes)

Je vous montre un exemple basique, sachez que vous pouvez créer un système
bien plus complexe ;)

Avant de commencé je tient à précisé que ce tutoriel s'adresse quand même
a des personnes ayant des bases solides dans ce domaines ;)


separator_line.png


Sommaire du tutoriel
  • Création du projet, ajout des composants
  • Ajouter des flux important du Web
  • Ajouter des catégorie de flux
  • Ajouter des flux personnels

separator_line.png


Ce qu'il vous faudra pour réaliser ce tutoriel

  • Visual Studio ou Visual C# ou Visual C++
  • Quelques connaissances quand même
  • Un cerveau ? :trollface: U MAD


1406845428-machine2.png



separator_line.png


Créations du lecteur, ajout des composants


[TABS]
[TAB=Visual Studio, Visual C#]

Comme à votre habitude, vous créer un nouveau Projet C#
Vous allez donc arriver sur un Formulaire Windows Vide, jusque là tout est bon

Une fois sur votre formulaire il va nous falloir plusieurs composant qui sont
- Une listView
- Un TreeView
- Un WebBrowser
- 3 toolStrip
- Un StatusStrip
- Un Panel
- Un ImageList (pour obtenir les icônes dans la listView)
- Un contextMenuStrip (parce qu'on est des génie :trollface: )

Une fois ceci fait, votre Formulaire Windows devrais ressemblé à ceci :

1406833536-tuto.png


L'ajout des composants sur notre Form est terminer

[/TAB]
[TAB=Visual Studio, Visual C++]

Un tutoriel complet expliquant comment créer un Formulaire Windows VC++ à été fait ici

Pour l'ajout des composants, regarder dans le tableau C# c'est identique (seul le code changera)

[/TAB]
[/TABS]


separator_line.png


Le code de l'application pour obtenir les flux


[TABS]
[TAB=Visual Studio version C# ou Visual C#]

Ajouter une utilisation d'espace de nom

Code:
using System.Xml;
using RSSReader;

Ajouter le .dll RSSReader que j'ai créer tout spécialement pour vous,
une fois ici, on va déclaré une nouvelle instance, donc allez dans

Code:
public partial class Form1 : Form
    {
       RSSFlux F;
    }

Une fois ici, il va falloir créer une fonction pour la lecture RSS (dépendante de la bibliothèque)

Code:
void Read_Rss(string flux)
        {

            //Effacer l'ancienne Affichage tout d'abord
            listView_flux1.Clear();//Nom de votre listView
            this.listView_flux1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.columnHeader1 });//Nom de votre ListView églament

            //Analyse de la Flux Rss "Document Xml"
            XmlDocument xml = new XmlDocument();
            try
            {
                // lecture du Flux rss
                xml.Load(flux);

                XmlNodeList noeud = null;
                XmlNodeList noeud_chanel = null;
                noeud_chanel = xml.DocumentElement.GetElementsByTagName("channel");
                foreach (XmlNode xmlnod in noeud_chanel)
                {
                    string channel;
                    channel = "Titre";
                    foreach (XmlNode xmlnod2 in xmlnod.ChildNodes)
                    {
                        if (xmlnod2.LocalName == "title")
                        {
                            channel = xmlnod2.InnerText;
                            this.columnHeader1.Text = channel;
                        }
                    }
                }

                noeud = xml.DocumentElement.GetElementsByTagName("item");

                // pour chaque "item"
                bool premier = true;
                foreach (XmlNode node in noeud)
                {
                    string title, description, link, date;
                    title = "Sans Titre";
                    description = "Sans Description";
                    link = "Aucun Lien";
                    date = "Inconnu";
                    //Parcourir tous les Items
                    // pour chaque balise fille de "item"
                    foreach (XmlNode noeud2 in node.ChildNodes)
                    {
                        if (noeud2.LocalName == "link")
                        {
                            link = noeud2.InnerText;
                        }
                        else if (noeud2.LocalName == "title")
                        {
                            title = noeud2.InnerText;
                            //Ajouter le titre dans  la liste Box
                            listView_flux1.Items.Add(title,4);

                            //columnHeader2.ListView.Items.Add(title);

                        }
                        //Date de publication
                        else if (noeud2.LocalName == "pubDate")
                        {
                            date = noeud2.InnerText;



                        }
                        else if (noeud2.LocalName == "description")
                        {
                            if (premier == true)
                            {
                                description = noeud2.InnerText;
                                //richTextBox_flux.Text ="TITRE :  " + title + "\n" + "LIEN :  " + link + "\n\n\n" + description;
                                //premier=false;
                            }
                        }

                    }


                    if (premier == true)
                    {
                        //richTextBox_flux.Text = "TITRE :  " + title + "\n" + "LIEN :  " + link + "\n\n\n" + description;
                        premier = false;
                        webBrowser1.DocumentText = "<html><head><h1><A href=" + link + ">" + title + "</A></h1><P><STRONG><FONT face=Bell MT>Date de publication: " + date + "</FONT></STRONG></P><p>" + description + "</p><body></body></head></html>";

                    }

                    Look.Text = "Looking into ["+flux_encour.GetCategorie()+"] Name:["+flux_encour.GetFlux_name()+"] Url:["+flux_encour.GetUrl()+"]";//Look est le nom du label de mon statusStrip

                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erreyr de chargement du flux " + flux,MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
            }




        }

Vous devriez avoir des erreurs pour flux_encour normalement, c'est normal
on va devoir créer une classe ;) donc pour ce faire, faite Projet > Ajouter nouvel élément
> Classe

Une fois dans l'éditeur de classe, vous devrez ajouter ce code :

Code:
public string categorie;
        public string flux_name;
        public string url;
        public string[] tab_categorie_names;
        public Cflux() { }

        public Cflux(string c_categorie, string c_flux_name, string c_url)
        {
            categorie = c_categorie;
            flux_name = c_flux_name;
            url = c_url;
        }
        public Cflux(string c_categorie, string c_flux_name, string c_url, string[] c_tab_categorie_names)
        {
            categorie = c_categorie;
            flux_name = c_flux_name;
            url = c_url;
            tab_categorie_names = c_tab_categorie_names;


        }

        //Getteurs et Setteurs
        public string GetCategorie()
        { return this.categorie; }
        public void SetCategorie(string c_categorie)
        { categorie = c_categorie; }

        public string GetFlux_name()
        { return this.flux_name; }
        public void SetFlux_name(string c_flux_name)
        { flux_name = c_flux_name; }

        public string GetUrl()
        { return this.url; }
        public void SetUrl(string c_url)
        { url = c_url; }

        public string[] GetCategories_tab()
        { return this.tab_categorie_names; }
        public void SetCategories_tab(string[] c_tab_categorie_names)
        { tab_categorie_names = c_tab_categorie_names; }

Une fois la classe créer, on va devoir déclaré une nouvel instance
comme tout à l'heure dans Public Partial Class Form : Form
Code:
{
Cflux flux_encour = new Cflux("","","");
}

Déjà là nous avons fait le plus compliquer je pense ;)

Passons maintenant au code du bouton qui va récupéré le flux
en fonction de l'URL
Double cliquez sur votre bouton
Code:
flux_encour = new Cflux("Temporaire", "Temporaire", toolStripTextBox1.Text);//la textBox de l'URL
            Read_Rss(toolStripTextBox1.Text);//idem

Maintenant on va faire en sorte que lorsqu'on choisira un autre flux
la lecture de celui-ci ce fera automatiquement dans le WebBrowser en-dessous

Pour cela, allez dans les événements de la ListView
et chercher l'événement (Click)

Une fois dans l'événement _Click générer par le concepteur vous allez
pouvoir insérer le code suivant
Code:
string titre_flux = listView_flux1.SelectedItems[0].Text;
            listView_flux1.SelectedItems[0].ImageIndex = 3;



            XmlDocument xml = new XmlDocument();
            try
            {
                // lecture du rss
                xml.Load(flux_encour.GetUrl());
                // xml.Load("c:/rss.xml");

                XmlNodeList noeud = null;
                noeud = xml.DocumentElement.GetElementsByTagName("item");



                foreach (XmlNode node in noeud)
                {

                    string title, description, link, date;
                    title = "Sans Titre";
                    description = "Sans Description";
                    link = "Aucun Lien";
                    date = "Inconnu";
                    //bool trouver_description = false;
                    bool trouver_titre = false;
                    // pour chaque "item"

                    // pour chaque balise fille de "item"
                    foreach (XmlNode noeud2 in node.ChildNodes)
                    {
                        if (noeud2.LocalName == "title")
                        {
                            title = noeud2.InnerText;
                            if (title == titre_flux)
                            {
                                trouver_titre = true;
                            }
                            else
                            {
                                trouver_titre = false;
                            }
                        }
                        else if (noeud2.LocalName == "link")
                        {
                            if (trouver_titre == true)
                            {
                                link = noeud2.InnerText;
                            }
                        }
                        //Date de publication
                        else if (noeud2.LocalName == "pubDate")
                        {
                            if (trouver_titre == true)
                            {
                                date = noeud2.InnerText;
                            }


                        }
                        else if (noeud2.LocalName == "description")
                        {
                            //trouver_description = true;
                            if (trouver_titre == true)
                            {
                                description = noeud2.InnerText;
                                //richTextBox_flux.Text ="TITRE :  " + title + "\n" + "LIEN :  " + link + "\n\n\n" + description;
                            }
                        }


                    }

                    if (trouver_titre == true)
                    {
                        webBrowser1.DocumentText = "<html><head><h1><A href=" + link + ">" + title + "</A></h1><P><STRONG><FONT face=Bell MT>Date de publication: " + date + "</FONT></STRONG></P><p>" + description + "</p><body></body></head></html>";

                    }


                }


            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erreur pendant le chargeent :" + flux_encour.GetUrl(), MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
            }

[/TAB]
[TAB=Visual Studio version C++ ou Visual C++] La version C++ arrive ;) [/TAB]
[/TABS]


A présent passons au test, voir si on peut obtenir la liste
des flux d'une personne sur YouTube


1406887715-sousou.png


(Au passage : n'oubliez pas d'allez dans les paramètre ListView et de mètre l'ImageList associé)

Vous pouvez constater que l'ont obtient la liste des vidéo publier
par @Sousou et en dessous la dernière vidéo publier en date

J'expliquerais comment transformer le lien d'une chaîne YouTube
en lien RSS par la suite, pour le faire de manière automatisé.

La création du lecteur RSS en lui même touche à sa fin, nous allons
maintenant voir comment sauvegarder les différent Flux
pour ne pas avoir à rechercher à chaque fois et aussi comment
afficher les flux connu mondiaux de base.


1406845428-dark.png


separator_line.png


Ajout de flux important du Web.


Pour ce faire vous allez avoie besoin du fichier .xml fournit au dessus.
Pour l'utiliser, étant donner qu'il dépend de ma bibliothèque, j'ai fait en sorte
qu'il soit importer depuis le dossier du projet ou d'installation

Donc vous allez devoir allez dans Mes documents > Visual Studio (version) > Project

> "Nom de votre projet" > bin > Debug > Laisser le fichier DEV.xml ici

/!\ NE RENOMMER PAS LE FICHIER .XML /!\


1406837608-flux.png

[TABS]
[TAB=Visual Studio version C# ou Visual C#]

Une fois le fichier .XML ajouter, vous allez devoir allez dans l'évenement Form_Load de votre
application

Code:
F = new RSSFlux();
            F.Load_Flux_Data("./DEV.xml", this.treeView1, imageList1);

//Toujours pensez a linké par la bonne imageList pour obtenir vos icônes

Une fois ceci fait vous pouvez lancer l'application, si vous avez bien ajouter le fichier
.xml aucune erreur ne va apparaître, sinon une erreur surviendra mais vous allez pouvoir
continuer à utiliser l'application, c'est une erreur mineur donc ;)


Si vous avez tout bien fait correctement vous allez obtenir ceci (j'ai utilisé le RSS :RG:)

1406838477-rg.png


(je peut voir les dernier sujet poster, c'est pratique :espion: )

La je vous ai montrer comment afficher les dossier dans le TreeView, mais je ne vous ai
pas montrer comment avoir le flux dépendant de chaque dossier

Pour ce faire, c'est très simple, vous devez allez dans l'événement DoubleClick
de la TreeView et y inséré le code suivant.
Code:
// si ce n'est pas un dossier
            if (treeView1.SelectedNode.Parent != null)
            {
                //richTextBox_flux.Text = treeView_flux.SelectedNode.Text + "\n" + treeView_flux.SelectedNode.Parent.Text;
                string flux = treeView1.SelectedNode.Text;
                string dossier = treeView1.SelectedNode.Parent.Text;


                //string url_flux = "";



                // on change le pointeur de la sourie
                //Cursor pointeur_normal = Cursor.Current;
                //this.Cursor = Cursors.WaitCursor;

                //création d'un document XML

                XmlDocument fichier = new XmlDocument();
                try
                {
                    fichier.Load("DEV.xml");

                    // annalyse des donnees du fichier
                    XmlNodeList noeud_dossier = null;
                    noeud_dossier = fichier.DocumentElement.GetElementsByTagName("categorie");

                    // pour chaque balise de type "dossier"
                    string nom_dossier = "";
                    string nom_flux = "";
                    string nom_url = "";
                    bool bon_dossier = false;
                    bool bon_flux = false;
                    foreach (XmlNode noeud1 in noeud_dossier)
                    {
                        // pour chaque balise fille de "dossier"
                        bon_dossier = false;
                        foreach (XmlNode noeud2 in noeud1.ChildNodes)
                        {
                            if (noeud2.LocalName == "name")
                            {
                                // on ecrit le nom du dossier
                                nom_dossier = noeud2.InnerXml;
                                if (nom_dossier == dossier)
                                {
                                    bon_dossier = true;
                                }
                                else
                                {
                                    bon_dossier = false;
                                }
                            }
                            //pour chaque balise fille de "flux"
                            else
                            {
                                if (bon_dossier == true)
                                {
                                    if (noeud2.LocalName == "flux")
                                    {
                                        foreach (XmlNode noeud3 in noeud2.ChildNodes)
                                        {
                                            if (noeud3.LocalName == "flux_name")
                                            {
                                                nom_flux = noeud3.InnerXml;
                                                if (nom_flux == flux)
                                                {
                                                    bon_flux = true;
                                                }
                                                else
                                                {
                                                    bon_flux = false;
                                                }
                                            }
                                            else
                                            {
                                                if (noeud3.LocalName == "url")
                                                {
                                                    if (bon_dossier == true && bon_flux == true)
                                                    {
                                                        nom_url = noeud3.InnerXml;
                                                        flux_encour = new Cflux(nom_dossier, nom_flux, nom_url);
                                                    }
                                                }
                                            }
                                        }

                                    }
                                }
                            }

                        }
                    }
                    Read_Rss(flux_encour.GetUrl());





                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Error while loading data base " + "DEV.xml", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                }

                //on remet le pointeur de la sourie normal
                //this.Cursor = pointeur_normal;


Déjà là le lecteur de Flux RSS est complet, il nous manque plus que la parti "Ajouter dossier"
et "Ajouter flux" en sauvegarde, pour ne plus avoir à rentré le lien à chaque utilisations

C'est un peu là que les choses se complique, même si j'ai déjà perdu 50% de mon auditoire
au niveau des pré-requis :trollface:

Nous allons ajouter un nouveau formulaire pour la création de dossier
et de flux

[/TAB]
[TAB=Visual Studio version C++ ou Visual C++] Ca arrive ;)[/TAB]
[/TABS]



1406845562-open131.png



separator_line.png


Ajouter des dossiers

[TABS]
[TAB=VisualStudio version C# ou Visual C#]

Nous allons devoir créer un nouveau formulaire Windows, pour ce faire vous devez faire
Projet > Ajouter un Formulaire Windows
Nommer le comme vous voulez, ça a peu d'importance au finale

Commençons déjà par l'ajout de nouvelle catégorie
On ne va pas QUE ajouter des flux, ça serais le désordre

Pour ma part, voici à quoi ressemble mon formulaire :

1406840011-addcat.png



Allez dans le code de votre Formulaire, nous allons déclaré des variables + implémentation
dans Public Partial Class
Code:
private string[] table_nom,table_url; //Tableaux de string
public String getName()
        { return textBox1.Text;}
public String[] getTable_nom()
        { return this.table_nom; }
        public String[] getTable_url()
        { return this.table_url; }



Maintenant, rendez-vous dans le Bouton "ADD" pour ajouter
Code:
if (text_url.Text != "" && text_nom.Text != "")
            {
                liste_de_nom.Items.Add(text_nom.Text);
                liste_de_url.Items.Add(text_url.Text);
            }

Maintenant dans le bouton "DEL" pour supprimer
Code:
if (liste_de_nom.Items.Count > 0)
            {
                liste_de_nom.Items.RemoveAt(liste_de_nom.Items.Count - 1);
                liste_de_url.Items.RemoveAt(liste_de_url.Items.Count - 1);
            }

Une fois ceci fait, vous allez réduire la Form, jusqu'à ce qu'on
ne voit plus le 2 éme groupBox pour l'ajout de Flux
et vous allez dans les paramètres du formulaire, vous chercher
"Locked" et vous mettez sur "true".
Et FormBorderStyle en FixedDialog.

Vous comprendrez pourquoi par la suite ;)

Votre Formulaire va ressemblé à ceci

1406839724-addcat.png


Maintenant allez dans le bouton "OK"
Code:
table_nom = new String[liste_de_nom.Items.Count];
            table_url = new String[liste_de_nom.Items.Count];
            if (liste_de_url.Items.Count > 0)
            {
                for (int i = 0; i < liste_de_url.Items.Count; i++)
                {

                    table_nom[i] = liste_de_nom.Items[i].ToString();
                    table_url[i] = liste_de_url.Items[i].ToString();
                }
            }

Votre Formulaire de création de catégorie est désormais terminé
C'est bien, mais rien ne nous indique quel événement doit ouvrir ce formulaire ?

Pour faire simple, allez sur votre Bouton "Créer Catégorie" ou faite en un
pour ma part, ce bouton est dans mon toolStrip ;)

Le code est assez complexe mais cela reprend le système de Dialog
et d'écriture de fichier .XML (c'est pour ça qu'il est très important
de ne pas toucher au fichier .XML)
Code:
AddFlux new_categorie = new AddFlux();
            new_categorie.ShowDialog();
            if (new_categorie.DialogResult == System.Windows.Forms.DialogResult.OK)
            {

                // on recupere les donnees
                string nom_dossier = new_categorie.getName();

                if (nom_dossier != "")
                {
                    //AjouterDossier(this.nouveau_dossier.nom_nouveau_dossier);
                    int nb_dossier = this.treeView1.GetNodeCount(false);
                    bool trouver_nom_dossier = false;

                    // on verifie qu'un autre dossier ne porte pas le meme nom
                    for (int i = 0; i < nb_dossier && !trouver_nom_dossier; i++)
                    {
                        if (this.treeView1.Nodes[i].Text == nom_dossier)
                        {
                            trouver_nom_dossier = true;
                        }
                    }


                    if (!trouver_nom_dossier)
                    {
                        this.treeView1.Nodes.Add(nom_dossier);



                        XmlDocument xml = new XmlDocument();
                        try
                        {
                            // lecture du rss
                            xml.Load("DEV.xml");
                            //création de la balise "dossier"
                            XmlElement balise = xml.CreateElement("categorie");
                            balise.InnerText = "";
                            // création de la balise "nom_dossier" a l'interrieur de dossier
                            XmlElement balise2 = xml.CreateElement("name");
                            balise2.InnerText = nom_dossier;

                            balise.AppendChild(balise2);

                            xml.DocumentElement.AppendChild(balise);
                            xml.Save("DEV.xml");




                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                        }


                    }
                    else
                    {
                        MessageBox.Show("La catégorie {" + nom_dossier + " }existe déjà", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                    }


                }

            }
[/TAB]
[TAB=VisualStudio version C++ ou Visual C++] code[/TAB]
[/TABS]

Après compilation du projet, voici le résultat


1406840965-adddossier.png



La sauvegarde du dossier est automatique puisque l'ont écrit
dans le fichier .XML qui sera recharger a la prochaine utilisations



1406845588-book119.png



separator_line.png


Ajouter des flux personnels

[TABS]
[TAB=VisualStudio version C# ou Visual C#]

Comme pour la création de dossier, nous allons recréer un formulaire Windows donc
Projet > Ajouter un formulaire Windows

Nommer le comme vous voulez, ça a peu d'importance au finale

Pour ma part, voici à quoi ressemble mon formulaire :

1406842882-addflu.png



Vous pouvez voir que c'est similaire mais différent, puisque cette fois-ci
on choisit la catégorie cible ou le flux sera ajouté


Comme tout à l'heure nous allons déclaré une nouvel instance, donc allez
dans Public Partial Class et déposer ce code :

Code:
[/FONT][/LEFT][/FONT][/LEFT][/FONT][/LEFT]
[FONT=Tahoma]
[LEFT][FONT=Tahoma]
[LEFT][FONT=Tahoma]
[LEFT]private Cflux local_flux;
  public Cflux Get_new_flux()
         { return local_flux; }




Maintenant, allez dans l'événement Form_Load du Formulaire ou Double cliquez dessus ;)
Code:
[/FONT][/LEFT][/FONT][/LEFT][/FONT][/LEFT]
[FONT=Tahoma]
[LEFT][FONT=Tahoma]
[LEFT][FONT=Tahoma]
[LEFT]categorie.Items.AddRange(local_flux.GetCategories_tab());//Combobox




Une fois ceci fait, allez dans le code du bouton nommer "Explore"

Code:
System.Xml.XmlDocument xml = new System.Xml.XmlDocument();
            try
            {
                // lecture du Flux rss
                xml.Load(url.Text);

               System.Xml.XmlNodeList noeud = null;
               System.Xml.XmlNodeList noeud_chanel = null;
                noeud_chanel = xml.DocumentElement.GetElementsByTagName("channel");
                foreach (System.Xml.XmlNode xmlnod in noeud_chanel)
                {
                    string channel;
                    channel = "Titre";
                    foreach (System.Xml.XmlNode xmlnod2 in xmlnod.ChildNodes)
                    {
                        if (xmlnod2.LocalName == "title")
                        {
                            channel = xmlnod2.InnerText;
                            name.Text = channel;
                        }
                    }
                }

                noeud = xml.DocumentElement.GetElementsByTagName("item");

                // pour chaque "item"
     
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erreur de chargement :" + url.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
            }

Puis dans le bouton "OK"

Code:
if (name.Text != "" && url.Text != "" && categorie.Text != "")
            {
                local_flux.SetFlux_name(name.Text);
                local_flux.SetUrl(url.Text);
                local_flux.SetCategorie(categorie.Text);

                // on ferme la boite de dialogue
                this.Close();
            }
            else
            {
                //traduction
                MessageBox.Show("Veuillez remplir les champs , "Erreur!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }

Votre formulaire est maintenant terminé, mais comme pour les catégories, il va falloir
qu'un bouton déclanche l'événement, pour ma part j'ai encore choisit un de mes bouton
de mon toolStrip

Pour commencer nous devons déclarer une utilisations d'espace de nom
Code:
[/FONT][/LEFT][/FONT][/LEFT][/FONT][/LEFT]
[FONT=Tahoma]
[LEFT][FONT=Tahoma]
[LEFT][FONT=Tahoma]
[LEFT]using "lenomduprojet";




Ensuite allez sur votre Formulaire Principale et retourner dans Public
Partial Class
Il faut déclaré une autre instance
D'ailleurs, supprimer le "Public" de "Public partial Class" sinon des problème
d'accéssibilité vont apparître

Code:
Cflux new_flux = new Cflux("", "", "", null);


Ensuite en dessous vous devez avoir ceci : public class

Code:
public AjouterFlux(Cflux new_flux)//Cflux new _flux est a ajouter
        {
            InitializeComponent();
local_flux = new Cflux(new_flux.GetCategorie(), new_flux.GetFlux_name(), new_flux.GetUrl(), new_flux.GetCategories_tab()); //Ceci est a ajouter aussi
        }


Et pour finir dans votre bouton pour ajouter un flux
Code:
this.new_flux.SetFlux_name("");
            this.new_flux.SetUrl("");
            this.new_flux.SetCategorie("");
            // on met tous les nom de dossier dans le tableau
            string[] tableau = new String[this.treeView1.GetNodeCount(false)];
            for (int i = 0; i < this.treeView1.GetNodeCount(false); i++)
            {
                tableau[i] = this.treeView1.Nodes[i].Text;

            }
            this.new_flux.SetCategories_tab(tableau);

            AjouterFlux new_f = new AjouterFlux(this.new_flux);
            new_f.ShowDialog();


            // on recupere les donnees
            this.new_flux = new_f.Get_new_flux();


            if (this.new_flux.GetFlux_name() != "" && this.new_flux.GetUrl() != "" && this.new_flux.GetCategorie() != "")
            {



                //création d'un document XML

                XmlDocument fichier = new XmlDocument();
                try
                {
                    fichier.Load("DEV.xml");

                    // annalyse des donnees du fichier
                    XmlNodeList noeud_dossier = null;
                    noeud_dossier = fichier.DocumentElement.GetElementsByTagName("categorie");

                    // pour chaque balise de type "dossier"
                    string nom_dossier_courant = "";
                    foreach (XmlNode noeud1 in noeud_dossier)
                    {
                        // pour chaque balise fille de "dossier"
                        foreach (XmlNode noeud2 in noeud1.ChildNodes)
                        {
                            if (noeud2.LocalName == "name")
                            {
                                // on ecrit le nom du dossier
                                nom_dossier_courant = noeud2.InnerXml;
                                if (nom_dossier_courant == this.new_flux.GetCategorie())
                                {


                                    // on ajoute le flux dans le treelistview
                                    F.AddChannel(this.new_flux.GetFlux_name(), this.new_flux.GetCategorie(), treeView1);

                                    // on prepare ce que l'on va ecrire
                                    XmlElement balise_flux = fichier.CreateElement("flux");
                                    balise_flux.InnerText = "";

                                    XmlElement balise_nom_flux = fichier.CreateElement("flux_name");
                                    balise_nom_flux.InnerText = this.new_flux.GetFlux_name();
                                    balise_flux.AppendChild(balise_nom_flux);

                                    XmlElement balise_url_flux = fichier.CreateElement("url");
                                    balise_url_flux.InnerText = this.new_flux.GetUrl();
                                    balise_flux.AppendChild(balise_url_flux);

                                    // on ajoute tout dans le noeud1
                                    noeud1.AppendChild(balise_flux);

                                    fichier.Save("DEV.xml");

                                }

                            }



                        }
                    }



                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Erreur du chargement " + "XML_data_flux.xml", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                }



            }

[/TAB]
{TAB=VisualStudio version C++ ou Visual C++] Ca arrive ;)[/TAB]
[/TABS]


Après avoir compiler le programme et fait un test, voici ce que ça donne


1406845000-addflux.png




1406845637-youtube30.png



separator_line.png


Convertir un lien YouTube en flux RSS


Je vais vous montrer pour l'utilisations YouTube, la méthode à suivre
pour convertir les lien YouTube en flux RSS
Je montre juste la méthode, à vous de transformer le code pour
que l'URL soit directement traduit ;)

C'est tout bêtes en faite, il y'as un URL de base pour les FLUX qui est



Pour suivre une chaine YT, il faudra juste allez sur une chaîne, récuperer l'ID en fin d'URL
dans l'exemple UCeohvTWYjZDOubRaSIlpBCQ


Le changer dans le lien et le tour est joué ;)





separator_line.png




Voilà, ce petit tutoriel est maintenant terminé, merci à ceux qui ont eu le courage de lire l'intégralité
je vous comprend c'est long, même moi j'ai mis 5H pour la rédactions :rofl:
D'ailleurs, la partie code C++ arrive sous peu ;)
Enfin bon, comme d'habitude, si vous avez des questions envoie moi en message privée ;)
(NE DEMANDER PAS "AIDE MOI SKYPE STP WSH")

Sur ce, bonne journée/soirée, à la prochaine :bye:



http://reality-gaming.fr/proxy.php?image=http%3A%2F%2Fimage.noelshack.com%2Ffichiers%2F2014%2F28%2F1404831415-gtp-gif.gif&hash=29286e9f966ee2d005ed9c5836507105
 
Dernière édition par un modérateur:

PriinCeSse

OKLM
Premium
Inscription
28 Février 2014
Messages
1 505
Réactions
854
Points
2 478
Woow topic complet je vais essayer d installer ça merci pour ton topic :love:
 

Florian.

Premium
Inscription
8 Août 2012
Messages
4 251
Réactions
1 220
Points
14 353
Tuto innuti comme dab :rofl:

Super tuto avec tout les code quoi de mieux :o

Good Game :D
 

L3NNY

Achete crédit FUT15, Venez privée !
Premium
Inscription
13 Novembre 2013
Messages
1 299
Réactions
398
Points
7 696
Merci beaucoup du tuto trés détailler ;)
 

XavierModding

Premium
Inscription
25 Octobre 2014
Messages
965
Réactions
535
Points
15 159
1406845428-social23.png



Hello les premium, c'est DEVR0 GTP, aujourd'hui je vous propose un petit tutoriel assez sympa
qui va consister à vous montrer comment suivre une Chaîne YouTube avec les flux RSS dans
une application Windows (C#.Net et C++)

Le tutoriel est assez simple à réaliser, je vais vous montrer l'exemple pour suivre UNE
chaîne en particulier, vous pouvez vous même améliorer le système pour pouvoir suivre
plusieurs Chaîne en même temps.
Je rappel aussi que c'est une substitution a la page d'abonnement YouTube, mais peut être
utiles si on à pas envie de ré-ouvrir son navigateur et si on change de compte Google (pas
besoin de rajouter toutes les chaînes)

Je vous montre un exemple basique, sachez que vous pouvez créer un système
bien plus complexe ;)

Avant de commencé je tient à précisé que ce tutoriel s'adresse quand même
a des personnes ayant des bases solides dans ce domaines ;)


separator_line.png


Sommaire du tutoriel
  • Création du projet, ajout des composants
  • Ajouter des flux important du Web
  • Ajouter des catégorie de flux
  • Ajouter des flux personnels

separator_line.png


Ce qu'il vous faudra pour réaliser ce tutoriel

  • Visual Studio ou Visual C# ou Visual C++
  • Quelques connaissances quand même
  • Un cerveau ? :trollface: U MAD


1406845428-machine2.png



separator_line.png


Créations du lecteur, ajout des composants


[TABS]
[TAB=Visual Studio, Visual C#]

Comme à votre habitude, vous créer un nouveau Projet C#
Vous allez donc arriver sur un Formulaire Windows Vide, jusque là tout est bon

Une fois sur votre formulaire il va nous falloir plusieurs composant qui sont
- Une listView
- Un TreeView
- Un WebBrowser
- 3 toolStrip
- Un StatusStrip
- Un Panel
- Un ImageList (pour obtenir les icônes dans la listView)
- Un contextMenuStrip (parce qu'on est des génie :trollface: )

Une fois ceci fait, votre Formulaire Windows devrais ressemblé à ceci :

1406833536-tuto.png


L'ajout des composants sur notre Form est terminer

[/TAB]
[TAB=Visual Studio, Visual C++]
[/TAB][/TABS]
[TABS][TAB=Visual Studio, Visual C++]
Un tutoriel complet expliquant comment créer un Formulaire Windows VC++ à été fait ici

Pour l'ajout des composants, regarder dans le tableau C# c'est identique (seul le code changera)

[/TAB]
[/TABS]


separator_line.png


Le code de l'application pour obtenir les flux


[TABS]
[TAB=Visual Studio version C# ou Visual C#]
[/TAB][/TABS]
[TABS][TAB=Visual Studio version C# ou Visual C#]
Ajouter une utilisation d'espace de nom

Code:
using System.Xml;
using RSSReader;

Ajouter le .dll RSSReader que j'ai créer tout spécialement pour vous,
une fois ici, on va déclaré une nouvelle instance, donc allez dans

Code:
public partial class Form1 : Form
    {
       RSSFlux F;
    }

Une fois ici, il va falloir créer une fonction pour la lecture RSS (dépendante de la bibliothèque)

Code:
void Read_Rss(string flux)
        {

            //Effacer l'ancienne Affichage tout d'abord
            listView_flux1.Clear();//Nom de votre listView
            this.listView_flux1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.columnHeader1 });//Nom de votre ListView églament

            //Analyse de la Flux Rss "Document Xml"
            XmlDocument xml = new XmlDocument();
            try
            {
                // lecture du Flux rss
                xml.Load(flux);

                XmlNodeList noeud = null;
                XmlNodeList noeud_chanel = null;
                noeud_chanel = xml.DocumentElement.GetElementsByTagName("channel");
                foreach (XmlNode xmlnod in noeud_chanel)
                {
                    string channel;
                    channel = "Titre";
                    foreach (XmlNode xmlnod2 in xmlnod.ChildNodes)
                    {
                        if (xmlnod2.LocalName == "title")
                        {
                            channel = xmlnod2.InnerText;
                            this.columnHeader1.Text = channel;
                        }
                    }
                }

                noeud = xml.DocumentElement.GetElementsByTagName("item");

                // pour chaque "item"
                bool premier = true;
                foreach (XmlNode node in noeud)
                {
                    string title, description, link, date;
                    title = "Sans Titre";
                    description = "Sans Description";
                    link = "Aucun Lien";
                    date = "Inconnu";
                    //Parcourir tous les Items
                    // pour chaque balise fille de "item"
                    foreach (XmlNode noeud2 in node.ChildNodes)
                    {
                        if (noeud2.LocalName == "link")
                        {
                            link = noeud2.InnerText;
                        }
                        else if (noeud2.LocalName == "title")
                        {
                            title = noeud2.InnerText;
                            //Ajouter le titre dans  la liste Box
                            listView_flux1.Items.Add(title,4);

                            //columnHeader2.ListView.Items.Add(title);

                        }
                        //Date de publication
                        else if (noeud2.LocalName == "pubDate")
                        {
                            date = noeud2.InnerText;



                        }
                        else if (noeud2.LocalName == "description")
                        {
                            if (premier == true)
                            {
                                description = noeud2.InnerText;
                                //richTextBox_flux.Text ="TITRE :  " + title + "\n" + "LIEN :  " + link + "\n\n\n" + description;
                                //premier=false;
                            }
                        }

                    }


                    if (premier == true)
                    {
                        //richTextBox_flux.Text = "TITRE :  " + title + "\n" + "LIEN :  " + link + "\n\n\n" + description;
                        premier = false;
                        webBrowser1.DocumentText = "<html><head><h1><A href=" + link + ">" + title + "</A></h1><P><STRONG><FONT face=Bell MT>Date de publication: " + date + "</FONT></STRONG></P><p>" + description + "</p><body></body></head></html>";

                    }

                    Look.Text = "Looking into ["+flux_encour.GetCategorie()+"] Name:["+flux_encour.GetFlux_name()+"] Url:["+flux_encour.GetUrl()+"]";//Look est le nom du label de mon statusStrip

                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erreyr de chargement du flux " + flux,MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
            }




        }

Vous devriez avoir des erreurs pour flux_encour normalement, c'est normal
on va devoir créer une classe ;) donc pour ce faire, faite Projet > Ajouter nouvel élément
> Classe

Une fois dans l'éditeur de classe, vous devrez ajouter ce code :

Code:
public string categorie;
        public string flux_name;
        public string url;
        public string[] tab_categorie_names;
        public Cflux() { }

        public Cflux(string c_categorie, string c_flux_name, string c_url)
        {
            categorie = c_categorie;
            flux_name = c_flux_name;
            url = c_url;
        }
        public Cflux(string c_categorie, string c_flux_name, string c_url, string[] c_tab_categorie_names)
        {
            categorie = c_categorie;
            flux_name = c_flux_name;
            url = c_url;
            tab_categorie_names = c_tab_categorie_names;


        }

        //Getteurs et Setteurs
        public string GetCategorie()
        { return this.categorie; }
        public void SetCategorie(string c_categorie)
        { categorie = c_categorie; }

        public string GetFlux_name()
        { return this.flux_name; }
        public void SetFlux_name(string c_flux_name)
        { flux_name = c_flux_name; }

        public string GetUrl()
        { return this.url; }
        public void SetUrl(string c_url)
        { url = c_url; }

        public string[] GetCategories_tab()
        { return this.tab_categorie_names; }
        public void SetCategories_tab(string[] c_tab_categorie_names)
        { tab_categorie_names = c_tab_categorie_names; }

Une fois la classe créer, on va devoir déclaré une nouvel instance
comme tout à l'heure dans Public Partial Class Form : Form
Code:
{
Cflux flux_encour = new Cflux("","","");
}

Déjà là nous avons fait le plus compliquer je pense ;)

Passons maintenant au code du bouton qui va récupéré le flux
en fonction de l'URL
Double cliquez sur votre bouton
Code:
flux_encour = new Cflux("Temporaire", "Temporaire", toolStripTextBox1.Text);//la textBox de l'URL
            Read_Rss(toolStripTextBox1.Text);//idem

Maintenant on va faire en sorte que lorsqu'on choisira un autre flux
la lecture de celui-ci ce fera automatiquement dans le WebBrowser en-dessous

Pour cela, allez dans les événements de la ListView
et chercher l'événement (Click)

Une fois dans l'événement _Click générer par le concepteur vous allez
pouvoir insérer le code suivant
Code:
string titre_flux = listView_flux1.SelectedItems[0].Text;
            listView_flux1.SelectedItems[0].ImageIndex = 3;



            XmlDocument xml = new XmlDocument();
            try
            {
                // lecture du rss
                xml.Load(flux_encour.GetUrl());
                // xml.Load("c:/rss.xml");

                XmlNodeList noeud = null;
                noeud = xml.DocumentElement.GetElementsByTagName("item");



                foreach (XmlNode node in noeud)
                {

                    string title, description, link, date;
                    title = "Sans Titre";
                    description = "Sans Description";
                    link = "Aucun Lien";
                    date = "Inconnu";
                    //bool trouver_description = false;
                    bool trouver_titre = false;
                    // pour chaque "item"

                    // pour chaque balise fille de "item"
                    foreach (XmlNode noeud2 in node.ChildNodes)
                    {
                        if (noeud2.LocalName == "title")
                        {
                            title = noeud2.InnerText;
                            if (title == titre_flux)
                            {
                                trouver_titre = true;
                            }
                            else
                            {
                                trouver_titre = false;
                            }
                        }
                        else if (noeud2.LocalName == "link")
                        {
                            if (trouver_titre == true)
                            {
                                link = noeud2.InnerText;
                            }
                        }
                        //Date de publication
                        else if (noeud2.LocalName == "pubDate")
                        {
                            if (trouver_titre == true)
                            {
                                date = noeud2.InnerText;
                            }


                        }
                        else if (noeud2.LocalName == "description")
                        {
                            //trouver_description = true;
                            if (trouver_titre == true)
                            {
                                description = noeud2.InnerText;
                                //richTextBox_flux.Text ="TITRE :  " + title + "\n" + "LIEN :  " + link + "\n\n\n" + description;
                            }
                        }


                    }

                    if (trouver_titre == true)
                    {
                        webBrowser1.DocumentText = "<html><head><h1><A href=" + link + ">" + title + "</A></h1><P><STRONG><FONT face=Bell MT>Date de publication: " + date + "</FONT></STRONG></P><p>" + description + "</p><body></body></head></html>";

                    }


                }


            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erreur pendant le chargeent :" + flux_encour.GetUrl(), MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
            }

[/TAB]
[TAB=Visual Studio version C++ ou Visual C++] La version C++ arrive ;) [/TAB]
[/TABS]

A présent passons au test, voir si on peut obtenir la liste
des flux d'une personne sur YouTube


1406887715-sousou.png


(Au passage : n'oubliez pas d'allez dans les paramètre ListView et de mètre l'ImageList associé)

Vous pouvez constater que l'ont obtient la liste des vidéo publier
par @Sousou et en dessous la dernière vidéo publier en date

J'expliquerais comment transformer le lien d'une chaîne YouTube
en lien RSS par la suite, pour le faire de manière automatisé.

La création du lecteur RSS en lui même touche à sa fin, nous allons
maintenant voir comment sauvegarder les différent Flux
pour ne pas avoir à rechercher à chaque fois et aussi comment
afficher les flux connu mondiaux de base.


1406845428-dark.png


separator_line.png


Ajout de flux important du Web.


Pour ce faire vous allez avoie besoin du fichier .xml fournit au dessus.
Pour l'utiliser, étant donner qu'il dépend de ma bibliothèque, j'ai fait en sorte
qu'il soit importer depuis le dossier du projet ou d'installation

Donc vous allez devoir allez dans Mes documents > Visual Studio (version) > Project

> "Nom de votre projet" > bin > Debug > Laisser le fichier DEV.xml ici

/!\ NE RENOMMER PAS LE FICHIER .XML /!\


1406837608-flux.png

[TABS]
[TAB=Visual Studio version C# ou Visual C#]
[/TAB][/TABS]
[TABS][TAB=Visual Studio version C# ou Visual C#]
Une fois le fichier .XML ajouter, vous allez devoir allez dans l'évenement Form_Load de votre
application

Code:
F = new RSSFlux();
            F.Load_Flux_Data("./DEV.xml", this.treeView1, imageList1);

//Toujours pensez a linké par la bonne imageList pour obtenir vos icônes

Une fois ceci fait vous pouvez lancer l'application, si vous avez bien ajouter le fichier
.xml aucune erreur ne va apparaître, sinon une erreur surviendra mais vous allez pouvoir
continuer à utiliser l'application, c'est une erreur mineur donc ;)


Si vous avez tout bien fait correctement vous allez obtenir ceci (j'ai utilisé le RSS :RG:)

1406838477-rg.png


(je peut voir les dernier sujet poster, c'est pratique :espion: )

La je vous ai montrer comment afficher les dossier dans le TreeView, mais je ne vous ai
pas montrer comment avoir le flux dépendant de chaque dossier

Pour ce faire, c'est très simple, vous devez allez dans l'événement DoubleClick
de la TreeView et y inséré le code suivant.
Code:
// si ce n'est pas un dossier
            if (treeView1.SelectedNode.Parent != null)
            {
                //richTextBox_flux.Text = treeView_flux.SelectedNode.Text + "\n" + treeView_flux.SelectedNode.Parent.Text;
                string flux = treeView1.SelectedNode.Text;
                string dossier = treeView1.SelectedNode.Parent.Text;


                //string url_flux = "";



                // on change le pointeur de la sourie
                //Cursor pointeur_normal = Cursor.Current;
                //this.Cursor = Cursors.WaitCursor;

                //création d'un document XML

                XmlDocument fichier = new XmlDocument();
                try
                {
                    fichier.Load("DEV.xml");

                    // annalyse des donnees du fichier
                    XmlNodeList noeud_dossier = null;
                    noeud_dossier = fichier.DocumentElement.GetElementsByTagName("categorie");

                    // pour chaque balise de type "dossier"
                    string nom_dossier = "";
                    string nom_flux = "";
                    string nom_url = "";
                    bool bon_dossier = false;
                    bool bon_flux = false;
                    foreach (XmlNode noeud1 in noeud_dossier)
                    {
                        // pour chaque balise fille de "dossier"
                        bon_dossier = false;
                        foreach (XmlNode noeud2 in noeud1.ChildNodes)
                        {
                            if (noeud2.LocalName == "name")
                            {
                                // on ecrit le nom du dossier
                                nom_dossier = noeud2.InnerXml;
                                if (nom_dossier == dossier)
                                {
                                    bon_dossier = true;
                                }
                                else
                                {
                                    bon_dossier = false;
                                }
                            }
                            //pour chaque balise fille de "flux"
                            else
                            {
                                if (bon_dossier == true)
                                {
                                    if (noeud2.LocalName == "flux")
                                    {
                                        foreach (XmlNode noeud3 in noeud2.ChildNodes)
                                        {
                                            if (noeud3.LocalName == "flux_name")
                                            {
                                                nom_flux = noeud3.InnerXml;
                                                if (nom_flux == flux)
                                                {
                                                    bon_flux = true;
                                                }
                                                else
                                                {
                                                    bon_flux = false;
                                                }
                                            }
                                            else
                                            {
                                                if (noeud3.LocalName == "url")
                                                {
                                                    if (bon_dossier == true && bon_flux == true)
                                                    {
                                                        nom_url = noeud3.InnerXml;
                                                        flux_encour = new Cflux(nom_dossier, nom_flux, nom_url);
                                                    }
                                                }
                                            }
                                        }

                                    }
                                }
                            }

                        }
                    }
                    Read_Rss(flux_encour.GetUrl());





                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Error while loading data base " + "DEV.xml", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                }

                //on remet le pointeur de la sourie normal
                //this.Cursor = pointeur_normal;


Déjà là le lecteur de Flux RSS est complet, il nous manque plus que la parti "Ajouter dossier"
et "Ajouter flux" en sauvegarde, pour ne plus avoir à rentré le lien à chaque utilisations

C'est un peu là que les choses se complique, même si j'ai déjà perdu 50% de mon auditoire
au niveau des pré-requis :trollface:

Nous allons ajouter un nouveau formulaire pour la création de dossier
et de flux

[/TAB]
[TAB=Visual Studio version C++ ou Visual C++] Ca arrive ;)[/TAB]
[/TABS]



1406845562-open131.png



separator_line.png


Ajouter des dossiers

[TABS]
[TAB=VisualStudio version C# ou Visual C#]
[/TAB][/TABS]
[TABS][TAB=VisualStudio version C# ou Visual C#]
Nous allons devoir créer un nouveau formulaire Windows, pour ce faire vous devez faire
Projet > Ajouter un Formulaire Windows
Nommer le comme vous voulez, ça a peu d'importance au finale

Commençons déjà par l'ajout de nouvelle catégorie
On ne va pas QUE ajouter des flux, ça serais le désordre

Pour ma part, voici à quoi ressemble mon formulaire :

1406840011-addcat.png



Allez dans le code de votre Formulaire, nous allons déclaré des variables + implémentation
dans Public Partial Class
Code:
private string[] table_nom,table_url; //Tableaux de string
public String getName()
        { return textBox1.Text;}
public String[] getTable_nom()
        { return this.table_nom; }
        public String[] getTable_url()
        { return this.table_url; }



Maintenant, rendez-vous dans le Bouton "ADD" pour ajouter
Code:
if (text_url.Text != "" && text_nom.Text != "")
            {
                liste_de_nom.Items.Add(text_nom.Text);
                liste_de_url.Items.Add(text_url.Text);
            }

Maintenant dans le bouton "DEL" pour supprimer
Code:
if (liste_de_nom.Items.Count > 0)
            {
                liste_de_nom.Items.RemoveAt(liste_de_nom.Items.Count - 1);
                liste_de_url.Items.RemoveAt(liste_de_url.Items.Count - 1);
            }

Une fois ceci fait, vous allez réduire la Form, jusqu'à ce qu'on
ne voit plus le 2 éme groupBox pour l'ajout de Flux
et vous allez dans les paramètres du formulaire, vous chercher
"Locked" et vous mettez sur "true".
Et FormBorderStyle en FixedDialog.

Vous comprendrez pourquoi par la suite ;)

Votre Formulaire va ressemblé à ceci

1406839724-addcat.png


Maintenant allez dans le bouton "OK"
Code:
table_nom = new String[liste_de_nom.Items.Count];
            table_url = new String[liste_de_nom.Items.Count];
            if (liste_de_url.Items.Count > 0)
            {
                for (int i = 0; i < liste_de_url.Items.Count; i++)
                {

                    table_nom[i] = liste_de_nom.Items[i].ToString();
                    table_url[i] = liste_de_url.Items[i].ToString();
                }
            }

Votre Formulaire de création de catégorie est désormais terminé
C'est bien, mais rien ne nous indique quel événement doit ouvrir ce formulaire ?

Pour faire simple, allez sur votre Bouton "Créer Catégorie" ou faite en un
pour ma part, ce bouton est dans mon toolStrip ;)

Le code est assez complexe mais cela reprend le système de Dialog
et d'écriture de fichier .XML (c'est pour ça qu'il est très important
de ne pas toucher au fichier .XML)
Code:
AddFlux new_categorie = new AddFlux();
            new_categorie.ShowDialog();
            if (new_categorie.DialogResult == System.Windows.Forms.DialogResult.OK)
            {

                // on recupere les donnees
                string nom_dossier = new_categorie.getName();

                if (nom_dossier != "")
                {
                    //AjouterDossier(this.nouveau_dossier.nom_nouveau_dossier);
                    int nb_dossier = this.treeView1.GetNodeCount(false);
                    bool trouver_nom_dossier = false;

                    // on verifie qu'un autre dossier ne porte pas le meme nom
                    for (int i = 0; i < nb_dossier && !trouver_nom_dossier; i++)
                    {
                        if (this.treeView1.Nodes[i].Text == nom_dossier)
                        {
                            trouver_nom_dossier = true;
                        }
                    }


                    if (!trouver_nom_dossier)
                    {
                        this.treeView1.Nodes.Add(nom_dossier);



                        XmlDocument xml = new XmlDocument();
                        try
                        {
                            // lecture du rss
                            xml.Load("DEV.xml");
                            //création de la balise "dossier"
                            XmlElement balise = xml.CreateElement("categorie");
                            balise.InnerText = "";
                            // création de la balise "nom_dossier" a l'interrieur de dossier
                            XmlElement balise2 = xml.CreateElement("name");
                            balise2.InnerText = nom_dossier;

                            balise.AppendChild(balise2);

                            xml.DocumentElement.AppendChild(balise);
                            xml.Save("DEV.xml");




                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                        }


                    }
                    else
                    {
                        MessageBox.Show("La catégorie {" + nom_dossier + " }existe déjà", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                    }


                }

            }
[/TAB]
[TAB=VisualStudio version C++ ou Visual C++] code[/TAB]
[/TABS]

Après compilation du projet, voici le résultat


1406840965-adddossier.png



La sauvegarde du dossier est automatique puisque l'ont écrit
dans le fichier .XML qui sera recharger a la prochaine utilisations



1406845588-book119.png



separator_line.png


Ajouter des flux personnels

[TABS]
[TAB=VisualStudio version C# ou Visual C#]
[/TAB][/TABS]
[TABS][TAB=VisualStudio version C# ou Visual C#]
Comme pour la création de dossier, nous allons recréer un formulaire Windows donc
Projet > Ajouter un formulaire Windows

Nommer le comme vous voulez, ça a peu d'importance au finale

Pour ma part, voici à quoi ressemble mon formulaire :

1406842882-addflu.png



Vous pouvez voir que c'est similaire mais différent, puisque cette fois-ci
on choisit la catégorie cible ou le flux sera ajouté


Comme tout à l'heure nous allons déclaré une nouvel instance, donc allez
dans Public Partial Class et déposer ce code :

Code:
[/FONT][/LEFT][/FONT][/LEFT][/FONT][/LEFT]
[FONT=Tahoma]
[LEFT][FONT=Tahoma]
[LEFT][FONT=Tahoma]
[LEFT]private Cflux local_flux;
  public Cflux Get_new_flux()
         { return local_flux; }




Maintenant, allez dans l'événement Form_Load du Formulaire ou Double cliquez dessus ;)
Code:
[/FONT][/LEFT][/FONT][/LEFT][/FONT][/LEFT]
[FONT=Tahoma]
[LEFT][FONT=Tahoma]
[LEFT][FONT=Tahoma]
[LEFT]categorie.Items.AddRange(local_flux.GetCategories_tab());//Combobox




Une fois ceci fait, allez dans le code du bouton nommer "Explore"

Code:
System.Xml.XmlDocument xml = new System.Xml.XmlDocument();
            try
            {
                // lecture du Flux rss
                xml.Load(url.Text);

               System.Xml.XmlNodeList noeud = null;
               System.Xml.XmlNodeList noeud_chanel = null;
                noeud_chanel = xml.DocumentElement.GetElementsByTagName("channel");
                foreach (System.Xml.XmlNode xmlnod in noeud_chanel)
                {
                    string channel;
                    channel = "Titre";
                    foreach (System.Xml.XmlNode xmlnod2 in xmlnod.ChildNodes)
                    {
                        if (xmlnod2.LocalName == "title")
                        {
                            channel = xmlnod2.InnerText;
                            name.Text = channel;
                        }
                    }
                }

                noeud = xml.DocumentElement.GetElementsByTagName("item");

                // pour chaque "item"
    
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erreur de chargement :" + url.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
            }

Puis dans le bouton "OK"

Code:
if (name.Text != "" && url.Text != "" && categorie.Text != "")
            {
                local_flux.SetFlux_name(name.Text);
                local_flux.SetUrl(url.Text);
                local_flux.SetCategorie(categorie.Text);

                // on ferme la boite de dialogue
                this.Close();
            }
            else
            {
                //traduction
                MessageBox.Show("Veuillez remplir les champs , "Erreur!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }

Votre formulaire est maintenant terminé, mais comme pour les catégories, il va falloir
qu'un bouton déclanche l'événement, pour ma part j'ai encore choisit un de mes bouton
de mon toolStrip

Pour commencer nous devons déclarer une utilisations d'espace de nom
Code:
[/FONT][/LEFT][/FONT][/LEFT][/FONT][/LEFT]
[FONT=Tahoma]
[LEFT][FONT=Tahoma]
[LEFT][FONT=Tahoma]
[LEFT]using "lenomduprojet";




Ensuite allez sur votre Formulaire Principale et retourner dans Public
Partial Class
Il faut déclaré une autre instance
D'ailleurs, supprimer le "Public" de "Public partial Class" sinon des problème
d'accéssibilité vont apparître

Code:
Cflux new_flux = new Cflux("", "", "", null);


Ensuite en dessous vous devez avoir ceci : public class

Code:
public AjouterFlux(Cflux new_flux)//Cflux new _flux est a ajouter
        {
            InitializeComponent();
local_flux = new Cflux(new_flux.GetCategorie(), new_flux.GetFlux_name(), new_flux.GetUrl(), new_flux.GetCategories_tab()); //Ceci est a ajouter aussi
        }


Et pour finir dans votre bouton pour ajouter un flux
Code:
this.new_flux.SetFlux_name("");
            this.new_flux.SetUrl("");
            this.new_flux.SetCategorie("");
            // on met tous les nom de dossier dans le tableau
            string[] tableau = new String[this.treeView1.GetNodeCount(false)];
            for (int i = 0; i < this.treeView1.GetNodeCount(false); i++)
            {
                tableau[i] = this.treeView1.Nodes[i].Text;

            }
            this.new_flux.SetCategories_tab(tableau);

            AjouterFlux new_f = new AjouterFlux(this.new_flux);
            new_f.ShowDialog();


            // on recupere les donnees
            this.new_flux = new_f.Get_new_flux();


            if (this.new_flux.GetFlux_name() != "" && this.new_flux.GetUrl() != "" && this.new_flux.GetCategorie() != "")
            {



                //création d'un document XML

                XmlDocument fichier = new XmlDocument();
                try
                {
                    fichier.Load("DEV.xml");

                    // annalyse des donnees du fichier
                    XmlNodeList noeud_dossier = null;
                    noeud_dossier = fichier.DocumentElement.GetElementsByTagName("categorie");

                    // pour chaque balise de type "dossier"
                    string nom_dossier_courant = "";
                    foreach (XmlNode noeud1 in noeud_dossier)
                    {
                        // pour chaque balise fille de "dossier"
                        foreach (XmlNode noeud2 in noeud1.ChildNodes)
                        {
                            if (noeud2.LocalName == "name")
                            {
                                // on ecrit le nom du dossier
                                nom_dossier_courant = noeud2.InnerXml;
                                if (nom_dossier_courant == this.new_flux.GetCategorie())
                                {


                                    // on ajoute le flux dans le treelistview
                                    F.AddChannel(this.new_flux.GetFlux_name(), this.new_flux.GetCategorie(), treeView1);

                                    // on prepare ce que l'on va ecrire
                                    XmlElement balise_flux = fichier.CreateElement("flux");
                                    balise_flux.InnerText = "";

                                    XmlElement balise_nom_flux = fichier.CreateElement("flux_name");
                                    balise_nom_flux.InnerText = this.new_flux.GetFlux_name();
                                    balise_flux.AppendChild(balise_nom_flux);

                                    XmlElement balise_url_flux = fichier.CreateElement("url");
                                    balise_url_flux.InnerText = this.new_flux.GetUrl();
                                    balise_flux.AppendChild(balise_url_flux);

                                    // on ajoute tout dans le noeud1
                                    noeud1.AppendChild(balise_flux);

                                    fichier.Save("DEV.xml");

                                }

                            }



                        }
                    }



                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Erreur du chargement " + "XML_data_flux.xml", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                }



            }

[/TAB]
{TAB=VisualStudio version C++ ou Visual C++] Ca arrive ;)[/TAB]
[/TABS]


Après avoir compiler le programme et fait un test, voici ce que ça donne


1406845000-addflux.png




1406845637-youtube30.png



separator_line.png


Convertir un lien YouTube en flux RSS


Je vais vous montrer pour l'utilisations YouTube, la méthode à suivre
pour convertir les lien YouTube en flux RSS
Je montre juste la méthode, à vous de transformer le code pour
que l'URL soit directement traduit ;)

C'est tout bêtes en faite, il y'as un URL de base pour les FLUX qui est



Pour suivre une chaine YT, il faudra juste allez sur une chaîne, récuperer l'ID en fin d'URL
dans l'exemple UCeohvTWYjZDOubRaSIlpBCQ


Le changer dans le lien et le tour est joué ;)





separator_line.png




Voilà, ce petit tutoriel est maintenant terminé, merci à ceux qui ont eu le courage de lire l'intégralité
je vous comprend c'est long, même moi j'ai mis 5H pour la rédactions :rofl:
D'ailleurs, la partie code C++ arrive sous peu ;)
Enfin bon, comme d'habitude, si vous avez des questions envoie moi en message privée ;)
(NE DEMANDER PAS "AIDE MOI SKYPE STP WSH")

Sur ce, bonne journée/soirée, à la prochaine :bye:



http://reality-gaming.fr/proxy.php?image=http%3A%2F%2Fimage.noelshack.com%2Ffichiers%2F2014%2F28%2F1404831415-gtp-gif.gif&hash=29286e9f966ee2d005ed9c5836507105
tu gere
 
Haut