Xbmc Passion
 
*
Bienvenue, Invité. Veuillez vous connecter ou vous inscrire. 09 Février 2010 10:48:23


Connexion avec identifiant, mot de passe et durée de la session


 
Pages: [1] 2 3   Bas de page
  Répondre  |  Envoyer ce fil  |  Imprimer  
Auteur Fil de discussion: Code Snippet (exemples)  (Lu 4471 fois)
0 Membres et 2 Invités sur ce fil de discussion.
Temhil
Développé Couché
Fondateur
*****
En ligne En ligne

Sexe: Homme
Messages: 2334


Voir Sa Galerie


Developpeur Python petit scarabée


Voir le profil
« le: 06 Novembre 2008 15:15:46 »
Citer en réponseCitation

Bonjour les développeurs,

Je démarres ce fil de discutions afin d'essayer de regrouper ici un maximum d'exemple de code plus communément appelé code Snippet dans le monde des développeurs.

Ce message de têtes servira de sommaire avec un lien sur des Code Snippets, soit dans ce fil, soit dans un fil séparé.

Merci de soumettre tous les Code Snippets que vous jugerez utiles en précisant a quoi le Snippet s'applique:

- généralités
- spécifique aux scripts
- spécifique aux plugins





 arrows_right Généralités:


 arrows_right Scripts:


 arrows_right Plugins:

 arrows_right Autres sources de code-snippet indispensables:

« Dernière édition: 14 Octobre 2009 23:20:08 par Temhil » Journalisée

Temhil
Développé Couché
Fondateur
*****
En ligne En ligne

Sexe: Homme
Messages: 2334


Voir Sa Galerie


Developpeur Python petit scarabée


Voir le profil
« Répondre #1 le: 06 Novembre 2008 15:31:29 »
Citer en réponseCitation

On commence avec les plugins par un exemple donne par FrostBox (merci a lui) dans ce FIL
Il nous montre comment grandement améliorer la presentation d'un plugin dans XBMC en ultisant l'affichage d'information sur le plugin mais aussi le fanart en image de fond (cf. image ci-dessous)




 arrows_right Ajout de la fonction setPluginCategory(), visible en haut à droite (image ci-dessous):

Code
(Python):
import sys
import xbmcplugin
xbmcplugin.setPluginCategory( handle=int( sys.argv[ 1 ] ), category="LA CATÉGORIE DU PLUGIN" )


 arrows_right Support du fanart dans un plugin(cf. image ci-dessous):

Code
(Python):
import sys
import xbmcplugin
#la couleur doit etre en (AARRGGBB), mais peut etre vide
path_img = "mon image"
fanart_color1 = ""
fanart_color2 = ""
fanart_color3 = ""
xbmcplugin.setPluginFanart( handle=int( sys.argv[ 1 ] ), image=path_img, color1=fanart_color1, color2=fanart_color2, color3=fanart_color3 )
 

Pour plus regardez le module xbmcplugin grin

Note: Le skin utilisé doit avoir ce support, aussi ajoutez un try: except: au cas ou


Et voici le résultat:



[edit]
  • Ajout import sys manquant
  • Correction de fautes
« Dernière édition: 08 Décembre 2008 08:22:08 par Shaitan » Journalisée

Temhil
Développé Couché
Fondateur
*****
En ligne En ligne

Sexe: Homme
Messages: 2334


Voir Sa Galerie


Developpeur Python petit scarabée


Voir le profil
« Répondre #2 le: 06 Novembre 2008 15:44:33 »
Citer en réponseCitation

 arrows_right Récupérer le chemin courant d'un script ou plugin


Maintenant voyons comment Récupérer le chemin courant d'un script ou plugin:

Code
(Python):
import os
 
############################################################################
# Get current working directory and update internal vars with it  
############################################################################
 
# Set paths
ROOTDIR = os.getcwd().replace( ";", "" ) # Create a path with valid format
 
