LINUX.ORG.RU

Скрипт для запуска флешек в нормальном проигрывателе.

 


4

1

Всем привет.

Попросил тут меня друг написать ему скрипт. Он часто просматривает видео в нэте, а нетбук очень слабый, и видео во флешках-в-фулскрине часто притормаживает. Так вот, с помощью этого скрипта можно запустить видос в браузере и нажать паузу, а смотреть уже в каком-нибудь нормальном проигрывателе.

Суть:

#!/bin/sh
#encoding=utf-8

pids=`ps x | grep libflashplayer.so | grep -v grep | awk '{print $1}'`

echo "=== FlashPlayer PIDs: ===\n$pids\n"

i=0
for pid in $pids; do
	fds=`lsof -p $pid | grep Flash | \
		awk '{print $4"|"$7}' | sed 's/[^0-9]//'`
	for fd in $fds; do
		i=`expr $i + 1`
		path=`echo $fd | sed 's/|.*//'`
		size=`echo $fd | sed 's/.*|//'`
		files=$files"/proc/$pid/fd/$path\n"
		list=$list"$i /proc/$pid/fd/$path $size "
	done
done

echo "=== Flash files: ===\n$files"

case $i in
	0) zenity --title="$0" --error --text="Flash files not found" ;;
	1) file=`echo $files` ;;
	*)
		file=`zenity --title="$0" --list \
			--width=430 --height=340 --text="Select file:" \
			--column="#" --column="File" --column="Size" \
			--print-column=2 $list`
	;;
esac

if [ -n "$file" ]; then
	dir=`dirname $file`
	act=`zenity --title="$0" --list \
		--width=420 --height=360 --text="Select action for $file:" \
		--column="Actions" --column="Commands" --print-column=2 \
		"Copy file" "cp" \
		"Open directory in nautilus" "nautilus $dir" \
		"Open directory in pcmanfm" "pcmanfm $dir" \
		"Open directory in thunar" "thunar $dir" \
		"Play file in mplayer" "mplayer $file" \
		"Play file in smplayer" "smplayer $file" \
		"Play file in vlc" "vlc $file" \
		`
	case "$act" in
		cp)
			path=`zenity --title="$0" --file-selection --save`
			if [ -n "$path" ]; then
				cp $file "$path" | \
				zenity --title="$0" --progress --auto-close \
				--pulsate --width=600 --text="Copy $file to $path"
			fi
		;;
		*) `$act` ;;
	esac
fi

Для работы требуется zenity. Тестировал только на chromium'е которым он пользуется.

.desktop файл:

#!/usr/bin/env xdg-open
[Desktop Entry]
Encoding=UTF-8
Name=flash
Exec=/home/user/bin/flash.sh
Icon=smplayer
Terminal=false
StartupNotify=true
Type=Application

меняйте строку Exec=/home/user/bin/flash.sh до того места где он будет находиться.

Это один из первых моих опытов написания скриптов (да и вообще один из первых опытов прогания), поэтому буду рад услышать замечания.

буду рад услышать замечания

pids=`ps x | grep libflashplayer.so | grep -v grep | awk '{print $1}'`

Во-первых, grep | awk легко заменяется либо на grep | cut, либо просто на awk. Потратьте немного времени на чтение документации по этому языку (предку Perl, между прочим).
Во-вторых, то же самое делает команда pgrep -f libflashplayer.so, и уродливая фильтрация grep не нужна.

fds=`lsof -p $pid | grep Flash | \
awk '{print $4"|«$7}' | sed 's/[^0-9]//'`
...

Не проще ли `ls -l /proc/$pid/fd | awk '/Flash/{print $9}'`? Сразу получаете список файлов.

`$act`

Опасайтесь спецсимволов в именах файлов! Впрочем, если бы они были, они бы всё испортили гораздо раньше, ещё на этапе разрезания списка при помощи for var in $string.

AITap ★★★★★ ()
Последнее исправление: AITap (всего исправлений: 1)
Ответ на: комментарий от AITap

