Aller au contenu principal

Dons

Après des années d'une résistance acharnée, nous rendons les armes et acceptons vos dons de bon coeur. Merci à vous. (Lien QR Code en pied de page)
Sujet: Code Snippet (exemples) (Lu 37843 fois) sujet précédent - sujet suivant
0 Membres et 1 Invitédans ce sujet

Code Snippet (exemples)

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:



Re : Code Snippet (exemples)

Répondre #1
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) [Sélectionner]

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) [Sélectionner]

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



Re : Code Snippet (exemples)

Répondre #2
 :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) [Sélectionner]
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) [Sélectionner]
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.

Re : Code Snippet (exemples)

Répondre #3
 :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) [Sélectionner]
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.



Re : Code Snippet (exemples)

Répondre #4
Salut bonne idée ça  :smiley:

Mais faudrais pas reproduire mes fautes ou en mettre de plus  :gniark:

- regardex == regardez

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

Code: (python) [Sélectionner]

#Code générale pour imprimer

print "ok ok je sors"


:sweat:
joke inside
frost
FIGHT THE DEAD
FEAR THE LIVING


Retired Team Founder


Re : Code Snippet (exemples)

Répondre #6
 :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) [Sélectionner]
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




Re : Code Snippet (exemples)

Répondre #7
 :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) [Sélectionner]
{'option1': function1,
'option2': function2,
'option3': function3,
'option4': function4}[value]()


