2015-04-30 12 views
16

Sono relativamente nuovo a Linux avendo effettuato il passaggio da Windows a un centro multimediale headless. Sto eseguendo KODIBuntu.Determinare il tipo di supporto ottico (CD audio, DVD, blu-ray) utilizzando UDEV e script

Sto cercando di ottenere un sistema di ripping automatico per il backup della mia raccolta di supporti cartacei. Ho adorato il concetto con Linux che "se puoi sognarlo puoi farlo accadere".

Quello che sto cercando di ottenere è che un disco sia inserito nel lettore e che uno script copra il contenuto sul mio disco.

es disco inserito -> tipo di supporto determinato -> corretta lo script di strappo eseguito

ho usato un sacco di pagine web utili attraverso ricerche su Google per creare script che farà il lavoro strappo stesso. Ho fatto un sacco di letture e sono stato indirizzato verso l'uso di 'HAL' .... Poi ho scoperto che la sua funzione era stata deprecata e sostituita da udev. Ho fatto un sacco di più la lettura e ha scoperto come utilizzare UDEV e ha creato la regola folowing che ho provato lavori collegandosi direttamente ad uno script che strappa

ACTION=="change", SUBSYSTEMS=="scsi", KERNEL=="s[rg][0-9]*", ATTRS{vendor}=="TSSTcorp", MODE="0660", GROUP="optical", RUN+="/home/jlivin25/myscripts/DiscTypeTest.sh" 

mi sono reso conto che avevo bisogno di uno script intermedia che avrebbe fatto il ' lavoro 'per determinare quale sia il tipo di supporto ottico. Ulteriori letture mi hanno portato a credere che avrei dovuto usare una sorta di dichiarazione "SE".

se il disco inserito poi se lo script cd audio run rip 1 se lo script run DVD rip 2 se lo script blu-ray run RIP 3 ELSE senza CD inserito

ho fatto un po 'googling e trovato qualche codice in vari luoghi che utilizza variabili ambientali per funzionare. Tuttavia da ulteriori informazioni su google, sembra che queste variabili non siano definite fino a quando non viene fatto riferimento a UDEV?

Il mio approccio abituale è quello di costruire una linea di codice, eseguire in terminale e se ottengo ciò che voglio, metto tutte le linee insieme in uno script di shell?

Il codice su cui sto lavorando è il seguente. Penso che se logicamente potessi far sì che lo script producesse quello che pensa sia nel drive di un file/log, sarebbe stata vinta la metà della battaglia e potrei semplicemente sostituirla con le posizioni degli script che farebbero il corrispondente compito di ripping. . Qualche idea su perchè questo non funziona come voglio?

Ho usato queste pagine per ottenere informazioni da:

https://pathar.tl/blog/the-ultimate-...pping-machine/ https://askubuntu.com/questions/35985...on-of-dvd-disc

Ecco il mio codice:

#!/bin/bash 
# 
set -eu 
# 
# code below is derived from work by JimVanns, thanks 
# https://github.com/jvanns/htpc/blob/master/dsc-trg-q 
# 
# 
########################################################################### 
###      DEFINE VARIABLES HERE      ### 
### $HOME DOES NOT NEED DEFINING AS IT SEEMS TO BE BUILT INTO BASH FROM ### 
### WHAT POSTS I HAVE READ RELATING TO USING WHAT I THINK ARE UDEV ### 
### ENVIRONMENTAL VARIABLES E.G. $ID_CDROM_MEDIA_CD DO NOT APPEAR TO ### 
### NEED DEFINING THEMSELVES, ALSO PART OF BASH OR LINUX COMMAND  ### 
###      STRUCTURE CALLED BY BASH?      ### 
########################################################################### 
# 
MEDIA= 
# 
############################################################################## 
### LEFT IN SO AS TO ALTER AS LITTLE AS POSSIBLE, I HAVE READ THAT DELAYS ### 
### OFTEN IRON OUT KINKS IN CODE, PLUS ALSO FOUND IT USEFULL TO ALLOW A ### 
### SMALL DELAY FOR CD-DRIVE TO DO ITS THING AFTER PUTTING DISK IN  ### 
############################################################################## 
# 
sleep 2 
# 
mkdir -p $HOME/myscripts/scriptlogs 
# 
# 
if [ "$ID_CDROM_MEDIA_BD" = "1" ] 
then 
    MEDIA=bluray 
    (
    echo "$MEDIA" >> $HOME/myscripts/scriptlogs/DiscTypeTest.log 
    ) & 
if [ "$ID_CDROM_MEDIA_DVD" = "1" ] 
then 
    MEDIA=dvd 
    (
    echo "$MEDIA" >> $HOME/myscripts/scriptlogs/DiscTypeTest.log 
    ) & 
elif [ "$ID_CDROM_MEDIA_CD" = "1" ] 
then 
    MEDIA=cdrom 
    (
    echo "$MEDIA" >> $HOME/myscripts/scriptlogs/DiscTypeTest.log 
    ) & 
