首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用UDEV和脚本确定光学介质类型(音频CD、DVD、blu射线)

使用UDEV和脚本确定光学介质类型(音频CD、DVD、blu射线)
EN

Stack Overflow用户
提问于 2015-04-30 17:11:41
回答 2查看 3.1K关注 0票数 17

对于linux来说,我相对来说还是个新手,因为我已经从Windows转到了一个无头媒体中心。我正在运行KODIBuntu。

我正在努力实现一个自动翻录系统,以备份我的硬拷贝媒体收集。我喜欢linux的概念:‘如果你能梦想它,你就能实现它’。

我的目标是实现的是,一个光盘被放入驱动器和脚本撕裂内容到我的驱动器。

例如,磁盘插入的->媒体类型决定了->正确的撕裂脚本运行

通过谷歌搜索,我使用了很多有用的网页来创建脚本,这些脚本本身就可以完成翻版工作。我已经做了大量的阅读,并被指向使用‘HAL’.然后我发现他的功能已经被udev取代了。我做了更多的阅读,并找到了如何使用UDEV,并创建了折叠规则,我已经证明了它的工作,通过直接链接到一个撕脚本。

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

我意识到,我需要一个中间脚本来做‘工作’,以确定什么是光学媒体类型。进一步的阅读让我相信,我需要使用某种形式的“如果”声明。

如果光盘插入,那么如果音频cd运行撕裂脚本1,如果DVD运行撕裂脚本2,如果蓝光运行撕裂脚本3其他没有插入cd。

我做了一些更多的googling,并在不同的地方找到了一些代码,这些代码使用环境变量来工作。然而,从google的进一步信息来看,这些变量似乎是在UDEV引用之前没有定义的。

我通常的方法是构建一行代码,在终端中运行,如果我得到了我想要的,那么我就把所有的行放在一个shell脚本中?

我正在处理的代码如下所示。我认为,从逻辑上讲,如果我能够让脚本输出它认为是在一个文件/log驱动器中的东西,那么一半的战斗就会胜利,我可以用它来代替脚本位置来执行相应的撕裂任务……有什么想法吗,伙计们,为什么这不像我想的那样有效?

我用这些网页从以下网站获得信息:

这是我的代码:

代码语言:javascript
复制
#!/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
EN

回答 2

Stack Overflow用户

发布于 2015-05-05 10:16:18

变量在任何地方都没有设置。

通常这是在udev启动规则(在/usr/lib/udev/rules.d/中)中设置的,看起来有点像

代码语言:javascript
复制
# 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"

由于udev事先不知道媒体类型,这是手动设置为环境变量。但是,由于您希望在特定条件下自动启动不同的脚本,这是没有用的。

但是,还可以确定和设置撕裂脚本中的mediatype变量:

首先安装cdtool,它可以给你一些音频CD的信息(用cdir)。sudo apt-get install cdtool

将以下内容添加到脚本的开头:

代码语言:javascript
复制
#!/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很可能是你的cd/dvd。

这只是audioCD和DVD的区别。我没有任何蓝光检查的东西。

票数 4
EN

Stack Overflow用户

发布于 2015-05-15 16:52:42

解决了!

Udev规则是这样的。

代码语言:javascript
复制
# 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"

触发撕取脚本的脚本如下所示:

代码语言:javascript
复制
#!/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"

这将导致以下输出,以便在插入音频cd后插入dvd时记录文件

代码语言:javascript
复制
cdrom
cdrom
dvd
dvd

用撕取脚本的路径替换回波行应该会导致自动无头系统的出现。

在ubuntu论坛上,Jim获得了代码,Keith_Helms和blm_ubunet用于posix代码,并更正了if语句和变量指针在这里的Ixer

希望这能有所帮助

詹姆斯

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29973884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档