Add-ons



Pages: [1]   Bas de page
  Imprimer  
Auteur Fil de discussion: [EN COURS] FAQ Plugins  (Lu 11175 fois)
0 Membres et 1 Invité sur ce fil de discussion.
Développé Couché
Fait partie du Décor
*
Alcoolémie: 20
Messages: 3475
Hors ligne Hors ligne
Sexe: Homme
Developpeur Python petit scarabée
« le: 02 Mai 2008 04:24:10 »


Sommaire

I   - INTRODUCTIONSUR PYTHON
II - DOCUMENTATION SUR PYTHON
III - DOCUMENTATION DE RÉFÉRENCE SUR LES PLUGIN XBMC
IV - TUTORIELS
V  - OUTILS DE DÉVELOPPEMENT
VI - EXEMPLES DE SCRIPTS POUR PLUGIN
VII - ASTUCES ET CONSEILS



I - INTRODUCTION:

Comme vous pourrez le constater, il y aura beaucoup de liens ci-dessous en commun avec le FAQ Scripts et Python

Pourquoi? Car les deux sont écrits en Python

Cependant, il ne faut pas les confondre. D'un point de vue de XBMC, scripts et plugins sont deux choses et concepts totalement différents.
Comme vous le savez déjà probablement, le script vous permet d'ajouter une "application" a XBMC. Cette "application", devrais-je dire ce script a sa propre interface graphique, ses propre commandes ce qui n'est pas le cas d'un plugin XBMC.

Un plugin n'a pas sa propre interface, vous continuer a utiliser l'interface d'XBMC et propose le système de navigation de XBMC, c'est donc très orienté "fichier" sauf qu'au lien de naviguer su votre disque dur ou sur votre réseau vous naviguez sur ce que le plugin vous propose.

Quel est le gros avantage du plugin par rapport au script (a mon sens)?:
  • Pour l'utilisateur: la même interface, donc pas besoin de s'adapter a une interface totalement nouvelle venu des délires d'un codeur Python fou  hanged
  • Pour le développeur: pas d'interface graphique (ou presque) a créer, donc beaucoup beaucoup moins de travail de ce coté la, il peut donc se focaliser le cœur du script  yumyum

Attention: Bien que scripts et plugins soient tous les deux écrits en Python, comme je l'ai dis plut tot d'un point de vue de XBMC sont bien différents et donc vous ne pouvez exécuter un script comme un plugin et un plugin comme un script.

Le problème avec les plugins (du moins c'est celui auquel j'ai été confronté) est le manque de documentation et d'exemples simples pour débuter. Vous avez bien des plugins (qui n'en sont pas moins bien fait) tels que Apple Movie Trailer, mais un peu trop complexes pour le débutant en Python et/ou XBMC.

Le but de ce post est de centraliser les informations dont vous aurez besoin pour soit utiliser un plugin ou soit en programmer un.

Je le mettrais a jour progressivement (histoire de tout centraliser au même endroit), donc ne vous alarmez pas de le voir changer  rolleyes(2)

La majeure partie de ces liens sont dans la langue de Shakespeare mais je vous rassure ce n'est pas de la littérature très compliquée a lire sur la forme même si le fond lui peut l'être parfois.


II - DOCUMENTATION SUR PYTHON:



III - DOCUMENTATION DE RÉFÉRENCE SUR LES PLUGIN XBMC:

Je ne reviens pas ici sur la documentation de référence sur XBMC traitée dans FAQ Scripts et Python.

IV - TUTORIELS:

  • Wiki XBMC - Le nécessaire pour vos le 1er pas pas avec un script Python pour XBMC: Building Python Scripts
  • Wiki XBMC - Le tutoriel d'Alex: ALEX's Python Tutorial
    Une référence dans les tutoriels pour XBMC. C'est très bon tutoriel, idéal pour démarrer. Vous pouvez aussi vous rendre directement sur le site d'Alex Poet, pour y trouver des scripts, le tutoriel au format pdf, des exemples et informations au sujet du développements de scripts pour XBMC ...
  • Wiki XBMC - L'indispensable tutoriel de Voinage sur la creation des plugins: HOW-TO write plugins for XBMC:
    Ce tutoriel vous prend par la main etape par etape, vous pouvez aussi le télécharger dans google code ICI avec des exemples de code. Excellent pour demarrer

