Konum ve Tam Dosya Adı Verilmeksizin Ses Dosyası Oynatabilen Betik

Başlatan mimiksiz, 16 Haziran 2019 - 22:51:40

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

mimiksiz

Düzenleme:
Yeni betik için geçerli parametreler -d, -y (yardım), arancak sözcükler.
-d ile döngü tekrarını girilebilir. Sonsuz döngü için !
Sözcükler büyük / küçük harf duyarlılığı olmaksızın girilebilir.
Örnek kullanım ./betik.sh penguen linux -d 3 okyanus
Çalışabilmesi için zsh ve mpv lazım.
Yeni betik:

#!/bin/zsh
yardım="Geçerli parametreler -d, -y, sözcükler\n-d ile döngü tekrarını girilebilir. Sonsuz döngü için !\nSözcükler büyük / küçük harf duyarlılığı olmaksızın girilebilir.\nÖrnek kullanım : betik.sh penguen linux -d 3 okyanus\n-y bu içeriği gösterir."
oynatıcı=mpv
parametreler=$@
dinlenecekler=""
__parametreler=""
arandı=0
mime_type () {
ses_dosyaları=""
while read -r dosya
do
if [ ! -z $dosya ]
then
local mime=$(file --mime-type $dosya | awk '{print $NF}')
xmime=0
if [ ${mime//\/*} = audio ]
then
xmime=1
elif [ ${mime//\/*} = video ]
then
if [ -z $(ffprobe -v quiet -select_streams v:0 -show_entries stream=codec_name -print_format csv=p=0 $dosya) ]
then
xmime=1
fi
fi
[ $xmime -eq 1 ] && ses_dosyaları=$(echo $dosya|sed -n 1'p')  && break
fi
done <<< $@
}
_dinle2 () {
while read -r dosya
do
$oynatıcı $dosya
done <<< $dinlenecekler
}
_dinle () {
if [ $döngü_tekrarı = ! ] &> /dev/null
then
while
do
_dinle2
done
else
for ((a=1; a<=$döngü_tekrarı; a++ )) do
_dinle2
done
fi
}
ara () {
if [ ! -z $@ ]
then
dosyalar=$(find $(ls ~) -type f -not -path '*/\.*' -iname "*$@*" 2&>/dev/null)
if [ -z $dosyalar ]
then
while read -r dosya
do
_dosyalar=$(find $dosya -type f -not -path '*/\.*' -iname "*$@*" 2&>/dev/null)
dosyalar=$(echo $_dosyalar;echo $dosyalar)
done <<< $(ls ~|grep " ")
fi
dosyalar=$(echo $dosyalar|grep -v "^$")
fi
}
f () {
dosyalar=""
local _parametre=$(echo $@|awk '{print $1}')
local _parametre_adet=$(echo $@|wc -w)
for ((a=2; a<=$_parametre_adet; a++ )) do
local bulunan=""
_parametre=$(echo -n $_parametre\ ;echo $@|awk '{print '"\$${a}"'}')
_dosyalar=$dosyalar
ara $_parametre
_ses_dosyaları=$ses_dosyaları
mime_type $dosyalar
if [ ! -z $ses_dosyaları ] && [ $_parametre_adet -eq $a ]
then
for ((_a=1; _a<=$a; _a++ )) do
bulunan=$(echo -n $bulunan\ ;echo -n $@|awk '{print '"\$${_a}"'}')
done
ekle=$ses_dosyaları
elif [ $a -eq $_parametre_adet ]
then
for ((b=1; b<$a; b++ )) do
bulunan=$(echo -n $bulunan\ ;echo -n $@|awk '{print '"\$${b}"'}')
done
[ $(echo $bulunan|wc -w) -eq 1 ] && ekle=$_ses_dosyaları
elif [ -z $ses_dosyaları ]
then
ekle=$_ses_dosyaları
for ((b=1; b<$a; b++ )) do
bulunan=$(echo -n $bulunan\ ;echo -n $_parametre|awk '{print '"\$${b}"'}')
done
break
else
ekle=$ses_dosyaları
bulunan=$_parametre
fi
done
dinlenecekler=$(echo $dinlenecekler\\n$ekle)
if [ $(echo $@|wc -w) -ne $(echo $bulunan|wc -w) ]
then
bulunanlar=$(echo -n $bulunanlar\ ;echo -n $bulunan)
if echo $@ | grep $bulunan\  &> /dev/null
then
aranacaklar=$(echo $@|sed "s/$bulunan\ //g")
elif echo $@ | grep \ $bulunan &> /dev/null
then
aranacaklar=$(echo $@|sed "s/\ $bulunan//g")
fi
f2 $aranacaklar
fi
}
f2 () {
local bulundu_indis=0
local _aranacaklar=""
local parametre_adet=$(echo $@|wc -w)
ses_dosyaları=""
for ((b=1; b<=$parametre_adet; b++ )) do
ara $(echo $@|awk '{print '"\$${b}"'}')
[ ! -z $dosyalar ] && mime_type $dosyalar
[ ! -z $ses_dosyaları ] &> /dev/null && bulundu_indis=$b  && break
done
if [ $parametre_adet -eq 1 ]
then
[ $bulundu_indis -eq 1 ] && dinlenecekler=$(echo $dinlenecekler;echo $ses_dosyaları)
elif [ $bulundu_indis -ne 0 ] && [ $parametre_adet -ne 1 ]
then
for ((a=$bulundu_indis; a<=$parametre_adet; a++ )) do
_aranacaklar=$(echo -n $_aranacaklar;echo -n \ ;echo $@|awk '{print '"\$${a}"'}')
done
[ $(echo $_aranacaklar|wc -w) -eq 1 ] && dinlenecekler=$(echo $dinlenecekler\\n$ses_dosyaları)  || f $_aranacaklar
elif [ $bulundu_indis -eq 0 ] && [ $parametre_adet -gt 1 ]
then
f2 $(echo $@|awk '{for (a = 2; a <= NF; ++a){printf $a;printf " "}}')
fi
}
başla () {
       arandı=1
parametre_adet=$(echo $parametreler|wc -w)
ara $parametreler
[ ! -z $dosyalar ] && mime_type $dosyalar && dinlenecekler=$(echo $ses_dosyaları)
if [ -z $dinlenecekler ]
then
[ $parametre_adet -ne 1 ] && f2 $parametreler
fi
}
if echo $@ | grep \ \\-y &> /dev/null || echo $@ | grep \\-y\  &> /dev/null || [ ${#@} -eq 0 ] || [ $@ = \-y ] &> /dev/null || [ $@ = \-d ] &> /dev/null
then
echo $yardım
elif echo $@ | grep \ \\-d &> /dev/null || echo $@ | grep \\-d\  &> /dev/null
then
ikinci_parametre=$(echo $@|awk '{print $2}')
if [ $(echo ${#@}) -eq 2 ] &> /dev/null && [ $ikinci_parametre -eq $ikinci_parametre ] &> /dev/null
then
echo $yardım
else
for ((a=1; a<=${#@}; a++ )) do
if [ $(echo $@|awk '{print '"\$${a}"'}') = \-d ]
then
b=$(( $a+1 ))
if [ $a -eq ${#@} ]
then
döngü_tekrarı=1
else
döngü_tekrarı=$(echo $@|awk '{print '"\$${b}"'}')
döngü_tekrarı_indisi=$b
tire_d_indisi=$a
fi
break
fi
done
if [ $döngü_tekrarı != ! ] &> /dev/null && [ ! -z $(echo $döngü_tekrarı|tr -d '[0-9]') ]
then
döngü_tekrarı=1
for ((a=1; a<=${#@}; a++ )) do
if [ $a -ne $tire_d_indisi ] &> /dev/null
then
_parametreler=$(echo $parametreler|awk '{print '"\$${a}"'}'|tr -d "\n")
__parametreler=$(echo -n $__parametreler;echo \ $_parametreler)
fi
done
else
for ((a=1; a<=${#@}; a++ )) do
if [ $a -ne $döngü_tekrarı_indisi ] &> /dev/null &> /dev/null && [ $a -ne $tire_d_indisi ] &> /dev/null
then
_parametreler=$(echo $parametreler|awk '{print '"\$${a}"'}'|tr -d "\n")
__parametreler=$(echo -n $__parametreler;echo \ $_parametreler)
fi
done
fi
parametreler=$(echo ${__parametreler:1})
cd
başla
fi
else
döngü_tekrarı=1
cd
başla
fi
if [ ! -z $dinlenecekler ]
then
dinlenecekler=$(echo $dinlenecekler|awk '!/^$/')
dinlenecek_adet=$(echo $dinlenecekler|wc -l)
for ((a=1; a<=$dinlenecek_adet; a++ )) do
dinlenecek=$(echo $dinlenecekler|sed -n $a'p')
if [ $(echo $dinlenecekler|grep -F "$dinlenecek"|wc -l) -gt 1 ]
then
dinlenecekler=$(echo $dinlenecekler|sed -e $a'd')
fi
done
dinlenecekler=$(echo $dinlenecekler|awk '!/^$/')
[ $döngü_tekrarı = ! ] &> /dev/null && _döngü_tekrarı=sürekli  || _döngü_tekrarı=$döngü_tekrarı
echo $dinlenecekler | wc -l | tr -d "\n"
echo \ adet\ dosya\ $_döngü_tekrarı\ kere\ oynatılacak.\\n$dinlenecekler\\n
true
_dinle
elif [ $arandı -eq 1 ] &> /dev/null
then
echo Dosya\ bulunamadı.
fi


Eski betik:
Alt dizinlerinde ki 'Penguenler.ogg' parçasını üst dizinde ve tam dosya adı girilmeden oynatabilir. ./dinle.sh penguen
Parametre olarak -y yardım metni, -d döngü seçimi ve düz metinler olarak aranacak ses dosyasının adını alabilir.
Düz metin parametresi adedince ses dosyası arayıp oynatır. (alt dizinlerde veya bulunduğu dizinde mevcutsa)
-d parametresinin yanına pozitif tam sayı girilirmesi döngünün tekrarını belirtir.
-d parametresinin yanına tekrar adedi verilmezse sonsuz döngüde çalışır.
Betiğin çalıştığı dizinde parametreye uygun dosya varsa alt dizin taraması yapmadan oynatır. Yoksa tarar ve ilk geçerli sonucu bulduğunda taramayı sonlandırıp oynatır. ( dinle.sh penguen girildiğinde penguen.ogg yerine penguen2.mp3 çalabilir.)
Örnek kullanım: dinle.sh linux penguen dağ -d
Betiğin içerisinde oynatıcı değişkenini değiştirip dilediğiniz uçbirim medya oynatıcısını kullanabilirsiniz.
Betiğin çalışması için oynatma değişkeni değiştirmediyse mpv ve zsh yazılımları lazım.


#!/bin/zsh
yardım="Betik -d ve oynatmak istenen dizgi parametrelerini alabilir.\n -d parametresi yanında pozitif tam sayı girilirse döngü adedi belirlenmiş olur. \n -d pozitif tam sayı olmadan girilmişse belirsiz döngüde oynatma yapılır. Ses dosyasının adında geçen kelimeyi büyük / küçük harf duyarlılığı olmaksızın parametre olarak verirseniz oynatabilir. Eğer parametre geçerli dizinde bulunamazsa alt dizinlerde ses dosyası taraması yapılır ve eşleşen ilk ses dosyası oynatılır.\nÖrnek kullanım ./dinle.sh dağ okyanus -d 3\n-y Bu metni gösterir."
oynatıcı=mpv
parametreler=""
üst_parametre=""
dosya_varmı=1
dinlenecekler=""
_1=""
_dinle () {
echo $dinlenecekler | while read -r satır
do
$oynatıcı $satır
done
}
f () {
if [ $dosya_varmı -eq 1 ]
then
echo $parametreler | while read -r satır
do
if [ $satır != \-d ] && [ $satır != $üst_parametre ]
then
dosya=$satır  && _dosya=$(ls|grep -i $dosya 2&>/dev/null)
if [ ! -z $_dosya ] && [ -f $_dosya ]
then
[ $(file --mime-type $_dosya|awk -F \:\  '{print $2}'|awk -F \/ '{print $1}') = audio ] && dinlenecekler=$(echo $_dosya;echo $dinlenecekler)  && dosya_varmı=2
else
[ $dosya_varmı -ne 2 ] && dosya_varmı=0
fi
fi
done
fi
[ $dosya_varmı -eq 2 ] && _dinle
if [ $dosya_varmı -eq 0 ]
then
echo $parametreler | while read -r satır
do
if [ $satır != \-d ] && [ $satır != $üst_parametre ]
then
_dosya=$(find -type f|grep -i $satır)
if [ ! -z $_dosya ]
then
for _dosya2 in $_dosya
do
echo $_dosya2 | while read -r iç_satır
do
if file --mime-type $iç_satır | grep audio\/ &> /dev/null
then
_1=$(echo $iç_satır|awk -F audio\/ '{print $1}')  && _1=$(echo $_1|sed 's/\ $//g'|sed 's/://g')
[ ! -z $_1 ] && break
fi
done
done
fi
fi
if [ ! -z $_1 ] && ! echo $dinlenecekler | grep $_1 &> /dev/null
then
dinlenecekler=$(echo $_1; echo $dinlenecekler)
fi
done
fi
if [ ! -z $dinlenecekler ]
then
if [ $üst_parametre = sürekli ]
then
while
do
_dinle
done
elif [ $üst_parametre -eq $üst_parametre ]
then
for ((a=1; a<=$üst_parametre; a++ )) do
_dinle
done
fi
else
echo "Girilen parametrelere uygun ses dosyası mevcut değil."
fi
}
çık=0  && parametre_adet=$(echo ${#@})
[ -z $@ ] &> /dev/null && çık=1
if echo $@ | grep \\-y &> /dev/null
then
çık=1
elif echo $@ | grep \\-d &> /dev/null
then
for ((a=1; a<=$parametre_adet; a++ )) do
_parametre=$(echo $@[a])
if [ $_parametre = \-d ]
then
b=$(( $a+1 ))
[ -z $üst_parametre ] && üst_parametre=$(echo $@[b])
[ $üst_parametre -eq $üst_parametre ] &> /dev/null || üst_parametre=sürekli
else
[ @$_parametre@ != "$üst_parametre" ] && parametreler=$(echo $_parametre; echo $parametreler)
fi
done
[ $üst_parametre -eq $üst_parametre ] &> /dev/null && [ $üst_parametre -lt 1 ] &> /dev/null && çık=1
[ $üst_parametre -ne $üst_parametre ] &> /dev/null && üst_parametre=sürekli
elif ! echo $@ | grep \\-d &> /dev/null
then
for ((a=1; a<=$parametre_adet; a++ )) do
_parametre=$(echo $@[$a])
parametreler=$(echo $_parametre; echo $parametreler)
done
üst_parametre=1
fi
[ $çık -eq 0 ] && f
[ $çık -eq 1 ] && echo $yardım

mhmtkrktr

Eline sağlık. Güzel bir alias olur bundan.
Kabaca bir kaç değişiklik yaptım. Uygun görürsen buna göre de düzenleyebilirsin.

#!/bin/zsh
yardım="Betik -d ve oynatmak istenen dizgi parametrelerini alabilir.\n -d parametresi yanında pozitif tam sayı girilirse döngü adedi belirlenmiş olur. \n -d pozitif tam sayı olmadan girilmişse belirsiz döngüde oynatma yapılır. Ses dosyasının adında geçen kelimeyi büyük / küçük harf duyarlılığı olmaksızın parametre olarak verirseniz oynatabilir. Eğer parametre geçerli dizinde bulunamazsa alt dizinlerde ses dosyası taraması yapılır ve eşleşen ilk ses dosyası oynatılır.\nÖrnek kullanım ./dinle.sh dağ okyanus -d 3\n-y Bu metni gösterir."
oynatıcı=mpv
parametreler=""
üst_parametre=""
dosya_varmı=1
dinlenecekler=""
_1=""

_dinle () {
echo $dinlenecekler | while read -r satır
do
$oynatıcı $satır
done
}

mime_type() {

# 'file --mime-type' m4a gibi ses dosyalarını, video dosyası olarak yanlış tanımlayabiliyor.
# bu fonksiyon, ffmpeg paketinin aracı olan ffprobe ile video gibi görünen diğer ses dosyalarını ayırt etmede kullanılabilir

local mime=$(file --mime-type $@ | awk '{print $NF}') ; xmime=0

if [ ${mime//\/*} = audio ]
then
xmime=1
elif [ ${mime//\/*} = video ]
then
if [ -z $(ffprobe -v quiet -select_streams v:0 -show_entries stream=codec_name -print_format csv=p=0 $@) ]
then
xmime=1
fi
fi
if [ $xmime -eq 1 ]
then
dinlenecekler=$(echo $@;echo $dinlenecekler)  && dosya_varmı=2
fi
}

f () {
if [ $dosya_varmı -eq 1 ]
then
echo $1 | while read -r satır
do
if [ $satır != \-d ] && [ $satır != $üst_parametre ]
then
dosya=$satır  && _dosya=$(ls|grep -i $dosya 2&>/dev/null)

if [ ! -z $_dosya ] && [ -f $_dosya ]
then
# [ $(file --mime-type $_dosya|awk -F \:\  '{print $2}'|awk -F \/ '{print $1}') = audio ] && dinlenecekler=$(echo $_dosya;echo $dinlenecekler)  && dosya_varmı=2
mime_type "$_dosya"
else
[ $dosya_varmı -ne 2 ] && dosya_varmı=0
fi
fi
done
fi
[ $dosya_varmı -eq 2 ] && _dinle
if [ $dosya_varmı -eq 0 ]
then
echo $1 | while read -r satır
do
if [ $satır != \-d ] && [ $satır != $üst_parametre ]
then

# Ses dosyalarının gizli dosya olmayacağı varsayımı ile, find komutu, genel kullanıcı dizinleri ile sınırlandırılarak daha hızlı sonuç alınabilir.

# _dosya=$(find -type f|grep -i $satır)
_dosya=$(find $(ls ~) -type f -not -path '*/\.*' -iname "*$satır*")

if [ ! -z $_dosya ]
then
for _dosya2 in $_dosya
do
echo $_dosya2 | while read -r iç_satır
do
# if file --mime-type $iç_satır | grep audio\/ &> /dev/null
mime_type "$iç_satır"

if [ $xmime -eq 1 ]
then
_1=$(echo $iç_satır|awk -F audio\/ '{print $1}')  && _1=$(echo $_1|sed 's/\ $//g'|sed 's/://g')
[ ! -z $_1 ] && break
fi
done
done
fi
fi
if [ ! -z $_1 ] && ! echo $dinlenecekler | grep $_1 &> /dev/null
then
dinlenecekler=$(echo $_1; echo $dinlenecekler)
fi
done
fi
if [ ! -z $dinlenecekler ]
then
if [ $üst_parametre = sürekli ]
then
while
do
_dinle
done
elif [ $üst_parametre -eq $üst_parametre ]
then
for ((a=1; a<=$üst_parametre; a++ )) do
_dinle
done
fi
else
echo "Girilen parametrelere uygun ses dosyası mevcut değil."
fi
}
çık=0  && parametre_adet=$(echo ${#@})
[ -z $@ ] &> /dev/null && çık=1
if echo $@ | grep \\-y &> /dev/null
then
çık=1
elif echo $@ | grep \\-d &> /dev/null
then
for ((a=1; a<=$parametre_adet; a++ )) do
_parametre=$(echo $@[a])
if [ $_parametre = \-d ]
then
b=$(( $a+1 ))
[ -z $üst_parametre ] && üst_parametre=$(echo $@[b])
[ $üst_parametre -eq $üst_parametre ] &> /dev/null || üst_parametre=sürekli
else
[ @$_parametre@ != "$üst_parametre" ] && parametreler=$(echo $_parametre; echo $parametreler)
fi
done
[ $üst_parametre -eq $üst_parametre ] &> /dev/null && [ $üst_parametre -lt 1 ] &> /dev/null && çık=1
[ $üst_parametre -ne $üst_parametre ] &> /dev/null && üst_parametre=sürekli
elif ! echo $@ | grep \\-d &> /dev/null
then

# isminde boşluk olan arama terimlerin de, her kelime için ayrı tarama yapılıyor ve asıl aranan terim, benzer içeriklerin arasında veya sonunda kalabiliyor.
# eğer aynı komut ile birden fazla içerik aranmayacaksa bu şekilde olabilir.
# (Bu şekilde -d ile sayı verilmemişse 1 kez çalar ve çıkar)
# Birden çok parça adı aranacak ise, bununla ilgili farklı bir düzenleme yapılabilir

# for ((a=1; a<=$parametre_adet; a++ )) do
# _parametre=$(echo $@[$a])
# parametreler=$(echo $_parametre; echo $parametreler)
# done


parametreler=$@
üst_parametre=1
fi
[ $çık -eq 0 ] && f "$parametreler"
[ $çık -eq 1 ] && echo $yardım

mimiksiz

@mhmtkrktr önerileriniz için teşekkür ederim. Birden fazla dosyayı doğru bulması için düzenlemek zor oldu, yeni betiği ilk mesaja ekledim.