Vlc ve Smplayer için Oynatma Listesi

Başlatan mhmtkrktr, 24 Ocak 2018 - 04:37:53

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

mhmtkrktr

Önemli : Bu betik, Videolar dizininde bitişik yazılmamış tüm dizin isimlerini ( - ) ve dosyaları ( _ ) işaretleri ile birleştirir. Bunun yapılmasını istemiyorsanız, betiği kullanmayınız.

Notlar :
1 ) Test edilmiş ve geçerli uygulamalar, Vlc player ve Smplayer 'dır. Bu liste kolaylıkla genişletilebilir. Ben test ettiğim için, kullandığım iki video oynatıcıda sınırlı bıraktım.
2 ) Betik bir kez çalıştırıldığında, varsayılan oynatıcının ~/.config altında ki dizinine PLIST adıyla kendisini klonlar. Deneme amaçlı çalıştırır ve kaldırmak isterseniz, PLIST dosyasını silmeyin. Betiği düzgün şekilde kaldırmak için çalıştığı dizine göre aşağıdaki şekilde uçbirimden kaldırabilirsiniz.
#vlc için
$HOME/.config/vlc/PLIST iptal
#smplayer için
$HOME/.config/smplayer/PLIST iptal

3 ) İçerisinde video dosyası bulunan (sadece videolar dizininde) tüm dizinler, dizin adıyla çalma listesi olarak oynatıcı başlatma dosyasının sağ tık menüsüne gelecektir. Liste adını değiştirmek için dizinin adını değiştirmeniz yeterli olacaktır.
4 ) Herhangi bir dizin veya dosya ( ilave\silme\isim değişikliği vb) değiştirilirse liste, duruma göre önce veya arkaplanda güncellenir.
5 ) Boyutu en büyük olan liste varsayılan oynatma listesi olacaktır. Oynatıcı seçimsiz açıldığında bu liste çalıştırılacaktır.
6 ) Oynatıcı başladığında mevcut ayarlı olan ses, %40 oranında düşürülür ve kademeli olarak ilk seviyesine yükseltilir.
7 ) Liste oluşturma sırasında uçbirim üzerinde animasyon açılır. ( tilix, xfce4-terminal, gnome-terminal için geçerli )
8 ) Sadece Gnome masaüstünde test edildi.

Bazı bölümlerini yeni tamamladım. Üzerinde mantık ve teknik hataları olabilir. Fakat herhangi bir soruna yol açmaz.  :)


#!/usr/bin/bash
#
#

  [[ $(id -u) != 1000 ]] && exit
  sync --file-system
 
  . ~/.config/user-dirs.dirs
  V_DIR="$XDG_VIDEOS_DIR"
  ANM=''
 
  TMP_DIR=$(dirname $(mktemp -u))
  TMP="$TMP_DIR/VDP"
  rm -r "$TMP" 2>/dev/null; mkdir "$TMP"

default_player() {
PSB="$1"
DPL=$(xdg-mime query default video/mp4)
    [[ -z "$DPL" ]] && \
DPL=$(xdg-mime query default video/x-avi)
    [[ -z "$DPL" ]] && \
DPL=$(xdg-mime query default video/x-matroska)
}

content_player_config() {
    [[ -f "${CDR}/VD.list" ]] || \
touch "${CDR}/VD.list"
    [[ -x "$CDR/PLIST" ]] || \
cat "$(readlink -f ${0})" | \
tee "$CDR/PLIST" &>/dev/null
    chmod +x "$CDR/PLIST"
}

default_player_conf() {
CDR=$(find ~/.config -type d -name "*${DPL%.*}*")
    [[ -n "$CDR" ]] && content_player_config
    if [[ -n "$1" && -z "$CDR" ]]; then
mkdir -p ~/.config/$1
CDR=~/.config/$1
content_player_config
    fi
}

    if type vlc &>/dev/null; then
default_player vlc
[[ -n "$DPL" ]] && default_player_conf
    elif type smplayer &>/dev/null; then
default_player smplayer
[[ -n "$DPL" ]] && default_player_conf
    else
echo "==> Uygun ortam bulunamadı !"
exit
    fi
    if [[ -z "$DPL" && -n "$PSB" ]]; then
DPL="${PSB}.desktop"
default_player_conf $PSB
    fi

app_animation='
  TMP_DIR=$(dirname $(mktemp -u))
  TMP=$TMP_DIR/VDP
  echo