V - OUTILS DE DÉVELOPPEMENT:

Ce paragraphe parle des Outils de développement sur XBMC (émulateurs, logs, IDE ...)
  • XBMC sur PC Windows : XBMC_PC Win32
    XBMC PC n'est pas un portage complet de XBMC sur PC windows, vous ne pourrez par exemple par visionner de vidéos via XBMC.
    Le but est d'avoir un outils de développement et de test sur PC, vous pouvez notamment tester scripts, plugins le module http étant tout a fait fonctionnel vous serez capable de vous connecter a internet et charger le contenu de page webs. Voici quelques liens
    • Forum sur XBMC_PC Win32
    • Téléchargement sur T3CH
      Voici quelques information tirées du Readme de T3CH sur XBMC Win32 PC
      I'm including the XBMC Win32 PC environment.exe that is meant for skinners & python developers, read more about the concept here http://xbmc.org/forum/showthread.php?p=115893 It was built using Microsoft DirectX Summer 2004 SDK.
      I've tweaked the win32 run_me_first.bat so it runs and then unmounts the virtual drives when you exit.


VI - EXEMPLES DE SCRIPTS POUR PLUGIN:



VII - ASTUCES ET CONSEILS:


« Dernière édition: 29 Juin 2009 22:18:11 par Frost » Journalisée

alexsolex
« Répondre #1 le: 11 Mai 2008 15:00:57 »
Haut de page

Salut

Voici quelques liens intéressants pour les scripts et plugins



Voici les 3 documentations des librairies python dédiées à xbmc ( trouvées sur cette page ) :


Voilà pour le moment, en attendant mieux
Journalisée
Roost66
« Répondre #2 le: 14 Mai 2008 15:38:40 »
Haut de page

Un exemple de Plugin qui me semble être une bonne base pour d'autres.
simple et efficace.
c'est le plugin "southpark" trouvé ici :

  http://xbmc.org/forum/showthread.php?p=181996#post181996

le créateur a fait 2 plugin avec les vidéos provenant de 2 site différents :

      www.stansdad.com     et    http://allsp.com/
 
Le résultat est le même , on a toutes les saisons.

Si quelqu'un veut éditer les .py avec les couleur car moi j'y arrive pas.

« Dernière édition: 14 Mai 2008 16:37:27 par Roost66 » Journalisée
Développé Couché
Fait partie du Décor
*
Alcoolémie: 20
Messages: 3475
Hors ligne Hors ligne
Sexe: Homme
Developpeur Python petit scarabée
« Répondre #3 le: 14 Mai 2008 16:31:55 »
Haut de page

Merci Roost66