IMAGEDIR    = os.path.join(ROOTDIR, "images")
CACHEDIR    = os.path.join(ROOTDIR, "cache")
DOWNLOADDIR = os.path.join(ROOTDIR, "download")
LIBDIR      = os.path.join(ROOTDIR, "lib")
 

Note: Notez le replace( ";", "" ) dans la 1ere ligne, celui permet d'avoir un script compatible avec XBMC pre et post Beta1 car os.getcwd() a été modifié pour la Beta1


 arrows_right Gérer les chemins dans XBMC
Afin de vous assurer d'écrire un script qui sera compatible sur toutes les platformes (Windows, XBOX, Linux, Mac), il est preferable d'utliser fonction os.path.join afin de creer une chemins:
Code
(Python):
os.remove(os.path.join(DOWNLOADDIR, filename))

Eviter les notations avec une combinaison de '+' et des separateurs '/' ou '\\' selon l'OS.
Toutefois si vous n'avez pas le choix, utilisez os.sep comme séparateur.
« Dernière édition: 07 Novembre 2008 05:28:33 par Temhil » Journalisée

Temhil
Développé Couché
Fondateur
*****
En ligne En ligne

Sexe: Homme
Messages: 2334


Voir Sa Galerie


Developpeur Python petit scarabée


Voir le profil
« Répondre #3 le: 06 Novembre 2008 16:00:57 »
Citer en réponseCitation

 arrows_right Télécharger des images (ou un fichier) via HTTP

Voici une fonction vous permettant de recuperer des images (ou un fichier quelconque)
Code
(Python):
import urllib
import os.path
 
def downloadJPG(source, destination):
   """
   Source MyCine (thanks!)
   Download IF NECESSARY a URL 'source' (string) to a URL 'target' (string)
   Source is downloaded only if target doesn't already exist
   """

   if os.path.exists(destination):
       pass
   else:
       try:
           #print("downloadJPG destination doesn't exist, try to retrieve")
           loc = urllib.URLopener()
           loc.retrieve(source, destination)
       except Exception, e:
           print("Exception while source retrieving")
           print(e)
           print (str(sys.exc_info()[0]))
           traceback.print_exc()
           pass
 

Note:
  • Vous noterez dans cette implémentation que si le fichier est déjà present localement, il n'est pas téléchargé
  • Bien que cette fonction vous permette de recuperer un fichier de taille quelconque, pour un fichier de taille plus grande il est preferable d'utiliser une implémentation avec une barre de progression.
Journalisée

Frost
May the Force be with you
Fondateur
*****
Hors ligne Hors ligne

Sexe: Homme
Messages: 1347


Voir Sa Galerie


Développeur Python & Skinning Engine


Voir le profil WWW
« Répondre #4 le: 07 Novembre 2008 17:50:32 »
Citer en réponseCitation

Salut bonne idée ça  smiley

Mais faudrais pas reproduire mes fautes ou en mettre de plus  niark niark

- regardex == regardez

- et j'ai rajouter un import sys dans mon exemple pour alex désoler avait oublié  embarrassed

Code
(Python):
#Code générale pour imprimer
 
print "ok ok je sors"
 

 sweat
joke inside
frost
« Dernière édition: 08 Novembre 2008 01:09:23 par FrostBox » Journalisée

Pour les questions de codage python, voir en premier: *XBMC Python Documentation*
Toujours lire les Manuels *XBMC FR* - *XBMC Online*, *FAQ* et *Rechercher sur le forum* avant de poster.
Pour le dépannage et/ou établir un rapport de bogues, s'il vous plaît assurez-vous d'avoir lu *CECI* avant.



Temhil
Développé Couché
Fondateur
*****
En ligne En ligne

Sexe: Homme
Messages: 2334


Voir Sa Galerie


Developpeur Python petit scarabée


Voir le profil
« Répondre #5 le: 07 Novembre 2008 18:14:36 »
Citer en réponseCitation

En effet j'avais copie/coller  niark niark, je viens de corriger cela dans le post. merci
Journalisée

Temhil
Développé Couché
Fondateur
*****
En ligne En ligne