pTm="1"
  F="$(tput sgr0)"
  B="$(tput bold)"
  C1="${B}$(tput setaf 99)"
  C2="${B}$(tput setaf 63)"
  C3="${B}$(tput setaf 27)"
  C4="${B}$(tput setaf 21)"
  C5="${B}$(tput setaf 19)"
  C6="${B}$(tput setaf 129)"
  TC=$(tput cols)
  T=$(seq -s" " $(((${TC}-19)/2)) |tr -d '[:digit:]')
  MS=$(cat ${TMP}/animation-message)
  TM=$(((${TC}-$((${#MS}+3)))/2))
  echo -ne "\r${C6}$(yes "*"|head -${TM}|tr -d "\n") ${MS} $(yes "*"|head -${TM}|tr -d "\n")"

play_icon="\n\n
${C1}${T}***
${C1}${T}******
${C2}${T}*********
${C2}${T}************
${C3}${T}***************
${C4}${T}*****************
${C4}${T}********************
${C5}${T}***********************
${C4}${T}********************
${C4}${T}*****************
${C3}${T}***************
${C2}${T}************
${C2}${T}*********
${C1}${T}******
${C1}${T}***\n\n${C6}"
echo -e "$play_icon"

TP=$((${TC}-15))

progress_bar() {
    P=$(($((${1}*100/100*100))/100))
    F=$(($((${P}*${TP::-1}))/10))
    S=$(("${TP::-1}0"-$F))

    R=$(printf "%${F}s")
    L=$(printf "%${S}s")

    printf "\r\t|${R// /▇}${L// /-}| ${P}%%"
}

for i in $(seq 1 100); do
    sleep .$pTm
    progress_bar ${i}
done
sleep 1
'
desktop_file="[Desktop Entry]
Version=1.0
Type=Application
Name=${DPL%.*}
Comment=Video Player
Icon=${DPL%.*}
Exec=${CDR}/PLIST
Actions="

run_app_animation() {
if [[ -n $ANM ]]; then
    echo "$ANM" > "$TMP/animation-message"
    echo "$app_animation" > "${TMP}/app_animation"
    chmod +x "${TMP}/app_animation"

  if type tilix >/dev/null 2>&0; then
    nohup &>/dev/null tilix --window-style=borderless \
    --geometry=90x24 -e "${TMP}/app_animation" &
   
  elif type xfce4-terminal >/dev/null 2>&0; then
    nohup &>/dev/null xfce4-terminal --geometry=90x24 \
    --hide-menubar --hide-borders --hide-scrollbar \
    --hide-toolbar -e "${TMP}/app_animation" &
 
  elif type gnome-terminal >/dev/null 2>&0; then
    nohup &>/dev/null gnome-terminal --geometry=90x24 \
    --hide-menubar -e "${TMP}/app_animation" &
  fi
fi
}

check_volume() {
  CV=$(amixer get Master|awk -F[ '/%/{print $2}'|tail -1|tr -cd [:digit:])
  OV=$((${CV}-(${CV}*40/100)))
    amixer sset Master ${OV}% &>/dev/null 
}

set_volume() {
DEV='' 
  if ! type pactl &>/dev/null; then
    [[ "$CV" -gt 100 ]] && CV='100'
    DEV='amixer'
  fi
  sleep 2.5
  while :; do
[[ -z "$DEV" ]] && \
pactl -- set-sink-volume 0 +1% &>/dev/null || \
amixer sset Master 1%+ &>/dev/null
SV=$(amixer get Master|awk -F[ '/%/{print $2}'| \
tail -1|tr -cd [:digit:])
[[ "${OV}" -ge "${CV}" || ${SV} -lt "${OV}" ]] && \
break
      sleep 0.1
    : $((OV++))
  done
}

check_list() {
  VDF=$(find "$V_DIR" -type f -exec \
file -N -i -- {} + |
sed -n 's!: video/[^:]*$!!p')
    echo -e "$VDF\n$(find ${V_DIR} -type f -name '*.m3u')" >$1
}

combine_gaps() {
  while IFS= read -r LN ; do
cd "$(rev <<<${LN}|cut -d/ -f2-|rev)"
NN=$(sed -re "s/(-|_)/ /g;s/ + / /g;s/ /$1/g" <<<"${LN##*/}")
gio rename "${LN##*/}" "${NN}" >/dev/null
    done <<<"$2"
}

check_sperator() {
DIR_NM=$(find "$V_DIR" -type d -name "* *" -o -name "*_*" |
sort -r -k1 -n)
  [[ -n "$DIR_NM" ]] && combine_gaps "-" "$DIR_NM"

FL_NM=$(find "$V_DIR" -type f -name "* *" |
sort -r -k1 -n)
  [[ -n "$FL_NM" ]] && combine_gaps "_" "$FL_NM"
}

create_desktop_action() {
  Actions=$(grep 'Actions' "$TMP/desktop")
    sed -i "s|${Actions}|${Actions}${DN##*/}\;|" "$TMP/desktop"
    cat <<EOF >> $TMP/desktop

[Desktop Action ${DN##*/}]
Name=${DN##*/}
Exec=${CDR}/PLIST ${DN}/${DN##*/}.m3u
EOF
}

completed_desk_file() {
  if [[ -f "${APP_DIR}/${DPL}" ]]; then
rm "${APP_DIR}/${DPL}"
sleep 1
  fi
  if [[ -f "$TMP/desktop" ]]; then
  cat "$TMP/desktop" | \
tee "${APP_DIR}/${DPL}" \
&>/dev/null
  else
  echo "$desktop_file" | \
tee "${APP_DIR}/${DPL}" \
&>/dev/null
  fi
  update-desktop-database -q
}

create_m3u_file() {
run_app_animation
check_list "${TMP}/VD.list"
  echo "$desktop_file" > "$TMP/desktop"

  while read DN ; do
find "$DN" -maxdepth 1 -type f -exec \
file -N -i -- {} + |
sed -n 's!: video/[^:]*$!!p' |
tee ${DN}/${DN##*/}.m3u \
&>/dev/null
create_desktop_action
  done \
<<<$(rev <<<"$VDF"| cut -d/ -f2-|rev|sort|uniq)

check_list "${CDR}/VD.list"
completed_desk_file
}

delete_m3u_list() {
  find "$V_DIR" -type f -name "*m3u" -exec rm {} \;
}

clean_plist() {
  echo > "${CDR}/VD.list"
}

no_found_m3u() {
  delete_m3u_list
  if [[ -n "$VDF" ]]; then
    check_sperator
    create_m3u_file
  else
    completed_desk_file
  fi
}

source_play_list() {
  VPL=$(find "$V_DIR" -type f -name "*m3u" -printf '%s %p\n' |
  sort -nr|head -1|awk '{print $2}')
}

wait_for_animation() {
  check_volume
  while :; do
    if [[ $(ps -au|grep -v grep|grep 'app_animation') == "" ]]
then break; fi
    sleep .5
  done
  set_volume & disown
}

start_media_player() {
  wait_for_animation
  if [[ -n "$VPL" ]]; then
    if type "${DPL%.*}" &>/dev/null; then
nohup &>/dev/null "${DPL%.*}" "$VPL" &
    else
xdg-open "$VPL"
    fi
  else
    if type "${DPL%.*}" &>/dev/null; then
nohup &>/dev/null "${DPL%.*}" &
    fi
  fi
}

content_control () {
  if [[ -n "$VPL" ]]; then
    find ${VPL%/*} -maxdepth 1 -type f -exec file -N -i -- {} + | \
    sed -n 's!: video/[^:]*$!!p' | tee "${TMP}/check" &>/dev/null
      if ! cmp -cs "${VPL}" "${TMP}/check"
then ANM="${VPL##*/} listesi değiştirilmiş, yeniden oluşturuluyor"
else ANM=""
      fi
  else
    ANM="${DPL%.*} listeleri yeniden oluşturuluyor"
  fi
}

check_content() {
content_control
  if [[ -n "$ANM" ]]; then
        clean_plist
check_all_list
error_correction
  else
start_media_player
  fi
}

check_all_list() {
  APP_DIR=~/.local/share/applications
  [[ -z "$VDF" ]] && check_list "${TMP}/VD.list"
  if grep -q '[a-z]' "${TMP}/VD.list"; then
    if ! cmp -cs "${TMP}/VD.list" "${CDR}/VD.list"
then no_found_m3u
    fi
  else
    delete_m3u_list
    if grep -q '^\[Desktop Action' "${APP_DIR}/${DPL}"
      then completed_desk_file
    fi 
  fi
}

error_correction() {
  if [[ -f "$VPL" ]]; then
    start_media_player
  else
    source_play_list
    start_media_player
  fi
}

  if [[ "$1" == 'iptal' ]]; then
    rm ~/.local/share/applications/$(basename \
    $(readlink -f "${0%/*}.desktop"))
    update-desktop-database -q
    rm $(readlink -f "${0%/*}/PLIST")
    rm $(readlink -f "${0%/*}/VD.list")
    exit
  fi
 
  if [[ -z $1 ]]; then
    if grep -q '[a-z]' "${CDR}/VD.list"; then
        source_play_list
check_content
[[ -z $ANM ]] && check_all_list
    else
        check_list "${TMP}/VD.list"
    if [[ -n "$VDF" ]]; then
    ANM="${DPL%.*} çalma listesi oluşturuluyor"
    check_all_list
    source_play_list
    start_media_player
else
    check_all_list
    start_media_player
fi
    fi
  elif [[ -n "$1" ]]; then VPL="$1"
    if [[ -f "$VPL" ]]; then
        ANM="${VPL##*/} içeriği değişmiş, Liste yenileniyor"
        check_content
    else
        check_list "${TMP}/VD.list"
        if [[ -n "$VDF" ]]; then
    ANM="${VPL##*/} bulunamadı, Listeler tekrar oluşturuluyor"
    clean_plist
    check_all_list
    error_correction
else
    start_media_player
fi
    fi
fi