Во-первых, grep | awk легко заменяется либо на grep | cut, либо просто на awk. Потратьте немного времени на чтение документации по этому языку (предку Perl, между прочим).
Во-вторых, то же самое делает команда pgrep -f libflashplayer.so, и уродливая фильтрация grep не нужна.

Спасибо за pgrep. Я уже очень давно пользуюсь лином, а не знал о нём.

fds=`lsof -p $pid | grep Flash | \
awk '{print $4"|«$7}' | sed 's/[^0-9]//'`

Не проще ли `ls -l /proc/$pid/fd | awk '/Flash/{print $9}'`? Сразу получаете список файлов.

Эм, вот тут я не допонял. sed 's/[^0-9]//', в моём варианте, просто убирает последнюю (ненужную) букву в конце дескриптора файла. А awk выводит не только список файлов, но и их размер через »|" (это всё потом парсится для подготовки «имя/размер»-строки для zenity).

Опасайтесь спецсимволов в именах файлов! Впрочем, если бы они были, они бы всё испортили гораздо раньше, ещё на этапе разрезания списка при помощи for var in $string.

Ох, вот за это замечание особое спасибо. Буду думать.

tmp2155 ()
Ответ на: комментарий от tmp2155

А я недопонял, зачем были нужны эти строковые операции. Теперь понятно, спасибо.

Для таких сложных структур данных лучше использовать более подходящие для этого языки.

Не совсем понял, зачем делить две строки символом «|», а потом обратно склеивать в строку через пробел. Попробуйте разделять их пробелом и таким образом экономить на операции получения размера, просто добавляя «$i $fd» к $list.

// Только что сам попробовал найти открытые плагином файлы с видео и с удивлением обнаружил, что у меня таких файлов не находится.

AITap ★★★★★ ()
Ответ на: комментарий от AITap

зачем делить две строки символом «|», а потом обратно склеивать в строку через пробел. Попробуйте разделять их пробелом и таким образом экономить на операции получения размера, просто добавляя «$i $fd» к $list.

Сначала я так и хотел сделать, но второй (вложенный) цикл «for … in …» (строка 12) отрабатывал отдельно на файл и на размер (и вобщем-то правильно делал). Вот мне кроме тупой склейки строки «левым» символом, ничего умнее в голову не пришло ) .

// Только что сам попробовал найти открытые плагином файлы с видео и с удивлением обнаружил, что у меня таких файлов не находится.

Опишите, пожалуйста, какой браузер (и версия) использовался и на каком сайте флеш-видео было открыто.

Я там в первом сообщении описал что тестировалось это всё только в хромиуме (22.0.1229.94). Да и тестил только youtube, vimeo и video.yandex.

Некоторые браузеры, например, наиболее любимый мной iceweasel (в данный момент 10.0.11) иногда непонятно где это видео сохраняют, и соответственно скрипт этот, работает с ними через раз ( .

tmp2155 ()
Ответ на: комментарий от tmp2155

Опишите, пожалуйста, какой браузер (и версия) использовался и на каком сайте флеш-видео было открыто.

Iceape 2.7.11, Youtube, Flash player 11.2.202.251.

Видимо, на браузерах семейства Mozilla Flash иногда шутит с временными файлами.

AITap ★★★★★ ()
Ответ на: комментарий от AITap

Видимо, на браузерах семейства Mozilla Flash иногда шутит с временными файлами.

Похоже на то. Я весь гугл измучил, и пол инэта облазил, в поисках решения проблемы, но так ничего и не нашёл. Удивительно то, что сам iceweasel (ну и iceape тоже) вместе с хромиумом, используют одну и ту-же библиотеку libflashplayer.so из пакета flashplugin-nonfree, но сохраняют видео почему-то по-разному.

Спасибо лору — узнал что хром создаёт файл в /tmp/FlashXX.* и сразу его удаляет, поэтому приходится рыться в /proc/, а вот как сохраняет эти файлы flash в firefox — пока непонятно.

tmp2155 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.