Sexe: Homme
Messages: 2334


Voir Sa Galerie


Developpeur Python petit scarabée


Voir le profil
« Répondre #6 le: 08 Novembre 2008 06:57:16 »
Citer en réponseCitation

 arrows_right Utiliser la BDD de xbmc dans un script

Voici un exemple d'acces a la BD de XBMC et d'une requete SQL sur cette BD.
Pour ce faire on utilise le module sqlite3

Merci a Seb pour cet exemple, vous trouverez plus d'informations dans le topic d'origine: Utiliser la BDD de xbmc dans un script
Code
(Python):
import os
home = os.getcwd().replace(';','')
lib = os.path.join(home, 'sqlite3')
sys.path.append(lib)
import sqlite3
 
conn = sqlite3.connect('/home/seb/.xbmc/userdata/Database/MyVideos34.db')
c = conn.cursor()
 
c.execute('select * from movie')
for champ in c:
   print champ


« Dernière édition: 08 Novembre 2008 08:00:14 par Temhil » Journalisée

Temhil
Développé Couché
Fondateur
*****
En ligne En ligne

Sexe: Homme
Messages: 2334


Voir Sa Galerie


Developpeur Python petit scarabée


Voir le profil
« Répondre #7 le: 08 Novembre 2008 07:53:46 »
Citer en réponseCitation

 arrows_right Switch case en Python
Voici deux différentes méthodes permettant de recréer un 'switch case' en Python qui n'est pas supporté nativement par celui-ci


 arrows_right 1ere méthode: lambdas

Source: Simon Willison’s Weblog 

Cette solution est proposée par Simon Willison. Son idée est d'utiliser les lambdas pour recréer les mécanismes du 'switch case' sous la forme:
Code
(Python):
{'option1': function1,
'option2': function2,
'option3': function3,
'option4': function4}[value]()

Ainsi le code PHP suivant:
Code
(PHP):
switch ($value) {
   case 'a':
       $result = $x * 5;
       break;
   case 'b':
       $result = $x + 7;
       break;
   case 'c':
       $result = $x - 2;
       break;
}

Serait traduit en python avec sa méthode comme cela:
Code
(Python):
result = {
 'a': lambda x: x * 5,
 'b': lambda x: x + 7,
 'c': lambda x: x - 2
}[value](x)



 arrows_right 2eme méthode: Orienté Objet et dictionnaires

Source: Well House

Ici on exploite les mecanisme Objets de Python associés aux dictionnaires:
Code
(Python):
""" There is no switch or case in Python ... because you can
do better by using its OO capabilities and a dictionary. """

 
def doblue (): print "The sea is blue"
def dogreen (): print "Grass is green"
def doyellow (): print "Sand is yellow"
 
def redflag ():
  print "Red is the colour of fire"
  print "do NOT play with fire"
 
def errhandler ():
  print "Your input has not been recognised"
 
# set up a dictionary of actions
 
takeaction = {
   "blue": doblue,
   "green": dogreen,
   "yellow": doyellow,
   "red": redflag}
 
colour = raw_input("Please enter red blue green or yellow ")
takeaction.get(colour,errhandler)()
 
# Uses the get method to allow us to specify a default


« Dernière édition: 08 Novembre 2008 07:59:40 par Temhil » Journalisée

Temhil
Développé Couché
Fondateur
*****
En ligne En ligne

Sexe: Homme
Messages: 2334


Voir Sa Galerie


Developpeur Python petit scarabée


Voir le profil
« Répondre #8 le: 08 Novembre 2008 09:11:00 »
Citer en réponseCitation

 arrows_right Plugins pour lancer un script

Merci a Alexsolex pour ce snippet. Vous retrouverez le message original ICI

Résumé:
Pour lancer un script il faut vous rendre en section script. Mais pour lancer un plugin, il faut vous rendre dans la section multimédia concernée par le plugin en question (par exemple fichier/videos/images/musique)
C'est là que ca devient intéressant car un des atouts majeurs pour le plugin est de pouvoir 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('q:\\scripts\\Installeur-Passion\\default.py')
 
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