Ainsi le code PHP suivant:
Code: (php) [Sélectionner]
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) [Sélectionner]
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) [Sélectionner]
""" 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



Re : Code Snippet (exemples)

Répondre #8
 :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) [Sélectionner]
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 !

Re : Code Snippet (exemples)

Répondre #9
 :arrows_right: Utiliser la lib shutil pour copier un dossier

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


Code: (python) [Sélectionner]
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

Re : Code Snippet (exemples)

Répondre #10
 :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) [Sélectionner]
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) [Sélectionner]
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) [Sélectionner]
user = coordonnees["alexsolex"]
print user[0]
>>> 0123456
print user[1]
>>> paris

ou encore

Code: (python) [Sélectionner]
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) [Sélectionner]
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 :
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) [Sélectionner]
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 ...




Re : Code Snippet (exemples)

Répondre #11
 :arrows_right: Utiliser le clavier virtuel dans un script (ou plugin)

- Saisie de texte

Code: (python) [Sélectionner]
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) [Sélectionner]
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

Re : Code Snippet (exemples)

Répondre #12
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) [Sélectionner]
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)

Re : Code Snippet (exemples)

Répondre #13
 :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 )

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) [Sélectionner]
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.

Re : Code Snippet (exemples)

Répondre #14
 :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) [Sélectionner]

if sys.modules.has_key("Module"):
    reload(Module)
else:
    import Module


Ou encore mieux (merci a Alexsolex):
Code: (python) [Sélectionner]

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


Re : Code Snippet (exemples)

Répondre #15
hum
Il me semble que la 2ieme solution ne fonctionne pas.

Si on a modifié le module importé le script ne prendra pas en compte les modifications même malgré un simple del module.

Pour ma part le résultat le meilleur constaté est comme suit :
Code: (python) [Sélectionner]
if sys.modules.has_key("monmodule"):
    del sys.modules["monmodule"]
import monmodule


Re : Code Snippet (exemples)

Répondre #17
Merci a Alexsolex pour ces snippets. Vous retrouverez le message original ICI

:arrows_right: Comment importer un un module (fichier .py) dans un sous-répertoire

Il s'agit en fait d'ajouter un chemin pour recherche pour les librairies avec le module sys

Par exemple si vous voulez importer le fichier :
\passion-XBMC\divers\lib\passion.py

Faites :
Code: (python) [Sélectionner]
CHEMIN_LIB = "q:\scripts\passion-XBMC\divers\lib\"
import sys
sys.path.append(CHEMIN_LIB)

#maitenant python cherchera aussi dans ce chemin pour y trouver les libs que tu demandes et donc :
import passion #fonctionne normalement




:arrows_right: Comment importer un module via une variable

Code: (python) [Sélectionner]
mon_module_import = "passion"
exec("import %s"%mon_module_import)

a noter que je ne sais plus si exec est une commande python ou si ca dépend d'un module mais je pense que c'est intégré


Re : Code Snippet (exemples)

Répondre #18
Voila suite à une demande...

Mettre de la vie dans un texte d'XBMC


Code: (python) [Sélectionner]

#Comment mettre de la couleur dans un texte.
#note: les couleurs du themes en fonction peut etre utiliser. \skin\PM3.HD\colors\defaults.xml
#<color name="green">ffe2ff43</color>  qui nous donnent print "[COLOR=green"]MOT QUI VA ETRE EN VERT[/COLOR]"
#remarque qu'au changement de themes on risque de perdre notre couleur qui est déffinie
#Le mieux est de faire print "[COLOR=ffe2ff43]MOT QUI VA ETRE EN VERT[/COLOR]"

red_color = "FFFF0000"
text_color = "Rouge"

label_formatting = "[COLOR=%s]%s[/COLOR]" % ( red_color, text_color, )
print label_formatting

text = "le feu de circulation est rouge, il faut attendre le feu vert."
text = text.replace( "rouge", label_formatting )

#pourquoi pas en faire un autre
text = text.replace( "vert", "[COLOR=ffe2ff43]vert[/COLOR]" )
print text


# Encore plus mettre un mot en gras ou en italic
print "[B]bold[/B] - bold text."
print "[I]italics[/I] - italic text."

# Plus sur le label formatting visite le manuel xbmc: http://xbmc.org/wiki/?title=Label_Formatting




Plus sur le label formatting visite le manuel xbmc: http://xbmc.org/wiki/?title=Label_Formatting

[edit]
- ajouter: lien sur les infos du Label_Formatting en dehors du code python :eye:
FIGHT THE DEAD
FEAR THE LIVING


Retired Team Founder

Re : Code Snippet (exemples)

Répondre #19
Super snippet je n'avais aucune idée que XBMC supportait cela, ou vas tu chercher tout cela???  :gniark:

Re : Code Snippet (exemples)

Répondre #20
Tiens une question, est-ce qu'il y a moyen avec cette méthode de définir la taille du texte?
Ça serait super intéressant car le font10 ou font12, je trouve cela super limite pour définir la taille du texte.

[edit]
Et pour souligner ton texte? Il semble que
[U]mon texte[\U] 

ne fonctionne pas

Re : Re : Code Snippet (exemples)

Répondre #21

Tiens une question, est-ce qu'il y a moyen avec cette méthode de définir la taille du texte?
Ça serait super intéressant car le font10 ou font12, je trouve cela super limite pour définir la taille du texte.

Oui tu as eu la même pensé que moi... :gniark: mais non pas de support pour [ FONT = 14 ] balbla [ / FONT ].
Faudrait le demander à la team apres leur finalisation de leur trac.
Et pour infos les font sont pas limitées à 10 et 12 :exclam:
regarde par exemple le skin pm3: balise <fontset id="Default" unicode="true">
les grandeurs par défaut sont indiquées: http://xbmc.svn.sourceforge.net/viewvc/xbmc/trunk/XBMC/skin/Project%20Mayhem%20III/PAL/Font.xml?view=markup&sortby=date

Et de plus si on indique pas de font dans un code par défaut il prend cette référence:
http://xbmc.svn.sourceforge.net/viewvc/xbmc/trunk/XBMC/skin/Project%20Mayhem%20III/PAL/defaults.xml?view=markup&sortby=date
Code: (xml) [Sélectionner]

<default type="label">
  <posx>80</posx>
  <posy>60</posy>
  <label>-</label>
  <font>font13</font>
  <textcolor>white</textcolor>
</default>



Et pour souligner ton texte? Il semble que
[U]mon texte[\U] 

ne fonctionne pas

Tiens tu as trouvé ca ou, car moi j'ai jamais parlé de cela :exclam:

Citer
ou vas tu chercher tout cela???

:gniark:
Secret de travail, non sérieux:
- XBMC Online Manual
- Directement des sources
- Et bien sur la doc officiel python.org et celle que j'ai mis a jour dernièrement  :sweat:

[edit]
j'ai mis des espace a [ FONT = 14 ] balbla [ / FONT ]. car le forum reconnait et l'affiche pas :exclam:

FIGHT THE DEAD
FEAR THE LIVING


Retired Team Founder


Re : Code Snippet (exemples)

Répondre #23
 :arrows_right: Lancer une application externe dans XBMC

Voici un exemple de script python vous permettant de lancer une application externe (ici Firefox sous Windows) dans XBMC.
Merci a Frost pour ce Snippet.

Vous pouvez copier/coller ce code dans un fichier et l'enregister sous le nom firefox.py par exemple (ou bien integrer ce code a un script/plugin plus complexe). Cela ouvrira Firefox a partir de XBMC.

Code: (python) [Sélectionner]

import xbmc
# Execute shell commands and freezes XBMC until shell is closed
cmd = "System.ExecWait"

# Execute shell commands
#cmd = "System.Exec"

command = '%s("%s")' % ( cmd, "C:\\Program Files\\Mozilla Firefox\\firefox.exe" )
xbmc.executebuiltin( command )






Re : Code Snippet (exemples)

Répondre #24
 :arrows_right: Forcer le loglevel depuis un script ou un plugin

Voici un snippet réalisé par Alexsolex vous montrant comment activer le loglevel directement depuis un script:

Code: (python) [Sélectionner]
#pour récupérer le log level actuel (utile pour le rétablir si besoin après l'exécution du script)
actualloglevel = xbmc.executehttpapi("GetLogLevel").replace("<li>","")

#pour régler le loglevel sur la valeur désirée (ici à 1):
status = xbmc.executehttpapi("SetLogLevel(1)").replace("<li>","")
#si tout c'est bien passé, status contient "OK"


Pour information <li> (list item) est une balise html pour mettre en forme le résultat de retour.
Vous pouvez suivre le fil de discutions d'origine ICI

Re : Code Snippet (exemples)

Répondre #25
 :arrows_right: Déterminer la plate-forme sur laquelle XBMC tourne

Voici une petite fonction bien pratique réalisée par Frost vous permettant de déterminer sur quel plate-forme XBMC  s'exécute:

Code: (python) [Sélectionner]

import xbmc

def get_system_platform():
    """ fonction: pour recuperer la platform que xbmc tourne """
    platform = "unknown"
    if xbmc.getCondVisibility( "system.platform.linux" ):
        platform = "linux"
    elif xbmc.getCondVisibility( "system.platform.xbox" ):
        platform = "xbox"
    elif xbmc.getCondVisibility( "system.platform.windows" ):
        platform = "windows"
    elif xbmc.getCondVisibility( "system.platform.osx" ):
        platform = "osx"
    return platform





Et voici une autre méthode de tester que vous êtes sur Mac par exemple:
Code: (python) [Sélectionner]

if os.environ.get( "OS", "" ).lower() == "os x":
    print "Platform MAC"

Re : Code Snippet (exemples)

Répondre #26
 :arrows_right: Utiliser 'special://'  dans un chemin

Les dernières releases de XBMC ont introduit un nouveau format dans le type de chemins, ceux-ci peuvent etre désormais identifies par special:// qui remplace les anciens Q:, P:, T:, U:, Z:
Voici un petit résumé mais je vous conseille de lire les informations tres importante du Blog XBMC de jmarshall sur ce sujet et ce sujet sur le forum officiel:


  • Utilisez special://home/ (anciennement U:\\) si vous avez besoin de lire/écrire dans la partie modifiable de l'installation de XBMC


  • Utilisez special://profile/ (anciennement P:\\) si vous avez besoin de lire/écrire dans le répertoire userdata de l'utilisateur courrant.


  • Utilisez special://temp/ (anciennement Z:\\) si vous avez besoin de lire/écrire a dans un emplacement temporaire.



Si vous en avez réellement besoin vous pouvez aussi:

  • Utilisez special://xbmc/ (anciennement Q:\\) pour lire dans le répertoire même d'installation de XBMC.


  • Utilisez special://masterprofile/ (anciennement T:\\)  pour lire pour dans le répertoire userdata de l'utilisateur maître/principal (master users)



Attention: Utilisez xbmc.translatePath() pour traduire tout chemin (XBMC) vers son réel chemin (au niveau OS) lorsque vous avez besoin lire ou écrire dans le systeme de fichier (dépendant donc de l'OS).




Maintenant voici un snippet sur la facon de couvir tous les cas, car certains version de XBMC (sur certains OS ou trop anciennes) ne supportent pas bien le chemin  'special://'.
Cet exemple est une librairie réalisée par Frost (merci a lui) dans l'installer Passion-XBMC qui couvre je pense tous les cas:
Code: (python) [Sélectionner]
# If the dir exists with the requested name, simply return it

__all__ = [
    # public names
    "XBMC_IS_HOME",
    "SPECIAL_XBMC_DIR",
    "SPECIAL_HOME_DIR",
    "SPECIAL_TEMP_DIR",
    "SPECIAL_PROFILE_DIR",
    "SPECIAL_MASTERPROFILE_DIR",
    "SPECIAL_XBMC_HOME",
    "SPECIAL_SCRIPT_DATA",
    ]


import os
import sys
from xbmc import translatePath


PLATFORM_MAC = os.environ.get( "OS", "" ).lower() == "os x"


try: scriptname = sys.modules[ "__main__" ].__script__
except: scriptname = os.path.basename( os.getcwd() )


SPECIAL_XBMC_DIR = translatePath( "special://xbmc/" )
if PLATFORM_MAC or not os.path.isdir( SPECIAL_XBMC_DIR  ): SPECIAL_XBMC_DIR = translatePath( "Q:\\" )

SPECIAL_HOME_DIR = translatePath( "special://home/" )
if PLATFORM_MAC or not os.path.isdir( SPECIAL_HOME_DIR  ): SPECIAL_HOME_DIR = translatePath( "U:\\" )

SPECIAL_TEMP_DIR = translatePath( "special://temp/" )
if PLATFORM_MAC or not os.path.isdir( SPECIAL_TEMP_DIR  ): SPECIAL_TEMP_DIR = translatePath( "Z:\\" )

SPECIAL_PROFILE_DIR = translatePath( "special://profile/" )
if PLATFORM_MAC or not os.path.isdir( SPECIAL_PROFILE_DIR  ): SPECIAL_PROFILE_DIR = translatePath( "P:\\" )

SPECIAL_MASTERPROFILE_DIR = translatePath( "special://masterprofile/" )
if PLATFORM_MAC or not os.path.isdir( SPECIAL_MASTERPROFILE_DIR  ): SPECIAL_MASTERPROFILE_DIR = translatePath( "T:\\" )

SPECIAL_XBMC_HOME = ( SPECIAL_HOME_DIR, SPECIAL_XBMC_DIR )[ ( os.environ.get( "OS", "xbox" ).lower() == "xbox" ) ]

XBMC_IS_HOME = SPECIAL_HOME_DIR == SPECIAL_XBMC_DIR

SPECIAL_SCRIPT_DATA = os.path.join( SPECIAL_PROFILE_DIR, "script_data", scriptname )
if not os.path.isdir( SPECIAL_SCRIPT_DATA ): os.makedirs( SPECIAL_SCRIPT_DATA )


Vous pouvez constater le cas particulier de XBMC sur Mac, pour une raison obscure a l'heure actuel le test os.path.isdir sur les chemins 'special://' ne fonctionne pas proprement, aussi on contourne ce problème en verifiant si on est sur Mac.
Sinon on vérifie si XBMC reconnaît un chemin 'special://' et si ce n'est pas le cas, on utilise l'ancien format des chemins Q:, P:, T:, U:, Z:


[edit]
Voici un nouveau fil de discutions sur ce sujet : changement des chemins internes à XBMC

Code Snippet (exemples) - Minimiser XBMC

Répondre #27
 :arrows_right: Minimiser XBMC

Code: (python) [Sélectionner]

import xbmc

# Quit Quit XBMC (same as XBMC.Dashboard on Xbox)
# Suspend Suspends (S3 / S1 depending on bios setting) the System (not working on Xbox due to hardware limitations)
# Hibernate Hibernate (S5) the System (not working on Xbox due to hardware limitations)
# Powerdown Powerdown system
# Minimize Minimize XBMC to tools bar
state = { "quit": 0, "suspend": 1, "hibernate": 2, "powerdown": 4, "minimize": 5 }

# print current user setting shutdownstate
user_state = xbmc.executehttpapi( "GetGuiSetting(0;system.shutdownstate)" ).replace( "<li>", "" )
print user_state
# force setting shutdownstate to minimize
print xbmc.executehttpapi( "SetGUISetting(0;system.shutdownstate;%i)" % state[ "minimize" ] ).replace( "<li>", "" )
# print forced setting shutdownstate
print xbmc.executehttpapi( "GetGuiSetting(0;system.shutdownstate)" ).replace( "<li>", "" )

# XBMC.ShutDown Trigger default Shutdown action defined in System Settings,
# Default Powerdown on Xbox and Quit on Linux / OSX / Windows
xbmc.shutdown()

# replace preference user setting shutdown state
print xbmc.executehttpapi( "SetGUISetting(0;system.shutdownstate;%i)" % int( user_state ) ).replace( "<li>", "" )


NB: Vous remarquerez qu'à la fin on replace les préférences de l'utilisateur de l'état d'arrêt, simplement pour pas le rendre malheureux.

frost

[edit] message édité par Temhil: ajout du titre au même format que les autres snippets
FIGHT THE DEAD
FEAR THE LIVING


Retired Team Founder

Re : Code Snippet (exemples)

Répondre #28
:arrows_right: Minimiser XBMC (Méthode simple)

Code: (python) [Sélectionner]

import xbmc

xbmc.executebuiltin( "XBMC.Minimize()" )


FIGHT THE DEAD
FEAR THE LIVING


Retired Team Founder

Re : Code Snippet (exemples)

Répondre #29
 :arrows_right: Remplacer un mot en masse dans un fichier

Code: (python) [Sélectionner]

import os
import string


def replaces( source, search_for, replace_with ):
   # set temporary files
   back = os.path.splitext( source )[ 0 ] + ".bak"
   temp = os.path.splitext( source )[ 0 ] + ".tmp"
   # remove temp file if exists
   try: os.remove( temp )
   except os.error: pass
   # open source and temp file
   fi = open( source )
   fo = open( temp, "w" )
   # read lines of source file
   for line in fi.readlines():
       # temp file, write line with replaced str
       fo.write( string.replace( line, search_for, replace_with ) )
   # end replace close source and temp file
   fi.close()
   fo.close()
   # remove backup file if exists
   try: os.remove( back )
   except os.error: pass
   # now rename original file into backup
   os.rename( source, back )
   # and rename temp into new source
   os.rename( temp, source )


source_file = "test_replaces.xml"
search_for = "Salut"
replace_with = "Bonjour"

replaces( source_file, search_for, replace_with )
FIGHT THE DEAD
FEAR THE LIVING


Retired Team Founder

Re : Code Snippet (exemples)

Répondre #30
 :arrows_right:Découper une liste en plusieurs partie égal

La fonction:
Code: (python) [Sélectionner]

def splitlist( iterable, start=0, step=30, end=0 ):
   """Return a list containing an slice of iterable.
   start (!) defaults to 0.; step is split index, (!) defaults to 30.; end (!) defaults to 0.
   For example, splitlist(range(4)) returns [[0, 1, 2, 3]].
   """
   try:
       splited = []
       if end <= 0:
           end = len( iterable )

       for index in xrange( step, end, step ):
           splited.append( iterable[ start:index ] )
           start = index
       splited.append( iterable[ start:end ] )

       return splited
   except:
       from traceback import print_exc
       print_exc()

   return [ iterable ]


Un exemple:
Code: (python) [Sélectionner]

import string
maliste = list( string.printable )
print maliste
print

# splitlist( iterable, start=0, step=30, end=0 ) )
splited = splitlist( maliste )

print "Nombre total d'items", len( maliste )
print "Nombre de listes", len( splited )

for count, liste in enumerate( splited ):
   print "liste #", count+1
   print len( liste ), liste
   print
"""
>>>
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', ':',
';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~', ' ', '\t', '\n', '\r', '\x0b', '\x0c']