fi 
+1

i link non funzionano . – FeedTheWeb

risposta

4

Le variabili non sono impostate da nessuna parte.

Di solito questo è AImpostazione in regola avvio udev (in /usr/lib/udev/rules.d/), e guarda un po 'come

# ID_CDROM_MEDIA_BD = Bluray 
# ID_CDROM_MEDIA_DVD = DVD 
# ID_CDROM_MEDIA_CD = CD 
SUBSYSTEM=="scsi", KERNEL=="sr0", ENV{ID_CDROM_MEDIA_BD}=="1", RUN+="/home/user/ripping_script.sh" 

Dal udev non conoscono il tipo di supporto in anticipo, questo è impostato manualmente come variabile d'ambiente. Ma dal momento che si desidera avviare automaticamente uno script diverso in determinate condizioni, questo non è utile.

Tuttavia, è possibile determinare e impostare le variabili MediaType nello script ripping anche:

prima installazione cdtool, si può dare alcune informazioni su audio CD (con cdir). sudo apt-get install cdtool

Aggiungere questo all'inizio del vostro script:

#!/bin/bash 
# ripping_script.sh 

CDDVD=`cdir -vd /dev/sr0 2>&1 |grep -q "no_disc" || echo "cd"` 

if [ $CDDVD ]; then 
ID_CDROM_MEDIA_CD=1 
echo "CD detected" >> $HOME/myscripts/scriptlogs/rip.log 
else 
ID_CDROM_MEDIA_DVD=1   
echo "DVD detected" >> $HOME/myscripts/scriptlogs/rip.log 
fi 


# ... your rippingscript here 

/dev/sr0 è più probabile che il CD/DVD.

questo differisce solo tra audioCD e DVD. Non ho roba blu-ray per i test.

+0

ciao lxer grazie mille per aver trovato il tempo di rispondere. Cercherò sicuramente ciò che suggerisci di vedere se mi darà un risultato utilizzabile, non verrei mai incontrato in cdtool. Attaccando al mio primo post qualche idea sul perché le variabili ambientali non funzionino per me così come sono? o anche come testare per vedere cosa non funziona? – Littlejeem

+0

le variabili di ambiente non sono impostate. Ho aggiornato la risposta per includerla. – FeedTheWeb

+0

Grazie, apprezzo molto la spiegazione ... Penso di iniziare a vedere la luce alla fine del tunnel. È che ho bisogno di aggiustare leggermente il mio pensiero in modo da avere tre regole udev. Diciamo che 80-bluray.rule, 81-dvd.rule e 82-cd.rule poi usano il tuo esempio per popolare le regole di udev di conseguenza. quindi la regola 80 sarebbe 'SUBSYSTEM ==" scsi ", KERNEL ==" sr0 ", ENV {ID_CDROM_MEDIA_BD} ==" 1 ", RUN + ="/home/utente/BLURip.sh "' la regola 81 sarebbe 'SUBSYSTEM = = "scsi", KERNEL == "sr0", ENV {ID_CDROM_MEDIA_DVD} == "1", RUN + = "/ home/utente/DVDRip.sh" 'ecc. – Littlejeem

0

Risolto!

La regola di Udev si presenta così.

# ID_CDROM_MEDIA_BD = Bluray 
# ID_CDROM_MEDIA_DVD = DVD 
# ID_CDROM_MEDIA_CD = CD 
ACTION=="change", SUBSYSTEMS=="scsi", KERNEL=="s[rg][0-9]*", ATTRS{vendor}=="TSSTcorp", ENV{ID_CDROM}=="?*", MODE="0660", GROUP="optical", RUN+="/usr/local/bin/DiscTypeTest3.sh" 

e script per innescare lo strappo script assomiglia a questo:

#!/bin/bash 
# ID_CDROM_MEDIA_BD = Bluray 
# ID_CDROM_MEDIA_DVD = DVD 
# ID_CDROM_MEDIA_CD = CD 
MEDIA= 
if [ $ID_CDROM_MEDIA_DVD = "1" ] 
    then 
    MEDIA=dvd 
    (
    echo "$MEDIA" >> "/var/log/DiscTypeTest.log" 
    ) & 
elif [ $ID_CDROM_MEDIA_CD = "1" ] 
    then 
    MEDIA=cdrom 
    (
    echo "$MEDIA" >> "/var/log/DiscTypeTest.log" 
    ) & 
fi 
(set -o posix ; set) > "/var/log/DiscTypeTestVariables.log" 

Il risultato è il seguente output di file di registro quando un CD audio è inserito seguita da un dvd

cdrom 
cdrom 
dvd 
dvd 

La sostituzione delle linee di eco con il percorso degli script di ripping dovrebbe comportare un sistema headless automatizzato come desiderato

merito va a Jim Vanns per codice, Keith_Helms e blm_ubunet sui forum di Ubuntu per codice POSIX e correzioni, se le dichiarazioni e le Ixer qui per i puntatori variabili

Spero che questo aiuti

James