Temhil
Développé Couché
Fondateur
*****
En ligne En ligne

Sexe: Homme
Messages: 2334


Voir Sa Galerie


Developpeur Python petit scarabée


Voir le profil
« Répondre #9 le: 09 Novembre 2008 05:56:15 »
Citer en réponseCitation

 arrows_right Utiliser la lib shutil pour copier un dossier

Merci a Alexsolex pour ce snippet. Vous retrouverez le message original ICI


Code
(Python):
import shutil
source="q:\skins\monskin\"
destination = "
q:\skins\monskin_bak\
try:
   shutil.copytree(source, destination)
except:
   print "oups ! problème !!"
 

Lien vers la documentation shutil: http://pydoc.org/2.4.1/shutil.html
Journalisée

Temhil
Développé Couché
Fondateur
*****
En ligne En ligne

Sexe: Homme
Messages: 2334


Voir Sa Galerie


Developpeur Python petit scarabée


Voir le profil
« Répondre #10 le: 09 Novembre 2008 06:04:07 »
Citer en réponseCitation

 arrows_right Les dictionnaires

Un petit cours sur les dictionnaires par Alexsolex. Vous retrouverez le message original ICI



Petite précision, les dictionnaires ne sont utiles que si on besoin de les référencer par un 'pointeur'.
Ils sont très pratiques dès lors qu'on a plusieurs infos à mémoriser pour une entrée
Imaginons un carnet d'adresse qui référence pour un utilisateur son téléphone et sa ville :
Code
(Python):
coordonnees= {
                "alexsolex" : ("0123456","paris") ,
                "toto" : ("0234198548","Babeloued") ,
                "bernard" : ("8765321","moscou")
                  }
Ca veut dire que l'élément "alexsolex" de mon carnet est égal à un tuple ("0123456","paris").

Code
(Python):
print coordonnees["alexsolex"]
>>> ("0123456","paris")
tel,ville = coordonnees["alexsolex"]
print tel
>>> 0123456
print ville
>>> paris

mais le tuple peut être lu par un pointeur de liste numérique :
Code
(Python):
user = coordonnees["alexsolex"]
print user[0]
>>> 0123456
print user[1]
>>> paris
 
ou encore

Code
(Python):
print coordonnees["alexsolex"][0]
>>> 0123456
print coordonnees["alexsolex"][1]
>>> paris

Si on veut ordonner les entrées de la liste pour un affichage par exemple :
Code
(Python):
listenoms = coordonnees.keys() #on prend les clés du dictionnaire (les noms)
listenoms.sort() #on trie sur place la liste (elle se réaffecte d'elle même avec les entrées triées)
for nom in listenoms:
   print "%s\n\ttél: %s\n\tville: %s" % (nom, coordonnees[nom][0], coordonnees[nom][1])
ca donne :
Code:
alexsolex
    tél: 0123456
    ville: paris
bernard
    tél: 8765321
    ville: moscou
toto
    tél: 0234198548
    ville: Babeloued

ATTENTION, un dictionnaire ne respecte pas l'ordre dans lequel tu le remplis.
Par exemple si tu rentres A, B puis C dans le dictionnaire dans t ordre, il se peut que tu obtiennes les clés dans un ordre tout différent (B, C et A par exemple) C'est pour cela qu'il faut souvent passer par les clés lorsqu'on veut les afficher ou les utiliser

Les listes (comme les tuples) préservent l'ordre dans lequel elles ont été alimentées. Ainsi si tu mets C, B puis A dans ta liste, tu auras toujours les éléments dans le même ordre : C, B et A

Les listes sont pointables par un entier :
Code
(Python):
maliste = [ "bonjour" , 123, 45.0045, mafonction]
print maliste[1]
>>> 123