Nombre total d'items 100
Nombre de listes 4
liste # 1
30 ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't']

liste # 2
30 ['u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X']

liste # 3
30 ['Y', 'Z', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`']

liste # 4
10 ['{', '|', '}', '~', ' ', '\t', '\n', '\r', '\x0b', '\x0c']

>>>
"""




Après 1 heure de recherche sur le web avec aucun résultat valable. J'ai créé cette fonction made in Frost  :smiley: si vous avez plus simple merci de mettre votre Snippet
FIGHT THE DEAD
FEAR THE LIVING


Retired Team Founder

Re : Code Snippet (exemples)

Répondre #31
 :arrows_right: Parser un XML

Afin de parser un XML dans XBMC vous aurez le choix entre plusieurs module tels que:


  • ElementTree: Tres rapide a parser mais aussi tres sensible aux erreurs dans un XML

  • BeautifulSoup: Moins rapide qu'ET mais supporte des XML 'moins standards'

  • minidom: un grand classique, plus d'info sur le site officiel ICI, voici un snippet LA

  • lxml: a ses fans aussi, plus d'infos ICI

  • Et certainement d'autres ...



Je n'ai pour ma part eu l'occasion que de comparer ElementTree et BeautifulSoup
Voici donc deux exemple de code parsant le meme XML, l'un avec ElementTree, l'autre avec Beautifulsoup

:arrows_right: Exemple avec BeautifulSoup
Code: (python) [Sélectionner]
from BeautifulSoup import BeautifulStoneSoup

soup =  BeautifulStoneSoup((open(os.path.join(CACHEDIR, XMLFile), 'r')).read())
cat_scrapers = soup.find("scrapers")

if cat_scrapers != None:
for item in cat_scrapers.findAll("entry"):
if hasattr(item.title,'string'):
if item.title.string != None:
title = item.title.string.encode("cp1252")
if hasattr(item.version,'string'):
if item.version.string != None:
version = item.version.string.encode("utf-8")
if hasattr(item.lang,'string'):
if item.lang.string != None:
language = item.lang.string.encode("utf-8")
if hasattr(item.date,'string'):
if item.date.string != None:
date = item.date.string.encode("cp1252")
if hasattr(item.previewvideourl,'string'):
if item.previewvideourl.string != None:
previewVideoURL = item.previewvideourl.string.encode("utf-8")


:arrows_right: Exemple avec ElementTree
Code: (python) [Sélectionner]
import elementtree.ElementTree as ET

elems      = ET.parse( open( os.path.join( CACHEDIR, XMLFile ), "r" ) ).getroot()
cat_scrapers = elems.find( "scrapers" ).findall( "entry" )

for item in cat_scrapers:
title             = item.findtext( "title" )
version           = item.findtext( "version" )
language          = item.findtext( "lang" )
date              = item.findtext( "date" )
added             = item.findtext( "added" )
previewVideoURL   = item.findtext( "previewVideoURL" )


Dans les deux bien sur cas vous devrez couvrir en plus les exceptions en utilisant des blocs try/except

 
Simple Audio Video Embedder