Voici les deux fichiers en couleur (mais c'est bien de les avoir en telechargement pour les editer et tester) :
defaultsouthpark.py :

Code
(Python):
import urllib,re,sys,socket
import xbmcplugin,xbmcgui
import htmllib
 
 
 
#[(url,show)]
def getSouthparkepisodes(url,name):
       res=[]
       f=urllib.urlopen(url)
       a=f.read()
       f.close()
       p=re.compile(r&#39;target="mainFrame" href=".+?url=(.+?)">(.+?)</a>&#39;)
       match=p.findall(a)
       for url,name in match:
               res.append((url,name))
       return res
 
#[(url,show)]
def getSouthparkvidlinks(url):
       res=[]
       f=urllib.urlopen("http://allsp.com/"+url)
       a=f.read()
       f.close()
       p=re.compile(r"<embed src=\&#39;/.+?.swf\?url=(.+?)&#39;")
       match=p.findall(a)
       for url in match:
               res.append(url)
               return res
 
 
def get_params():
       param=[]
       paramstring=sys.argv[2]
       if len(paramstring)>=2:
               params=sys.argv[2]
               cleanedparams=params.replace(&#39;?&#39;,&#39;&#39;)
               if (params[len(params)-1]==&#39;/&#39;):
                       params=params[0:len(params)-2]
               pairsofparams=cleanedparams.split(&#39;&&#39;)
               param={}
               for i in range(len(pairsofparams)):
                       splitparams={}
                       splitparams=pairsofparams[i].split(&#39;=&#39;)
                       if (len(splitparams))==2:
                               param[splitparams[0]]=splitparams[1]
       return param
 
 
def addLink(name,url):
       #print name
       #print url
       #print "--"
       ok=True
       thumbnail_url = url.split( "thumbnailUrl=" )[ -1 ]
       liz=xbmcgui.ListItem(name, iconImage="DefaultVideo.png", thumbnailImage=thumbnail_url)
       liz.setInfo( type="Video", infoLabels={ "Title": name } )
       ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=url,listitem=liz)
       return ok
 
def addDir(name,url,mode):
       u=sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+str(mode)+"&name="+urllib.quote_plus(name)
       ok=True
       liz=xbmcgui.ListItem(name)
       liz.setInfo( type="Video", infoLabels={ "Title": name } )
       ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=True)
       return ok
 
def showCats():
       cat=[("http://allsp.com/e.php?season=1", "Season 1"),("http://allsp.com/e.php?season=2", "Season 2"),("http://allsp.com/e.php?season=3", "Season 3"),("http://allsp.com/e.php?season=4", "Season 4"),("http://allsp.com/e.php?season=5", "Season 5"),("http://allsp.com/e.php?season=6", "Season 6"),("http://allsp.com/e.php?season=7", "Season 7"),("http://allsp.com/e.php?season=8", "Season 8"),("http://allsp.com/e.php?season=9", "Season 9"),("http://allsp.com/e.php?season=10", "Season 10"),("http://allsp.com/e.php?season=11", "Season 11"),("http://allsp.com/e.php?season=12", "Season 12")]
       for url,name in cat:
               addDir(name,url,1)
 
def showShows(url,name):
       shows=getSouthparkepisodes(url,name)
       for url,name in shows:
               addDir(name,url,2)
 
def showVidlinks(url):
       res=[]
       vidlink=getSouthparkvidlinks(url)
       for url in vidlink:
               addLink("Southpark Episode",url)
 
 
params=get_params()
url=None
name=None
mode=None
try:
       url=urllib.unquote_plus(params["url"])
except:
       pass
try:
       name=urllib.unquote_plus(params["name"])
except:
       pass
try:
       mode=int(params["mode"])
except:
       pass
print "Mode: "+str(mode)
print "URL: "+str(url)
print "Name: "+str(name)
if mode==None or url==None or len(url)<1:
       print "categories"
       showCats()
elif mode==1:
       print "index of : "+url
       showShows(url,name)
elif mode==2:
       print "Next: "+url
       showVidlinks(url)
elif mode==3:
       print "show eps: "+url+" - "+name
       showEpisodes(url)
elif mode==4:
       print "show vidlinks: "+url
       showVidLinks(url)
xbmcplugin.endOfDirectory(int(sys.argv[1]))
 
 


defaultStansdad.py :

Code
(Python):
import urllib,re,sys,socket
import xbmcplugin,xbmcgui
import htmllib
 
 
 
#[(url,show)]
def getSouthparkepisodes(url):
       res=[]
       f=urllib.urlopen("http://www.stansdad.com/season"+url)
       a=f.read()
       f.close()
       p=re.compile(r&#39;<IFRAME src="(.+?)" width="520" height="406"&#39;)
       match=p.findall(a)
       for url in match:
               res.append(url)
       return res
 
#[(url,show)]
def getSouthparkvidlinks(url):
       res=[]
       f=urllib.urlopen("http://www.stansdad.com"+url)
       a=f.read()
       f.close()
       p=re.compile(r&#39;file=(.+?)&image&#39;)
       match=p.findall(a)
       for url in match:
               res.append(url)
               return res
 
 
def get_params():
       param=[]
       paramstring=sys.argv[2]
       if len(paramstring)>=2:
               params=sys.argv[2]
               cleanedparams=params.replace(&#39;?&#39;,&#39;&#39;)
               if (params[len(params)-1]==&#39;/&#39;):
                       params=params[0:len(params)-2]
               pairsofparams=cleanedparams.split(&#39;&&#39;)
               param={}
               for i in range(len(pairsofparams)):
                       splitparams={}
                       splitparams=pairsofparams[i].split(&#39;=&#39;)
                       if (len(splitparams))==2:
                               param[splitparams[0]]=splitparams[1]
       return param
 
 
def addLink(name,url):
       #print name
       #print url
       #print "--"
       ok=True
       thumbnail_url = url.split( "thumbnailUrl=" )[ -1 ]
       liz=xbmcgui.ListItem(name, iconImage="DefaultVideo.png", thumbnailImage=thumbnail_url)
       liz.setInfo( type="Video", infoLabels={ "Title": name } )
       ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=url,listitem=liz)
       return ok
 
def addDir(name,url,mode):
       u=sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+str(mode)+"&name="+urllib.quote_plus(name)
       ok=True
       liz=xbmcgui.ListItem(name)
       liz.setInfo( type="Video", infoLabels={ "Title": name } )
       ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=True)
       return ok
 
def showCats():
 
       res=[]
       f=urllib.urlopen("http://www.stansdad.com")
       a=f.read()
       f.close()
       p=re.compile(r&#39;<option class="option" value="season(.+?)">.+?-(.+?)</option>&#39;)
       match=p.findall(a)
       for url,name in match:
               addDir(name,url,1)
 
def showShows(url,name):
       shows=getSouthparkepisodes(url)
       for url in shows:
               addDir(name,url,2)
 
def showVidlinks(url):
       res=[]
       vidlink=getSouthparkvidlinks(url)
       for url in vidlink:
               addLink(name,url)
 
 
params=get_params()
url=None
name=None
mode=None
try:
       url=urllib.unquote_plus(params["url"])
except:
       pass
try:
       name=urllib.unquote_plus(params["name"])
except:
       pass
try:
       mode=int(params["mode"])
except:
       pass
print "Mode: "+str(mode)
print "URL: "+str(url)
print "Name: "+str(name)
if mode==None or url==None or len(url)<1:
       print "categories"
       showCats()
elif mode==1:
       print "index of : "+url
       showShows(url,name)
elif mode==2:
       print "Next: "+url
       showVidlinks(url)
elif mode==3:
       print "show eps: "+url+" - "+name
       showEpisodes(url)
elif mode==4:
       print "show vidlinks: "+url
       showVidLinks(url)
xbmcplugin.endOfDirectory(int(sys.argv[1]))
 
 
Journalisée

Roost66
« Répondre #4 le: 14 Mai 2008 16:41:32 »
Haut de page

Merci ,
j'ai pensé que ça pourrait nous aider dans la construction d'autres plugins .
Je remercie "Voisinage" du site XBMC.org pour son boulot.

Journalisée
alexsolex
« Répondre #5 le: 16 Mai 2008 01:25:11 »
Haut de page

J'ai passé le bout de code de Comedie.com sous forme d'un plugin.
A vous de me dire si ca fonctionne ou pas. Pour en savoir plus, rendez-vous là :
http://passion-xbmc.org/index.php/topic,494.new.html#new

Je ferais une explication dès que tout fonctionnera.
Journalisée
alexsolex
« Répondre #6 le: 17 Juillet 2008 19:39:47 »
Haut de page

Bonjour

Petite info que j'avais mis de côté et sur laquelle je viens de retomber :
Citation
- 2008-06-21 13666 added: Python method setPluginFanart() use: setPluginFanart(handle, image, color1, color2, color3) -- Sets the plugins fanart and color for skins to display. handle : integer - handle the plugin was started with. image : [opt] string - path to fanart image. color1 : [opt] hexstring - color1. (e.g. '0xFFFFFFFF') color2 : [opt] hexstring - color2. (e.g. '0xFFFF3300') color3 : [opt] hexstring - color3. (e.g. '0xFF000000') *Note, You can use the above as keywords for arguments.\n" example:\n" - xbmcplugin.setPluginFanart(int(sys.argv[1]), 'q:\\plugins\\Apple movie trailers II\\fanart.png', color2='0xFFFF3300')
On peut piloter l'interface fanart depuis un plugin ce qui est super intéressant pour enrichir visuellement le plugin en question, et donc lui donner un peu plus de personnalité que le simple fait de le laisser entre les mains du skin de base...
Dommage que l'aide de la librairie xbmcplugin n'en face pas mention, cette fonctionnalité datant de la svn du 30 juin.
Non testé ce jour, mais on peut imaginer que cela fonctionne.

@Temhill pour mise à jour de la FAQ des plugin.
Cordialement
Journalisée
Développé Couché
Fait partie du Décor
*
Alcoolémie: 20
Messages: 3475
Hors ligne Hors ligne
Sexe: Homme
Developpeur Python petit scarabée
« Répondre #7 le: 17 Juillet 2008 21:59:37 »
Haut de page

Salut Alexsolex,

Intéressant tout ça. Ou obtiens tu ces infos? Juste dans le changelogs pour bien est-ce centralise quelque part (si tu as un lien)?
Si il y a assez d'infos, on pourrait créer un post (servant de complément à la doc officielle) décrivant de ces API qui n'y figurent pas.
A ce sujet, la doc officiel ne semble plus être mise a jour depuis des années  sad.
Cela en est d'autant plus dommage si il continu a créer de nouvelle fonctionnalités.
« Dernière édition: 17 Juillet 2008 22:38:35 par Temhil » Journalisée

alexsolex
« Répondre #8 le: 18 Juillet 2008 00:32:10 »
Haut de page

il y a de quoi générer la documentation des librairies python dans le svn, mais j'avoue ne jamais avoir essayer. Sinon je tient ces infos du svn, je suis abonné au flux RSS et je consulte régulièrement les mises à jour.
Sur le site gueux, lorsqu'ils postent une version XBMC de la team T3CH, ils mettent le changelog depuis la dernière version. Je retrouve également les informations là.

Pour la doc, elle n'est pas super vieille, la date n'est pas réaliste. Il faut juste que le mec qui a mis la doc à dispo la mette à jour.

Sinon, si vous souhaitez mettre à jour quelquechose, je ne saurais que trop vous inciter à mettre à jour le manuel XBMC FR (wiki) afin de le rendre le plus complet possible.
Journalisée
Développé Couché
Fait partie du Décor
*
Alcoolémie: 20
Messages: 3475
Hors ligne Hors ligne
Sexe: Homme
Developpeur Python petit scarabée
« Répondre #9 le: 18 Juillet 2008 02:15:08 »
Haut de page

Ça me semble logique de mettre a jour la doc officielle française, merci de le rappeler.
Pour la mise a jour de la doc, peut être ai-je le mauvais lien mais ce que j'ai n'est pas top a jour, il n'y a même pas les ID des player dedans.
Faut que je regarde cela de plus près.
Journalisée

alexsolex
« Répondre #10 le: 11 Octobre 2008 15:00:42 »
Haut de page

Bonjour

Il y a quelques temps je répondais comme je le pouvais pour expliquer la différence entre un script et un plugin.

Je pense que tout le monde a saisi la nuance maintenant mais outre la différence majeure que dans un cas (script) le développeur doit créer l'interfae graphique de A à Z, dans l'autre cas (plugin) le développeur 'rempli' le skin de XBMC donc pas d'interface, je vois un autre point qui est très important dans les différences entre script et plugin.

Il s'agit de la localisation du lanceur.
En effet, pour lancer un script il faut se rendre en section script. Mais pour lancer un plugin, il faut se rendre dans la section multimédia concernée par le plugin en question (fichier/videos/images/musique)
C'est là que ca devient intéressant. L'atout majeur à mes yeux pour le plugin, c'est que vous pouvez le lancer depuis la section de votre choix. Mais ensuite.... Rien ne vous interdit de lancer un script par la méthode des plugins !!
Ainsi, et en guise d'exemple, si vous avez un script qui est en rapport avec les videos... disons installeur-passion, il vous suffit de faire un plugin comme suit :
Code
(Python):
import xbmc
 
xbmc.executescript(&#39;q:\\scripts\\Installeur-Passion\\default.py&#39;)
 
Pas trop difficile vous admettrez !!
Le résultat ? après des comportements bizarres du genre "impossible de se connecter au serveur" proposés par le système xbmc de plugin je pense, le script démarre et fonctionne, sans aucune autre modification de votre part !
Journalisée
Développé Couché
Fait partie du Décor
*
Alcoolémie: 20
Messages: 3475
Hors ligne Hors ligne
Sexe: Homme
Developpeur Python petit scarabée
« Répondre #11 le: 13 Octobre 2008 02:13:42 »
Haut de page

Interessant en effet, je n'y aurais pas pensé, mais je pense que ca me sera utile, merci!  niark niark
Journalisée

Par Bélénos, Par Toutatis, par Amora!
Fait partie du Décor
*
Alcoolémie: 75
Messages: 19322
Hors ligne Hors ligne
Sexe: Homme
Romain, tu ne feras pas la loi dans notre village!
WWW
« Répondre #12 le: 13 Octobre 2008 13:18:53 »
Haut de page

Vaguement en rapport avec ce propos, il y a un plugin qui utilise un système très particulier pour son installation puisque celle ci passe par un Script qui est bien plus familier aux utilisateurs. C'est AMT (Apple Movie Trainer).
Journalisée

Je me suis construit une Roulotte, ce n'est pas pour voir les châtelains traîner sur mon terrain vague

« « Tout homme qui fait quelque chose a contre lui ceux qui font la même chose, ceux qui font exactement le contraire et l'immense majorité de ceux qui sont d'autant plus critiques qu'ils ne font rien du tout. » » (René Char)


Comment récupérer les logs et décrire un problème avec un script/plugin
AppleTV + Carte accélératrice Crystal HD / Xbox Débug Kit.
alexsolex
« Répondre #13 le: 13 Octobre 2008 18:44:25 »
Haut de page

Effectivement, il permet d'écrire les plugins depuis le script. Mais ta précision sur le "vaguement" est à juste propos ;)

C'est une bonne idée aussi qu'un script propose d'installer ses 'bébés' pour une utilisation alternative.
Journalisée
Hello World
Fait partie du Décor
*
Alcoolémie: 3
Messages: 2338
Hors ligne Hors ligne
Sexe: Homme
« Répondre #14 le: 13 Octobre 2008 21:27:45 »
Haut de page

Oui je vais regarder de plus près pour la béta 4 de l'installeur, pour l'intégration des plugins ce sera pas mal ça. On en avait déjà parlé avec temhil, il y a un xml à modifier pour ajouter un plugin aux sources mais si on a un exemple tout fait c'est encore mieux.  niark niark
Journalisée

"Gouvernements du monde industriel, géants fatigués de chair et d'acier, je viens du cyberespace, nouvelle demeure de l'esprit. Au nom de l'avenir, je vous demande, à  vous qui êtes du passé, de nous laisser tranquilles. Vous n'êtes pas les bienvenus parmi nous."  par John Perry Barlow

Script : Installeur Passion-XBMC     Tutoriel : Les scrapers ou comment associer des informations à vos films
Développé Couché
Fait partie du Décor
*
Alcoolémie: 20
Messages: 3475
Hors ligne Hors ligne
Sexe: Homme
Developpeur Python petit scarabée
« Répondre #15 le: 08 Novembre 2008 10:03:40 »
Haut de page

Mise a jour du message de tete
Journalisée

Développé Couché
Fait partie du Décor
*
Alcoolémie: 20
Messages: 3475
Hors ligne Hors ligne
Sexe: Homme
Developpeur Python petit scarabée
« Répondre #16 le: 07 Décembre 2008 09:59:33 »
Haut de page

Bonjour a tous,

Voinage qui a bon nombre de plugins a son actifs et qui sévit sur le forum officiel vient de sortir un très bon tuto (je n'ai pas fini de le lire mais ce que j'en ai vu était pas mal) sur la création d'un plugin, le tout accompagné de quelque modules python qu'il a développe tout particulièrement pour le développement des plugins.
Donc a lire si vous voulez vous mettre au développement de plugin (en plus de nos snippets et de ce FAQ).

Voici le lien vers le topic sur le forum officiel: Basic Plugin creation Tutorial - released.

Et je vous ai mis en PJ le tutoriel. Bonne lecture!
Journalisée

Développé Couché
Fait partie du Décor
*
Alcoolémie: 20
Messages: 3475
Hors ligne Hors ligne
Sexe: Homme
Developpeur Python petit scarabée
« Répondre #17 le: 13 Janvier 2009 16:46:55 »
Haut de page

Mise a jour du message de tête:
- ajout des liens wiki et téléchargement du tutoriel de Voinage sur la creation des plugins
- création du sommaire
Journalisée

Pages: [1]   Haut de page
  Imprimer  
 
Aller à:  




anything