Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites". Attention, le forum rencontre actuellement quelques difficultés. En cas d'erreur 502, il ne faut pas re-valider l'envoi d'un message ou l'ouverture d'une discussion, au risque de créer un doublon.

La section divers se réorganise ! De nouvelles sous-sections à venir. (plus d'infos + donner son avis)

#1676 Le 29/03/2013, à 05:12

nassertom

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

re bonjour,

voici les scripts que j'utilise pour faire la conversion à la volé de vidéo.
je sais que ce type de script est en abondance sur le réseau cependant je n'ai jamais trouvé mon bonheur.

en quelques mots :
- traitement en masse
- répertoire source vers cible
- choix de l'extension source
- selection du français pour les sources avec plusieurs pistes audio
- choix du nombre de conversion à faire en simultané
- vérification de la présence des fichiers avant la conversion (en cas de traitement en plusieurs lot...)
- création de plusieurs fichiers de log (fichier erreur, réussi, log... => le but pour moi est de faire un tail -f sur le log de mon choix durant l'execution)

le fonctionnement est le suivant : un script est appelé avec comme paramètre le nombre de thread (je sais que ce n'est pas un vrai thread...) l'extension cherché, le répertoire source puis la cible

ce script va appelé un autre script (l'évolution aurait été de s'appelé soit même en récursif!! je suis trop fainéant pour le faire en ce moment lol)

si le fichier à convertir existe déjà en avi dans l'arborescence cible alors la conversion n'est pas faite (et la log des fichiers déjà présent est valorisé)
place au code :
le script à appeler

#!/bin/bash
if [ $# != 4 ] # Test le nombres de paramètre passé au shell
then
	echo erreur dans la saisie des paramètres;
	echo "essayer : sh $0 nbTread /repertoire_source /repertoire_cible extension";
	exit 0 # Quitte le shell
elif [ ! -d "$2" -o ! -d "$3" ] # Test que les paramètres soient bien des repertoires
then
	echo il faut renseigner des répertoirs dans les paramètres;
	exit 0
fi

#Paramètres du shell
repertoirSource="${2%/}/" # Supprime le slash de la fin si il existe puis en ajoute un (pour éviter d'en avoir 2 si l'utilisateur l'avait mis)
repertoirCible="${3%/}/"
extension="${4}"
UserValueThread=$1

  # start threads
  for i in $(seq 1 $UserValueThread)
  do
    	echo "started instance no: $i"
  	./filesToAvi.sh $repertoirSource $repertoirCible $extension true &

 	sleep 2
  done

le second script qui se nomme filesToAvi.sh

#!/bin/bash

if [ $# != 4 ] # Test le nombres de paramètre passé au shell
then
	echo erreur dans la saisie des paramètres;
	echo "essayer : sh $0 /repertoire_source /repertoire_cible extension true/false";
	echo "true veut dire création de l'arboréssence de la source vers la cible";
	exit 0 # Quitte le shell
elif [ ! -d "$1" -o ! -d "$2" ] # Test que les paramètres soient bien des repertoires
then
	echo il faut renseigner des répertoirs dans les paramètres;
	exit 0
fi
#Paramètres du shell
repertoirSource="${1%/}/" # Supprime le slash de la fin si il existe puis en ajoute un (pour éviter d'en avoir 2 si l'utilisateur l'avait mis)
repertoirCible="${2%/}/"
extension="${3}"
creatFolder="${4}"
cible="${repertoirCible}"
#Fichiers de log pour exploitation future
log="$repertoirCible"log.txt
existant="$repertoirCible"existant.txt
absent="$repertoirCible"absent.txt
erreur="$repertoirCible"erreur.txt

flag="non" #Drapeau pour communiquer entre les fonctions
maintenant=$(date) #Pour afficher l'heure et la date dans le fichier de log
#Fonction pour mettre à jour le repertoire à créer
actualiseRepertoireCible(){
if [ $creatFolder = "true" ] # si je dois reproduire l'arboressence
cible=$(echo "${1}"|sed "s#${repertoirSource}#${repertoirCible}#g") # remplace le repertoire source par la cible
cible="${cible%/}/"
then
	if [ ! -d "${cible}" ] # Test si le repertoire existe
	then 
	# si il n'existe pas alors je le cré
	mkdir -p "${cible}"
	fi
fi
}
#Fonction pour mettre à jour la date et heure dans la variable.
actualiseTimeOfTreatment() {
	maintenant=$(date '+%Y-%m-%d %H:%M:%S')
}
#Fonction métier besoin de ripper des fichiers mkv en avi avec une selection automatique de la langue francaise si présente
actionMKVtoAVI() {
	fichier="${1##*/}" #Récupération du nom de fichier passé en paramètre (idem que d'utiliser basename)
	echo "${maintenant};${1};demande de conversion." >> "$log";
		# recherche le mapping des pistes audio FR via la commande ffmpeg -i
		# redirection de la sortie 2 vers la 1 car ffmpeg n'affiche pas les informations à l'écran via la sortie standard.
		# recuperation du resultat de grep dans la variable.
	audio=`/var/subsonic/transcode/ffmpeg -i  "$1" 2>&1| grep '(fre): Audi'`
		# supprime de la variable 'Stream #' ainsi que tous ce qui le precede.
	audio="${audio##*Stream #}"
		# supprime de la variable '(fre)' et tous ce qui suit
	audio=${audio%(fre)*}
		# la variable contien à ce moment là soit le mappage attendu pour le francais (ex: '0.1') soit rien
		# même principe pour le mappage de la vidéo car pour mapper en manuel dans ffmpeg il faut lui donner l'ensemble des flux.
		# recherche le mapping de la video via la commande ffmpeg -i
	video=`/var/subsonic/transcode/ffmpeg -i  "$1" 2>&1| grep ': Video'`
	video="${video##*Stream #}"
	video=${video%%(*}
		# si piste audio FR détecté alors force le map dans la conversion.
		# pas de test sur la variable vidéo car en cas d'erreur c'est ffmpeg qui prendra en charge de mapper automatiquement la première piste vidéo.
	if ["${audio}" -e ""]
	then
		echo "${maintenant};${1};Pas de piste audio française trouvée." >> "$log";
		echo "${maintenant};${1};ffmpeg -i $1 -async 1 -s 720x576 -r 24 -ab 128k -b 1200k -aspect 16:9 -ac 2 -v 0 -f avi ${cible}${fichier%.*}.avi" >> "$log";
		/var/subsonic/transcode/ffmpeg -i "$1" -async 1 -s 720x576 -r 24 -ab 128k -b 1200k -aspect 16:9 -ac 2 -v 0 -f avi "${cible}${fichier%.*}".avi;
	else
		echo "${maintenant};${1};Piste audio française trouvée." >> "$log";
		echo "${maintenant};${1};ffmpeg -i $1 -async 1 -s 720x576 -r 24 -ab 128k -b 1200k -aspect 16:9 -map ${video} -map ${audio} -ac 2 -v 0 -f avi ${cible}${fichier%.*}.avi;" >> "$log";
		/var/subsonic/transcode/ffmpeg -i "$1" -async 1 -s 720x576 -r 24 -ab 128k -b 1200k -aspect 16:9 -map "${video}" -map "${audio}" -ac 2 -v 0 -f avi "${cible}${fichier%.*}".avi;
	fi 
}
actionScript() {
actualiseTimeOfTreatment #demande de mise à jour de la variable temps (maintenant)
if [ "$flag" = "non" ] #Si fichier non trouvé
	then 	
		echo "$1" >> "$absent";
		actionMKVtoAVI "$1"
	else	#Si fichier trouvé	
		echo "${maintenant};${1};${flag}" >> "$log" ;
		echo "$1" >> "$existant";
	fi 
	return
}
rechercheCible() { #Dans le cas des boucles for le résultat d'un repertoir n'est pas fini par un '/' c'est pourquoi je l'ajoute apres ${u}"/"
	for u in "$1"* ;do  #Boucle sur tout le contenu du repertoir passé en paramètre
		if [ -d "$u" ] #Si repertoire
		then
			if [ -f "${u}"/"$2" ] #si le fichier existe dans le répertoire 
			then
				flag="${u}"/"$2"  #valorise le flag pour dire que le fichier est présent					
				return  #quitte la fonction
			else
				rechercheCible "${u}/" "$2" #sinon explore le contenu de ce nouveau répértoire
			fi
		fi
	done
	return #Si je sorts ici alors c'est que je n'ai rien trouvé...
}
rechercheSource() {
	for i in "$1"* ;do #Boucle sur l'ensemble des fichiers 
		flag="non" #Passe le drapeau à non avant de faire la recherche dans le repertoire cible
		if [ -d "$i" ] #Si repetoire
		then 
			rechercheSource "${i}/"  #Recherche dans le sous répertoire
		else
			currentExtension="${i##*.}" #Extraction de l'extension
			nom="${i##*/}"	#extraction du nom de fichier		
			if [ "$currentExtension" = "${extension}" ]
			then	
				if [ -f "${repertoirCible}${nom%.*}".avi ] #si le fichier existe dans le répertoire cible
				then
					flag="${repertoirCible}${nom%.*}".avi  #valorise le flag pour dire que le fichier est présent
					actionScript "$i" #Demande l'execution d'une action	
				else
					rechercheCible "$repertoirCible" "${nom%.*}".avi #recherche sa présence dans les sous répértoires Cible (apres avoir changé son extension)
					if [ "$flag" = "non" ] #Si fichier non trouvé
					then
						actualiseRepertoireCible "$1" #Afin de créer le repertoire cible.	
					fi		
					actionScript "$i" #Demande l'execution d'une action
				fi
			else
				echo "${maintenant};${1};n'est pas un fichier $extension">> "$log";
				echo "$i" >> "$erreur";
			fi
		fi
	done
	return
}

rechercheSource "$repertoirSource" 

echo "Job's done by Tom";

dans ce dernier code j'ai précisé l'adresse de mon ffmpeg car j'execute ce code sur un serveur d'application qui utilise son propre ffmpeg il vous faudra la modifier.
changer

/var/subsonic/transcode/ffmpeg 

par

ffmpeg

Cordialement,
Thomas R

Dernière modification par nassertom (Le 29/03/2013, à 05:19)


C'est la plus radicale manière d'anéantir tout discours que d'isoler chaque chose de tout le reste; car c'est par la mutuelle combinaison des formes que le discours nous est né.
[ Le Sophiste, 259e ]

Hors ligne

#1677 Le 02/04/2013, à 17:49

caracolito

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Bonjour,

J'aimerai pouvoir utiliser ce script Python en mode fenetre avec un truc comme Zenity, mais je suis incompetent.

Voici le script qui consiste a transformer un fichier .csv en au autre utilisable par le logiciel homebank

Une fenetre qui me demanderai le fichier a convertir, le fichier  de definitions et le fichier sortie
selon la syntaxe du script python ci-apres.

Merci pour votre aide.
Pierre

Convert_x.x.x.py [import.csv] [output.csv] [import.def] ____

                 [import.csv] = ("bank".csv)    file exported from bank
                 [output.csv] = (homebank.csv)  file to be created
                 [import.def] = ("bank".def)    definition-file "bank" <> "Homeb
et le script ci-dessous que j'ai récupéré je ne sais plus ou

#!/usr/bin/env python
#
#  Convert_v1.3
#  Copyright (c)Ton van Twuyver @ <profiler1234@gmail.com>
#
#  This script is written with "HomeBank" in mind. <http://homebank.free.fr>
#  Purpose:    to convert any Bank-file.csv into Homebank.csv by means of a definition-file.
#  
#  Convert.py is written in Python(2.6) and free software,
#  It is distributed in the hope that it will be useful, but comes WITHOUT ANY WARRANTY;
#  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#  See the GNU General Public License for more details.
#  You can redistribute it and/or modify it under the terms of the GNU General Public License
#  as published by the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  GNU General Public License @ <http://www.gnu.org/licenses/>.
#

import os
import sys
import re
print
#### CsvConvert####################################

class CsvConvert:
    """ reads and converts [import.csv] with [definition.def] rules """
    
    def __init__(self, fromfile_, deffile_, tofile_, logfile_):
    
        # parse definition-file and create conversion-lists
        def_eof = False
        n  = 0                                  # (definition line counter)
        fld  = 0                                # (valid fields present)
        d_old   = ''
        hb = []                                 # homebank conversion-list
        ip = []                                 # import   conversion-list
        
        Hdl  = 0
        date = ''
        code = ''
        posneg = ''
        hd_acc_ln = []
        hd_bal_ln = []
        hd_len = 0
        while not def_eof:
            # Definition-file PARSER --------------------------------------
            
            n += 1                              # line count
            def_line = deffile_.readline()
            # def_eof
            if len(def_line) < 1:
                def_eof = True
                
            def_line = def_line.rstrip('\n')
            d = def_line.split(';')
            # valid definition header line length is 3
            if (len(d) == 3) and (d[0] == 'H'):
                # Extract Details # of header-lines to be skiped
                Hdl = int(d[2])                
            # valid definition field line length is 5
            if (len(d) == 5):
                # definition line contains already defined field -> improper "not-in-use" data ?
                if (d_old == d[0]) and (int(d[2]) < 0):
                    print 'Error in definition-file-record[%s]: field already defined !'% n
                    logfile_.write('Error in definition-file-record[%s]: field already defined ! \n'% n)
                else:
                    # Extract Details for Date,Paycode,Sign:
                    if (d[2].rstrip() != ''):
                        # Date
                        if  int(d[0]) == 0:     date = d[4]
                        # PayCode
                        elif int(d[0]) == 1:
                            code = d[4]
                            # Code-detail content needs checking:
                            #   starts with N-items of bank-code, followed by N-items of homebank-code
                            #   so, the total should always be an even-amount of items !!
                            cod_ = (d[4].split(','))
                            Even = len(cod_)-(len(cod_)/2)*2    # this is zero if Even
                            if (Even != 0):
                                print 'Error in definition-file: paycode detail-data ncorrect, Not correct amount of items'
                                logfile_.write('Error in definition-file: paycode detail-data Incorrect, Not correct amount of items \n')
                        # Sign (Amount)
                        elif int(d[0]) == 5:    posneg = d[4]
                    # Extract Details for Header [line-number,item]
                    if int(d[2].rstrip()) <= -2:
                        # store last header-line
                        hd_len = abs(int(d[2]))
                        # account-number
                        if int(d[0]) == 7:      hd_acc_ln = d[4].split(',')
                        # balance
                        elif int(d[0]) == 8:    hd_bal_ln = d[4].split(',')
                    # count valid fields def.    
                    if (int(d[2]) > -1):    fld = fld + 1
                    # create conversion-lists        
                    hb.append(int(d[0]))
                    ip.append(int(d[2]))
                    
                d_old = d[0]                    # remember curr. field-data
            # rest is invalid definition line
        print hb
        print ip
        
        # parse import.csv
        n = 0                                   # (import line counter)
        imp_eof = False
        acc_old = ''
        bank = {                                # All known accounts
        '0123456789':'Bank1',
        '0987654321':'Bank2'
        }
        while not imp_eof:
            # Import(Bank)-file PARSER --------------------------------------
            
            n += 1                              # line count
            line = fromfile_.readline()
            # eof (import)
            if len(line) == 0:
                imp_eof = True
                break
                
            # Skip record-lines in Header
            if (Hdl < n):
                # Cleanup record-line
                line = line.rstrip('\r\n')          # get rid of CRLF
                line = line.replace("'",'"')        # harmonize all quotes ""
                ln = len(line)

                # problems encountered spliting lines:
                #   1   Some (not all) fields are with quotes
                #       1a      text between quotes
                #       1b      numbers between quotes  
                #   2   comma separated fields contains comma (e.g. in amounts)
   
                CsvConvert.fail = 0
                # Find out Separator type and split
                line_c = line.replace(',','')
                line_s = line.replace(';','')
                
                if len(line_c) > len(line_s):       # semicolon separator (comma's in field allowed)
                    rec = line.split(';')
                else:                               # comma separator (comma's in field NOT allowed)
                    # Find out if quotes are present, and in pairs
                    line_q = line.replace('"','')
                    qt = (len(line)-len(line_q))
                    # Check pairs
                    if (qt-2*int(qt/2)) != 0:
                        CsvConvert.fail = n         # Error => Store record-/line-number
                        logfile_.write('Error in record[%s]: Quotes not in pairs\n'% n)
                    else:
                        # if between quotes a comma is present, change to '.'
                        # remove quotes after checking
                        Quotes = True
                        print "  " + line
                        while Quotes:
                            ln = len(line)
                            q1 = line.find('"')
                            q2 = line.find('"',q1+1)
                            #print q1,q2
                            if (q1 > 0) and (q2 > 0):
                                l1 = line[q1:q2+1].replace(",",'.')
                                line = line[0:q1] + l1.replace('"','') + line[q2+1:ln]
                            else:
                                Quotes = False
                                
                        rec = line.split(',')       # Now it is safe to split

                # Cleanup all quotes left behind
                for i in range(len(rec)):
                    rec[i] = rec[i].strip('"')
                    
                # Header present (ONLY for single account file)
                if hd_len > 0:
                    # accountnumber
                    if n == int(hd_acc_ln[0]):
                        n_ac = int(hd_acc_ln[1])
                        # filter out only digits (account-number)
                        # and make accountnumber 10 char.long
                        ac = re.sub('[^0-9]','',rec[n_ac])
                        if len(ac) < 10:   ac = (10 - len(ac))*'0' + ac
                        #print "<>", ac, bank[ac]
                        tofile_.write('%s;%s\n'% (ac,bank[ac]))
                    # balance (for future use)
                    if n == int(hd_bal_ln[0]):
                        n_bc = int(hd_bal_ln[1])
                        bc = rec[n_bc]
                        bc = ParseAmount(bc)
                        #print "<>", float(bc)

                # Check account-record-length in relation to def, log only error outside header
                if ((fld >= len(rec)) or (max(ip) >= len(rec))):
                    CsvConvert.fail = n                     # Error => Store record-/line-number
                    if (n > hd_len):
                        logfile_.write('Error in record[%s]: Field(s) missing\n'% n)
                
                if (CsvConvert.fail == 0):                  # >>>>> skip record with error !
                    # Construct Homebank records
                    hb_old  = 0
                    record  = ''
                    am = ''
                    for j in range(len(hb)):
                        h = hb[j]        
                        b = ip[j]
                        rec_new = rec[b]
                        # ________________conversions
                        # "date"
                        if (h == 0):                        
                            dd = date.find('DD')
                            mm = date.find('MM')
                            yy = date.find('YYYY')
                            rec_new = '%s-%s-%s'% (rec[b][dd:(dd+2)],rec[b][mm:(mm+2)],rec[b][yy:(yy+4)])
                        # "paycode"
                        if (h == 1):
                            rec_new = ''
                            # empty code
                            if (code == ''):
                                print '>>>>> Empty Paycode: ' + rec[b]
                                logfile_.write('Empty Paycode "%s" in record[%s]\n'% (rec[b],n))
                            else:    
                                # Unknown paycode (Not in .def)
                                if code.find(rec[b]) < 0:
                                    print '>>>>> Unknown Paycode: ' + rec[b]
                                    logfile_.write('Unknown Paycode "%s" in record[%s]\n'% (rec[b],n))
                                # Known paycode (present in def)
                                else:
                                    k = 0
                                    cd = code.split(',')
                                    offset = len(cd)/2
                                    for c in cd:
                                        if c == rec[b]:     rec_new = cd[k + offset]
                                        k += 1                                    
                        # "amount"
                        if (h == 5):
                            #print "<>", rec[b]
                            rec_new = ''
                            # Amount
                            if (am == ''):
                                am = rec[b]
                                am = ParseAmount(am)
                                if not ParseAmount.valid:
                                    print 'Error in record[%s]: Amount-Field corrupt\n'% n
                                    logfile_.write('Error in record[%s]: Amount-Field corrupt\n'% n)
                                    break
                            # Sign
                            elif (posneg != ''):                    # Dualline def.
                                pn = posneg.split(',')
                                if   rec[b] == pn[0]:   am = '-%s'% am
                                elif rec[b] == pn[1]:   pass
                                rec_new = am
                            # No-sign
                            if posneg == '': rec_new = am           # Single line def.
                            
                        # ___________________assemble output-record
                        # skip if this field indicates [Not used] or [Header]
                        if (ip[j] >= 0):
                            # [date]
                            if (h == 0):
                                record = rec_new
                            # [paymode]    
                            elif (h == 1):
                                record = '%s;%s'% (record,rec_new)
                            # [info -> offset-account]
                            elif (h == 2):
                                # filter out only digits (account-number)
                                # and make accountnumber 10 char.long
                                rec_new = re.sub('[^0-9]','',rec_new)
                                if len(rec_new) < 10:   rec_new = (10 - len(rec_new))*'0' + rec_new

                                if (int(rec_new) > 0):
                                # if (len(rec_new) != 0) and (int(rec_new) > 0):
                                    record = '%s;%s'% (record,rec_new)
                                else:
                                    record = '%s;'% record
                            # [payee]
                            elif (h == 3):
                                record = '%s;%s'% (record,rec_new)
                            # [description]
                            elif (h == 4):
                                # Combine multiple "not empty" description Bank-records
                                if (hb_old == h):
                                    if (len(rec_new) != 0):
                                        record = '%s_%s'% (record,rec_new)
                                    else:
                                        pass
                                # First description Bank-record
                                else:
                                    hb_old = h
                                    if (len(rec_new) != 0):
                                        record = '%s;%s'% (record,rec_new)
                                    # empty
                                    else:
                                        record = '%s;'% record
                            # [amount]
                            elif (h == 5):
                                if (len(rec_new) != 0):
                                    record = '%s;%s'% (record,rec_new)
                                else:
                                    pass
                            # [category]
                            elif (h == 6):
                                record = '%s;%s'% (record,rec_new)
                            # [account]    
                            # NOT IMPLEMENTED IN HOMEBANK CSV-import
                            #       multi accounts import: sequential account listing
                            #       at top of accountlist extra line with account-name
                            #       format: account-number; "Homebank account-name"
                            #       Needs Homebank 4.3 "import.c" adaptation (TvT(c)2010)
                            elif (h == 7):
                                # filter out only digits (account-number)
                                # and make accountnumber 10 char.long
                                rec_new = re.sub('[^0-9]','',rec_new)
                                if len(rec_new) < 10:   rec_new = (10 - len(rec_new))*'0' + rec_new
                                # detect next account
                                if (rec_new != acc_old):
                                    acc_old = rec_new
                                    try:
                                        #print "<>", rec_new,bank[rec_new]
                                        tofile_.write('%s;%s\n'% (rec_new,bank[rec_new]))
                                    except KeyError:
                                        #print 'Unknown/New account number'
                                        tofile_.write('%s;%s\n'% (rec_new,'New_account'))
                            # [balance]            
                            # NOT IMPLEMENTED IN HOMEBANK CSV-import
                            #       Listed Balance value before/after transaction ?
                            #       Needs further investigation and Homebank 4.3 "import.c" adaptation
                            # TODO  Needs Homebank 4.3 "import.c" adaptation
                            elif (h == 8):
                                # For future use, now just print available Balance-value ....
                                bal = re.sub('[^0-9.-]','',rec_new)
                                print float(bal) + float(am)

                        # Field not available [-1]
                        elif (h < 7) and (ip[j] == -1):
                            record = '%s;'% record
                            
                    #print record
                    tofile_.write('%s\n'% record)

#### ParseAmount ####################################

def ParseAmount(am):
    """ check and harmonize grouping and decimal-point
          outputs amount and valid-flag(true/false)
    """

    ParseAmount.valid = True
    # filter
    am = re.sub('[^0-9,.-]','',am)
    # integers(any number).fraction(0..2) 
    # find decimal point
    frac1 =len(am)-am.find('.')
    frac2 =len(am)-am.find(',')
    # No grouping & No fraction / decimal-point
    if (frac1 == frac2):
        am = '%s.00'% am
    # xxx,xxx,xxx.xx    comma-grouping, dot-decimal
    elif (frac1 < 4) and (frac1 > 0):   
        am = am.replace(',','')
    # xxx.xxx.xxx,xx    dot-grouping,   comma-decimal
    elif (frac2 < 4) and (frac2 > 0):
        am = am.replace('.','')
        am = am.replace(',','.')        # harmonize decimal-point
    # grouping & No fraction / decimal-point
    else:
        am = am.replace(',','')
        am = am.replace('.','')
        am = '%s.00'% am
    # check validity result
    if (len(am) - am.find('.')) != 3:
        ParseAmount.valid = False
    return am
                
#### Convert ##########################################
      
class convert:
    """ Converts <unknown> csv-file """
    # 1- where are the csv-files?                   =>  commandline
    # 2- Convert via definition-file 
    # 3- what is csv-separator: comma, semicolon ?
    # 4- Skip "corrupted" bank-file records
    # 5- Include multi-accounts in output.csv       (NOT IMPLEMENTED IN HOMEBANK CSV-import)
    # 6- Include balance info in output.csv         (NOT IMPLEMENTED IN HOMEBANK CSV-import)
    # 7- Log all conversion process-items
      
    def __init__(self):
    
        error = 'Input error!____ Type ./Convert_x.x.x.py [import.csv] [output.csv] [import.def] ____\n\n\
                 [import.csv] = ("bank".csv)    file exported from bank\n\
                 [output.csv] = (homebank.csv)  file to be created\n\
                 [import.def] = ("bank".def)    definition-file "bank" <> "Homebank"\n\n\
                 Logging conversion process -> log.txt\n'
        homebank = ['date','paymode','info','payee','description','amount','category']  # 4.3
        
        if (len(sys.argv) != 4):
            print error
            exit(1)

        if os.path.isfile(sys.argv[1]):
            fromfile = open(sys.argv[1],'r')
        else:
            print '\nInput error!____ import.csv: ' + sys.argv[1] + ' does not exist / cannot be opened !!\n'
            exit(1)
            
        try:
            tofile   = open(sys.argv[2],'w')
        except:
            print '\nInput error!____ output.csv: ' + sys.argv[2] + ' cannot be created !!\n'
            exit(1)
            
        if os.path.isfile(sys.argv[3]):
            deffile = open(sys.argv[3],'r')
        else: 
            print '\nInput error!____ import.def: ' + sys.argv[3] + ' does not exist / cannot be opened !!\n'
            exit(1)
            
        logfile  = open('log.txt', 'w')
        
        logfile.write('Opening import     %s\n' % fromfile)
        logfile.write('        export     %s\n' % tofile)
        logfile.write('        definition %s\n' % deffile)

        CsvConvert(fromfile, deffile, tofile, logfile)
                
        logfile.write('Closing files\n')
        logfile.close()
        fromfile.close()
        tofile.close()
        deffile.close()

if __name__ == "__main__":
    convert()

Les arbres enseignent la patience: Ils ne baissent pas les bras à la première tempête venue. [C.Beaupré]
Quand je ne sais pas traduire je me fais aider par: translate.google.com

Hors ligne

#1678 Le 07/04/2013, à 12:37

FelixP

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Bonjour !
J'ai créé pour l'instant deux scripts.
Le premier permet de créer facilement et proprement, un périphérique (usb) bootable pour installation de Win®.
Le second permet, en se basant sur la page de doc-ubuntu.fr, de "décompresser" une iso Linux (en particulier Ubuntu) pour la personnaliser, et la recompresser. Il n'est pas fini, par contre.
Les deux sont encore en "bêta" car il y a quelques problèmes à régler pour qu'ils soient propres, et disponibles ici.
Si ils sont rajoutés à la doc, je m'engage à les actualiser lorsque des changements sont faits ! (je m'en occupe régulièrement… smile )
Bon, côté license, je m'en fous un peu pour le moment… big_smile Disons (cc-by-sa) ? smile
Linuxement,
Félix smile

Dernière modification par FelixP (Le 07/04/2013, à 12:37)


Envoyé depuis mon navigateur libre sous mon os libre.
LinuxMint 15 Olivia, avec Cinnamon 2.0, et Firefox-Nightly 29.0 !
Voyez mes astuces ici : http://doc.ubuntu-fr.org/utilisateurs/felixp

Hors ligne

#1679 Le 07/04/2013, à 14:06

Hizoka

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

pour la creation d'iso perso, il existe deja 2 tres bon logiciels sur ce forum, un de frafa et un de smo ( http://forum.ubuntu-fr.org/viewtopic.php?id=412528 )

Hors ligne

#1680 Le 07/04/2013, à 14:08

FelixP

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Okay, je vois ça… Mais bon, j'aime bien mon script :° (Mais effectivement, pas la peine de le rajouter !)


Envoyé depuis mon navigateur libre sous mon os libre.
LinuxMint 15 Olivia, avec Cinnamon 2.0, et Firefox-Nightly 29.0 !
Voyez mes astuces ici : http://doc.ubuntu-fr.org/utilisateurs/felixp

Hors ligne

#1681 Le 16/04/2013, à 10:29

dopsi

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Salut à tous,

Voici un script utile pour télécharger et installer des paquetages LaTeX depuis les miroirs de ctan.org

#!/bin/bash

# Téléchargement et installation de packages LaTeX
# par dopsi

if [ $# -eq 1 ]
then
	echo "Téléchargement et installation de $1"
	echo "Téléchargement depuis ctan.org..."
	wget "[url]http://mirrors.ctan.org/macros/latex/contrib/$1.zip[/url]">/dev/null 2>&1

	if [ $? -ne 0 ]
	then
	echo "$0: Erreur de téléchargement (0)"
	exit
	fi

	echo "Décompression des fichiers..."
	unzip "$1.zip">/dev/null 2>&1

	echo "Déplacement des fichiers dans texmf..."
	mv "$1/*.dvi" "$1/*.ps" "$1/*.pdf" "/usr/local/share/texmf/doc/latex/$1/.">/dev/null 2>&1
	mv "$1/" "/usr/local/share/texmf/tex/latex/.">/dev/null 2>&1
	echo "Suppression des fichiers téléchargés..."
	rm "$1.zip">/dev/null 2>&1
	echo "Mise à jour de la base de données..."
	texhash>/dev/null 2>&1
elif [ $# -eq 2 ]
then
	case $1 in
		"-d")
			echo "Téléchargement et installation de $2"
			echo "Téléchargement depuis ctan.org..."
			wget "[url]http://mirrors.ctan.org/macros/latex/contrib/$2.zip[/url]">/dev/null 2>&1
			if [ $? -ne 0 ]
			then
			echo "$0: Erreur de téléchargement (-d)"
			exit
			fi
		;;

		"-i")
			echo "Installation $2"
			echo "Décompression des fichiers..."
			unzip "$1.zip">/dev/null 2>&1
			echo "Déplacement des fichiers dans texmf..."
			mv "$2/*.dvi" "$2/*.ps" "$2/*.pdf" "/usr/local/share/texmf/doc/latex/$2/.">/dev/null 2>&1
			mv "$2/" "/usr/local/share/texmf/tex/latex/.">/dev/null 2>&1
			echo "Mise à jour de la base de données..."
			texhash>/dev/null 2>&1
		;;

		"-n")
			echo "Téléchargement et installation de $2 (sans suppression de l'archive téléchargée)"
			echo "Téléchargement depuis ctan.org..."
			wget "[url]http://mirrors.ctan.org/macros/latex/contrib/$2.zip[/url]">/dev/null 2>&1
			if [ $? -ne 0 ]
			then
			echo "$0: Erreur de téléchargement (-n)"
			exit
			fi

			echo "Décompression des fichiers..."
			unzip "$1.zip">/dev/null 2>&1

			echo "Déplacement des fichiers dans texmf..."
			mv "$2/*.dvi" "$2/*.ps" "$2/*.pdf" "/usr/local/share/texmf/doc/latex/$2/.">/dev/null 2>&1
			mv "$2/" "/usr/local/share/texmf/tex/latex/.">/dev/null 2>&1
			echo "Mise à jour de la base de données..."
			texhash>/dev/null 2>&1

		;;

		*)
			echo "$0: Usage: ctan-download [-d|-i|-n] <nom package>"
		;;
	esac
else
	echo "$0: Usage: ctan-download [-d|-i|-n] <nom package>"
fi

Pensez à modifier la ligne 6

ltexmf="/usr/local/share/texmf"

et la remplacer par le chemin de votre architecture texmf... smile

Pour l'éxécuter, sauf avec -d, il faut les droits du super-utilisateur (pour texhash et le déplacement dans le texmf)

Attention, un échec du téléchargement ne veut pas dire que le package n'existe pas peut-être seulement qu'il est situé autre par dans CTAN (je suis désolé de ne pas prendre en compté les exeptions mais il y en a si peu que ça n'est pas la peine), donc jetez un coup d'oeil sur le site avant de jeter l'éponge wink

Bien à vous

Simon

Hors ligne

#1682 Le 18/04/2013, à 04:35

linuxienubuntiste

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Je m'en remet à vous, scripteurs fous. J'implore votre aide, qui en plus de me faire gagner un temps précieux, m'évitera de souffrir de TMS. Je dispose de plus d'un millier de fichiers à trier, chacun d'entre eux étant dans un même dossier. Ma demande est j'imagine hyper simple pour un scripteur aguerri, simplement de pouvoir déplacer chacun des fichiers dans un dossier créer avec le nom du fichier qu'il contiendra.
Donc en essayant d’être plus clair, un script qui créera autant de dossiers que de fichiers présent, qui renommera chacun des dossiers avec le nom des fichiers et qui ensuite déplacera les fichiers dans les dossiers.

Merci d'avance pour votre aide, votre temps et de votre savoir.

Hors ligne

#1683 Le 18/04/2013, à 05:07

pingouinux

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Bonjour,
@linuxienubuntiste #1682

for fic in *;do [[ -d "$fic" ]] && continue; mkdir provi; mv "$fic" provi; mv provi "$fic";done

Dernière modification par pingouinux (Le 18/04/2013, à 05:56)

Hors ligne

#1684 Le 18/04/2013, à 13:02

clahor

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

bonjour a tous

1000 fichiers dans 1000 dossiers ça fait 1000 dossiers à visionner......bon courage

Hors ligne

#1685 Le 18/04/2013, à 13:23

Hizoka

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

ca correspond a quoi le provi pingouinux ?

Hors ligne

#1686 Le 18/04/2013, à 13:29

pingouinux

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Hizoka   #1685 a écrit :

ca correspond a quoi le provi pingouinux ?

C'est un répertoire provisoire. On ne peut pas lui donner le nom définitif, car il existe un fichier de même nom.
- Création du répertoire provi
- Déplacement du fichier dans ce répertoire
- Renommage du répertoire provi avec le nom du fichier

Hors ligne

#1687 Le 18/04/2013, à 13:50

Hizoka

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

oki, je pensais que ca avait un autre sens smile

Hors ligne

#1688 Le 18/04/2013, à 17:16

linuxienubuntiste

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Trop balèze, merci pingouinux. Cela fonctionne parfaitement. wink
Peut-on faire la même chose mais sans garder l'extension des fichiers ?

Hors ligne

#1689 Le 18/04/2013, à 17:45

pingouinux

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

linuxienubuntiste   #1688 a écrit :

Peut-on faire la même chose mais sans garder l'extension des fichiers ?

Tout est possible, mais c'est plus cher…:P
Il faut maintenant tester que le répertoire n'existe pas déjà (ce qui serait le cas si par exemple tu avais les fichiers image.jpg et image.gif).

for fic in *
do
   [[ -d "$fic" ]] && continue
   nom_rep="${fic%.*}"
   if [[ -d "$nom_rep" ]]; then
      printf "Fichier %s : le répertoire %s existe déjà\n" "$fic" "$nom_rep"
      continue
   fi
   mkdir provi
   mv "$fic" provi
   mv provi "$nom_rep"
done

Dernière modification par pingouinux (Le 02/06/2013, à 18:03)

Hors ligne

#1690 Le 18/04/2013, à 18:25

linuxienubuntiste

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Merci beaucoup c'est cool <3

Pingouinux akbar !!!

Hors ligne

#1691 Le 31/05/2013, à 18:07

zz10

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Bonjour à toutes et tous,

Je me permets de lancer un petit défis aux plus férus codeurs... 
Est-ce possible qu'un script aille vérifier sur un de mes forums favoris si il y a un nouveau message que je n'ai pas lu. Si c'est le cas, est-ce possible d'afficher une alerte dans la zone de notification d'ubuntu (sent-notify) ?

Le forum en question si ça peut aider !?

http://www.ice-epinal-forum.com/

Merci d'avance à ceux qui tenteront de relever le défi wink

@+

Hors ligne

#1692 Le 31/05/2013, à 20:50

yamo

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

@ZZ10

Il suffit d'avoir un lecteur de flux rss.  Il doit en exister des centaines mais par exemple, Thunderbird et IceApe le font.


Stéphane
--
Debian 7.0 XFCE 4.8   - #ubuntu sur freenode

sudo / matrix

Hors ligne

#1693 Le 02/06/2013, à 12:11

laslack

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Bonjour à tous.

je viens d'installer "pluzzdl" et pour éviter à chaque fois de rechercher les lignes de commande et les copier , j'ai essayé de commencer un script pour exécuter les 2 lignes de commandes nécessaires à la suite.
Je suis allé voir dans différents tutos sur les scripts mais je m'aperçois que je ne sais pas poser le problème logique à résoudre donc à réaliser le chemin ,ce qui me semble la base de tout.
A résoudre:si j'ai bien compris
la commande :"cd ~/Documents/logiciels/pluzzdl-0.9.3/src" ouvre le programme
la commande :"python main.py -v http://................." exécute l'enregistrement.
Si je met les 2 commandes à la suite l'une de l'autre la 2è ne fonctionnera que si l'url est indiquée.
Quel est le raisonnement à imaginer pour arriver à un script pour que après l'ouverture du programme,il y ait une invite à copier l'url et que  tant que l'url n'est pas copiée, le déroulement reste en stand by, et quand l'url est copiée ,l'exécution du programme se réalise.
Ce que je cherche pour le moment c'est poser les bases du problème ,qui me permettrons d'essayer d'écrire quelque chose .Si je n'y arrive pas j'appellerai au secours
Merci d'avance

Hors ligne

#1694 Le 02/06/2013, à 14:04

ljere

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

je pense que c'est à peu prés ce que tu cherches

#!/bin/bash
# par ljere
# chemin de pluzzdl
cd ~/Documents/logiciels/pluzzdl-0.9.3/src

# demander le nom de l'url grâce à zenity
url=$(zenity --entry   --title="Pluzzdl"   --text="Insérer l'adresse ici:") ; echo $fichier
if [ "$url" == "" ]
then
  echo 'vous devez indiquer une adresse'
  exit 1
fi

# lancer l'enregistrement
python main.py "$url"
# déplacer le fichier dans un dossier de votre choix
sleep 5
mv *.mkv ~/Téléchargements/

Dernière modification par ljere (Le 02/06/2013, à 14:13)


athlon 2800+, nvidia FX5200 et 2 Go de ram et sempron 3000+, ati radeon et 1 Go de ram sur voyager 12.04 32 bit
Toshiba satellite_c670d-11l sur openboxubuntu 14.10 64 bit
Mon Blog
administrateur du forum ubuntu-fr.org

Hors ligne

#1695 Le 03/06/2013, à 09:37

laslack

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

merci, ljere  pour ce script,
Cependant ,un petit détail sur la ligne suivant 
# lancer l'enregistrement
il faut écrire :python main.py -v  au lieu de python main.py
et puis ,la video s'enregistre toujours dans le dossier "src" malgré
mv *.mkv ~/Téléchargements/
Mais ce n'est pas grave.

C'était mon premier essai de script et je n'avait pas penser à "zenity" , il faut que j'explore encore
Merci

Hors ligne

#1696 Le 03/06/2013, à 09:45

Hizoka

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

laslack => Si zenity t'interresse, regarde mon zenitor, ca t'aidera bien je pense smile

Hors ligne

#1697 Le 03/06/2013, à 15:07

ljere

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

le -v sert pour avoir le mode verbeux donc ça ne sert à rien dans le cas d'un script
la vidéo s'enregistre dans le fichier src puis aprés 5 secondes il déplace le fichier dans le dossier cible
pour mon essai j'avais eu un fichier mkv ce n'est peut être pas le cas pour toi
j'ai biensur testé le script avant de te le soumettre chez moi il fonctionne impeccable, mais tu peux en effet le modifier facilement tu as un bon départ


athlon 2800+, nvidia FX5200 et 2 Go de ram et sempron 3000+, ati radeon et 1 Go de ram sur voyager 12.04 32 bit
Toshiba satellite_c670d-11l sur openboxubuntu 14.10 64 bit
Mon Blog
administrateur du forum ubuntu-fr.org

Hors ligne

#1698 Le 14/08/2013, à 08:35

enebre

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Bonjour,
J'ai un petit soucis avec un script pour youtube-dl.
Comète n'a pas de problème sur sa machine mais chez moi  je n'y arrive pas. J'obtiens ce retour du terminal :

▶ sh yt
yt-K: 21: [: FALSE: unexpected operator
yt-K: 24: [: FALSE: unexpected operator

Moi je n'y connais pas grand chose, alors si quelqu'un(e) pourrais voir ce qui coince à ce script sur xfce... Si "coince" il y a, chez vous aussi ???
le script de Comète: Pour lequel j'ai du changer le YTDL_PATH="$youtube youtube-dl -c -f 18/43/5/17 -t " \ comme sur un autre script de Comète et qui accepte cette ligne

#!/bin/sh
######
## Un script simple utilisant youtube-dl pour regarder, dans son propre lecteur,
## les videos en ligne des sites bien connus...
## 2013 - Morgan LEFIEUX - http://gerard.geekandfree.org
######
DOWNLOAD_DIR="${HOME}/videos"
PLAYER="vlc --play-and-exit --key-quit q --no-video-title-show --network-caching=8192"
YTDL_PATH="${HOME}/apps/youtube-dl -c --max-quality 44 --prefer-free-formats"
WAIT="sleep 6"

#############

FORM=`yad --geometry=360x104 --title="Youtube-dl" --form --field="Entrez l'URL:" \
    --field="Conserver la vidéo dans $DOWNLOAD_DIR ?":CHK`

MYURL=`echo $FORM | cut -d '|' -f 1`
KEEPVID=`echo $FORM | cut -d '|' -f 2`

mkdir -p $DOWNLOAD_DIR
if [ -n "$MYURL" -a "$KEEPVID" == "FALSE" ]; then
    echo "Patientez quelques secondes votre vidéo va démarrer..."
    ${YTDL_PATH} -g $MYURL | xargs $PLAYER 
elif [ -n "$MYURL" -a "$KEEPVID" == "TRUE" ]; then
    echo "Vous avez choisi de conserver cette vidéo dans $DOWNLOAD_DIR après
    visualisation.\nPatientez quelques secondes votre vidéo va démarrer..."
    FILENAME=`$YTDL_PATH -t --get-filename $MYURL`
    $YTDL_PATH -o "$DOWNLOAD_DIR/%(title)s-%(id)s.%(ext)s" \
        --no-part $MYURL & $WAIT && $PLAYER "$DOWNLOAD_DIR/$FILENAME"
fi
exit 0

Voyager 14.04 en 32  bits see but unseen & seen but not see - site

Hors ligne

#1699 Le 14/08/2013, à 08:56

pingouinux

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

@enebre #1698 :
Je pense que tu aurais dû ouvrir une autre discussion.
Pour ton problème, je dirais que tu peux, au choix

  1. Exécuter ton script en bash

  2. Remplacer == par = (lignes 21 et 24)

Hors ligne

#1700 Le 14/08/2013, à 09:04

enebre

Re : [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...)

Merci pingouinux, super quel progrès en bash, mais ça ne résout pas encore le tout, pour le streaming ça fonctionne mais si je coche "conserver la vidéos", ça coince:
J'ai aussi essayé en supprimant les doubles "==" sans différence !

 ▶ bash yt-K
Vous avez choisi de conserver cette vidéo dans $/home/marc/Videos/videos-yt après
    visualisation.\nPatientez quelques secondes votre vidéo va démarrer...
Usage: youtube-dl [options] url [url...]

youtube-dl: error: using output template conflicts with using title, video ID or auto number
MPlayer svn r34540 (Ubuntu), built with gcc-4.7 (C) 2000-2012 MPlayer Team
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

Playing $/home/marc/Videos/videos-yt/Jingle FUN Radio (2012)-UsOyZHCgMpM.mp4.
File not found: '$/home/marc/Videos/videos-yt/Jingle FUN Radio (2012)-UsOyZHCgMpM.mp4'
Failed to open $/home/marc/Videos/videos-yt/Jingle FUN Radio (2012)-UsOyZHCgMpM.mp4.


Exiting... (End of file)
pingouinux a écrit :

Je pense que tu aurais dû ouvrir une autre discussion.

Oui excuse moi, je pensais qu'une simple erreur ne demandait pas d'ouvrir un nouveau sujet, mais peut être...
suite... ici merci

Dernière modification par enebre (Le 14/08/2013, à 09:46)


Voyager 14.04 en 32  bits see but unseen & seen but not see - site

Hors ligne

Haut de page ↑