Vous remarquerez au passage une intéressante propriété des listes (et des tuples et des dictionnaires aussi d'ailleurs), vous y mettez ce que vous voulez dedans !!! Vous pouvez ainsi ainsi mettre des listes dans des dictionnaires, des tuples dans des listes, des dictionnaires dans des tuples etc etc ...



Journalisée

Temhil
Développé Couché
Fondateur
*****
En ligne En ligne

Sexe: Homme
Messages: 2334


Voir Sa Galerie


Developpeur Python petit scarabée


Voir le profil
« Répondre #11 le: 09 Novembre 2008 06:22:30 »
Citer en réponseCitation

 arrows_right Utiliser le clavier virtuel dans un script (ou plugin)

- Saisie de texte

Code
(Python):
from string import *
import xbmcgui
 
# Recuperation d'un texte via la clavier virtuel
keyboard = xbmc.Keyboard("", heading = "Saisir votre Texte")
keyboard.setHeading('Texte a saisir') # En tete
keyboard.setDefault("Mon texte par defaut") # Texte par defaut qui sera deja affiche a la saisie
keyboard.doModal()
if (keyboard.isConfirmed()):
   inputText = keyboard.getText()
   print"Login: %s"%inputText
 
   # on fait ce que l'on veut avec le texte saisi
   # ...
 
   dialogInfo = xbmcgui.Dialog()
   dialogInfo.ok("Texte saisi", "Votre texte est:", "%s"%inputText)
del keyboard
 


- Saisie d'un mot de passe (caché a l'écran)

Code
(Python):
from string import *
import xbmcgui
 
# Recuperation d'un mot de passe via la clavier virtuel
keyboard = xbmc.Keyboard("", heading = "Saisir votre Mot de passe", hidden = True)
keyboard.setHeading('Mot de passe') # En tete
keyboard.setHiddenInput(True) # On cache le texte a l'ecran
keyboard.doModal()
if (keyboard.isConfirmed()):
   inputText = keyboard.getText()
 
   # on fait ce que l'on veut avec le mot de passe saisi
   # ...
 
   dialogInfo = xbmcgui.Dialog()
   dialogInfo.ok("Mot de passe", "Votre mot de passe a bien été défini")
keyboard.setHiddenInput(False) # optional
del keyboard
 
« Dernière édition: 10 Novembre 2008 18:39:37 par Temhil » Journalisée

alexsolex
Version Pré Alpha
Developpeur
****
Hors ligne Hors ligne

Sexe: Homme
Messages: 1250


Voir Sa Galerie



Voir le profil
« Répondre #12 le: 09 Novembre 2008 14:49:42 »
Citer en réponseCitation

Bonjour

J'ai trouvé et utilisé avec grand succès la technique qui va suivre pour accélérer notablement les temps de téléchargement d'une liste de fichiers.

Utilisation des threads pour partager le téléchargement de plusieurs fichiers :
Astuce trouvée sur le forum développez.net

Code
(Python):
from urllib import urlopen
import threading
from Queue import Queue, Empty
from time import time
 
NUM_THREADS = 40
start = time()
q_in = Queue(0)
q_out = Queue(0)
 
# on remplit q_in avec les url (ici c'est juste un exemple pour tester)
for i in xrange(400):
   q_in.put("http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=%d" % i)
 
def getfiles():
   # fonction exécutée par les threads
   # ici je me contente de sauver le contenu avec l'url dans q_out
   try:
       while True:
           url = q_in.get_nowait()
           f = urlopen(url)
           q_out.put((url,f.read()))
           f.close()
   except Empty:
       # q_in est vide; on a terminé
       pass
 
# on crée et on démarre les threads
for i in xrange(NUM_THREADS):
   t = threading.Thread(target = getfiles)
   t.start()
 
count = 0
# tant qu'il y a des threads actifs ou des résultats disponibles
while threading.activeCount() > 1 or not q_out.empty():
   try:
       # on retire les résultats de la queue
       # on attend au plus 500 ms si la queue est vide
       # le timeout est nécessaire pour éviter une race condition
       url, contents = q_out.get(True, 0.5)
       count += 1
       print url, ':', contents
   except Empty:
       pass
 
print "%d fichiers récupérés en %f secondes" % (count, time() - start)
 
Journalisée

Si tu sais pas taper, il est encore temps d'apprendre : http://www.lecturel.com/clavier/mots-par-minute.php

"Toute idée que nous avons dans l'esprit devient une réalité dans le domaine de la possibilité...", Emile Couet
Temhil
Développé Couché
Fondateur
*****
En ligne En ligne

Sexe: Homme
Messages: 2334


Voir Sa Galerie


Developpeur Python petit scarabée


Voir le profil
« Répondre #13 le: 10 Novembre 2008 18:35:12 »
Citer en réponseCitation

 arrows_right Ajouter un élément au menu contextuel dans les listes (listitem)

Merci a Alexsolex pour ce snippet. Vous retrouverez le message original ICI


Si vous avez consulté la doc de la librairie xbmcgui, vous aurez peut être constaté qu'une méthode permet d'ajouter des éléments au menu contextuel d'un objet 'ListItem'.
J'ai déjà dit moi même dans ce forum que cela ne fonctionnait pas, mais j'en ai trouvé la cause. La doc a une erreur de syntaxe il manque un s au nom de la méthode (addContextMenuItems)
Voici l'élément de la doc qui est erroné et corrigé par votre serviteur : ( http://xbmc.sourceforge.net/python-docs/xbmcgui.html#ListItem-addContextMenuItem )

Code:
addContextMenuItems(...)
    addContextMenuItems([(label, action,)*]) -- Adds item(s) to the context menu for media lists.
     
    [(label, action,)*] : list - A list of tuples consisting of label and action pairs.
      - label           : string or unicode - item's label.
      - action          : string - any built-in function to perform.
     
    List of functions - http://xbmc.org/wiki/?title=List_of_Built_In_Functions
     
    example:
      - listitem.addContextMenuItems([('Theater Showtimes', 'XBMC.RunScript(q:\\scripts\\showtimes\\default.py,Iron Man)',)])

Cette petite correction faite, je pense que bon nombre de développeurs seront intéressé !!! Et moi le premier !
J'ai effectué un test dans un plugin où j'ai rajouté ceci :
Code
(Python):
listitem.addContextMenuItems([("test","XBMC.ReloadSkin()",)])
et ca fonctionne tiptop

Note: Ce snippet est aussi bien pour les scripts que les plugins, mais n'a été testé pour le moment que sur les plugins.
Journalisée

Temhil
Développé Couché
Fondateur
*****
En ligne En ligne

Sexe: Homme
Messages: 2334


Voir Sa Galerie


Developpeur Python petit scarabée


Voir le profil
« Répondre #14 le: 10 Novembre 2008 18:53:46 »
Citer en réponseCitation

 arrows_right Réimporter un module

Voici deux exemples si on veut réimporter un module (utilise si on a change le fichier en cours de route) (il y a certainement d'autre moyens):
Code
(Python):
if sys.modules.has_key("Module"):
   reload(Module)
else:
   import Module
 

Ou encore mieux (merci a Alexsolex):
Code
(Python):
if sys.modules.has_key("monmodule"):
   del sys.modules["monmodule"]
import monmodule

[edit]
Remplacement de la 2eme solution (qui ne marche apparemment pas) et remplacement par une bien meilleur solution proposée par Alexsolex

« Dernière édition: 10 Novembre 2008 19:14:09 par Temhil » Journalisée

Pages: [1] 2 3   Haut de page
  Répondre  |  Envoyer ce fil  |  Imprimer  
 
Forum:  
Aller à:  

+ Réponse Rapide
| Powered by SMF | SMF © 2006-2008, Simple Machines LLC | TinyPortal v0.9.8 © Bloc | Theme by HarzeM |

| Plan Du Site | Wap2 | Imod | Donation

Nos Partenaires: Xbmc France
Page générée en 2.571 secondes avec 34 requêtes. (Pretty URLs adds 0.05s, 2q)