Categories: Perl

youtube-view/

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

Недавно я попробовал установить Flash, и инстяллятор за каким-то хреном дополнительно установил мне антивирус McAfee. Даже не пытаясь попросить у меня разрешения. Просто взял и поставил! Хотя, в общем-то, понятно за каким хреном он это сделал. Должна же Adobe на чем-то зарабатывать?

Гуру юзабилити Якоб Нильсен пишет о Flash следующее:

About 99% of the time, the presence of Flash on a website constitutes a usability disease.

И самое главное — все, что умеет Flash, можно реализовать средствами HTML5 и jQuery! Нужно отдать ему должное, благодаря флэшу (по крайней мере, точно не без его помощи) сегодня мы имеем потоковое видео и аудио в сети. Но никто же не пользуется Mosaic , просто потому что он был первым графическим браузером?

Понимая вышесказанное и силу открытых технологий, Google ведет работы по внедрению HTML5 на YouTube. К сожалению, релиз Firefox под номером 4 еще не состоялся, а переходить на Оперу только ради Ютуба как-то не хочется. Я мог бы смотреть видео с помощью Flash, но под любимой FreeBSD для этого нужно прибегнуть к использованию linux_base.

Честно говоря, меня в последнее время мало волнует, ставлю я программу, использующую QT или GTK, нужен ли ей для работы linux_base или не нужен. Главное — чтобы работало. Но, в силу старой привычки, наверное, я предпочел написать небольшой скрипт для скачивания и просмотра видео.

#!/usr/bin/perl
# YouTube View Script v 0.9.8
# (c) Alexandr A Alexeev 2011 | http://remontka.com/

use strict ;

use constant VERSION => «0.9.8» ;
# куда сохраняем ролики (слэш на конце!)
use constant DEFAULT_PATH => ‘/tmp/’ ;
# удаляем после просмотра?
use constant DEFAULT_DELETE => 1 ;
use List :: MoreUtils qw/uniq/ ;
use utf8 ;

#### проверяем наличие всех необходимых утилит ####
{
my @depends = qw/date wget mplayer youtube-dl/ ;
my $not_found ;
for ( @depends ) {
print «ERROR: $_ not found» and ++ $not_found
if system ( «which $_ > /dev/null» ) ;
}
exit 1 if $not_found ;
}

my $url = shift ;
$url =~ s/(^s+|s+$)//g ;
die «YouTube View Script ver » . VERSION .
» n Usage: n $0 <url> n $0 —dialog n » unless ( $url ) ;

if ( $url eq «—dialog» ) {
print «Dialog mode, enter url(s) or ‘exit’ n ytview> » ;
while ( $url = <STDIN> ) {
chomp ( $url ) ;
if ( length ( $url ) ) {
last if ( ( » L $url» eq «exit» ) or ( » L $url» eq «quit» ) ) ;
$url =~ s/’/’/g ;
system ( «$0 ‘$url'» ) unless ( $url eq «—dialog» ) ;
print » n » ;
}
print «ytview> » ;
}
exit ;
}

my $delete = $ENV { YOUTUBE_VIEW_DELETE } ;
$delete = DEFAULT_DELETE unless ( defined ( $delete ) ) ;

my $path = $ENV { YOUTUBE_VIEW_PATH } ;
$path = DEFAULT_PATH unless ( defined ( $path ) ) ;

print qq {
delete = $delete
path = $path
} ;

my @ids ;
my $data ;
my $q_url = $url ;
$q_url =~ s/’/’/g ;

if ( $url =~ m #^(?:https?://)?(?:www.)?(?:youtube.com/watch?v=|youtu.be/)([^&]+)#i) {
# некоторое видео (например, с пометкой 18+) может требовать
# от пользователя авторизации. youtube-dl успешно это обходит
# так что если ссылка прямо на ролик, не нужно ничего скачивать
push @ids , $1 ;
} else {
# скачиваем веб-страничку
print «Downloading $url… n » ;
$data = `wget -q ‘$q_url’ -O -` ;

if ( my @ljurls = $data =~ /(http://(?:www.)?lj-toys.com/[^'» ]+)/ig ) {
print «LJ Toys detected, » . scalar ( @ljurls ) . » frames found… n » ;
$data = «» ;
for my $url ( @ljurls ) {
$url =~ s/&amp;/&/gi ;
print «url = $url n » ;
$data .= `wget -q ‘$url’ -O -` ;
}
}

# пытаемся выдрать из нее id ролика (роликов?)
@ids = $data =~ /http://(?:www.)?youtube.com/(?:watch)???(?:v|video|embed)(?:=|/)([a-zA-Z0-9-_]+)/gi ;
@ids = uniq @ids ;
}

my $id ;
# сколько роликов на странице?
if ( ( scalar @ids <= 1 ) or ( $url =~ /(http://)?(www.)?youtu(.be|be.com)//i ) ) {
$id = $ids [ 0 ] ;
} else {
# на странице более одного ролика
# выводим их id и названия, выбор должен сделать юзер
my $n ;
print » n It was found more than one video: n » ;
for my $vid ( @ids ) {
$data = `wget -q ‘http://youtu.be/$vid’ -O -` ;
utf8 :: decode ( $data ) ;
my ( $title ) = $data =~ /<meta name=»title» content=»([^»]+)»>/ ;
$title = «Undefined title» unless $title ;
$title = substr ( $title , 0 , 30 ) . «…»
if length ( $title ) > 32 ;
utf8 :: encode ( $title ) ;
print $n ++. «. $vid :: $title n » ;
}

while ( $n > $#ids ) {
print «Your choice (0..$#ids): » ;
chomp ( $n = <STDIN> ) ;
$n = scalar @ids unless ( $n =~ /^[0-9]+$/ ) ;
}

$id = $ids [ $n ] ;

unless ( $id ) {
die «Failed to parse $url n » .
«wget returns $? n » .
«length( $ data) = » . length ( $data ) . » n » ;
}
}
print «id = $id, downloading video… n » ;
# имя файла для воспроизведения
my $fname ;

# проверяем наличие ролика в кэше
my $cached_found = 0 ;
if ( ! $delete ) {
my @flist = glob «$path*.flv» ;
for my $curr_fname ( @flist ) {
if ( $curr_fname =~ /d{4}-d{2}-d{2}-([a-z0-9_-]+).flv$/i ) {
if ( $1 eq $id ) {
$fname = $curr_fname ;
$cached_found = 1 ;
print «Found cached file: $fname n » ;
last ;
}
}
}
}

# скачиваем видео с помощью youtube-dl
if ( ! $cached_found ) {
chomp ( my $date = `date +%Y-%m-%d` ) ;
$fname = «$path$date-$id.flv» ;
print «fname = $fname n » ;

system ( «youtube-dl ‘http://youtube.com/watch?v=$id’ -o $fname» ) ;
if ( $? ) {
unlink «$fname.part» ;
die «youtube-dl returns $? n »
}
print «done! n » ;
}

# запускаем проигрыватель
system ( «mplayer -zoom $fname» ) ;
print qq {
EMBED CODE :
——— 8 <——— 8 <———
< iframe class = «youtube-player» type = «text/html»
width = «640» height = «385»
src = «http://www.youtube.com/embed/$id» frameborder = «0» >
</ iframe >
< div style = «font-size: 0.8em» > Posted via < a href = «http://remontka.com/youtube-view/» > YouTube View </ a > script .</ div >
——— 8 <——— 8 <———
SHORT LINK : http :// youtu . be / $id
} ;
unlink $fname if $delete ;

Идея простая — берем код страницы, содержащей видео, и выдираем из нее ID ролика. Затем скачиваем этот ролик с помощью youtube-dl (/usr/ports/www/youtube_dl) и просматриваем в mplayer. Плюс к этому, скрипт выводит embed-код и короткую ссылку на видео (http://youtu.be/…). Есть возможность работать со страницами, содержащими несколько роликов.

По умолчанию видео сохраняется скриптом в каталог /tmp и удаляется после просмотра. Изменить такое поведение можно с помощью переменных окружения:

# кусок моего ~/.bashrc

# алиас к скрипту
alias ytview = «~/scripts/perl/ytview.pl»
# не удаляем ролики после просмотра
export YOUTUBE_VIEW_DELETE = 0
# каталог для сохранения роликов (слэш на конце!)
export YOUTUBE_VIEW_PATH =~ / nodump / youtube /

Мне такое решение нравится намного больше, чем скачивание пол-линукса и установка флэш-плагина. Костыль, конечно, но поможет дождаться повсеместного внедрения HTML5 Video. Надеюсь, вам этот скрипт тоже пригодится.

Дополнение: Также вас могут заинтересовать скрипты для загрузки видео с RuTube и Vimeo.com , а также для скачивания mp3 из ВКонтакта .

admin

Share
Published by
admin
Tags: Perl

Recent Posts

Что такое Zulip

Zulip — программное обеспечение для реализации корпоративного чата. Разработан в 2012 году, в 2014 был…

1 неделя ago

Что такое Zookeeper

Zookeeper — cервис-координатор, который позволяет обеспечить контроль синхронизации данных. Разработан на Java компанией Apache Software…

1 неделя ago

Что такое Zimbra

Zimbra — программное обеспечение для реализации почтового сервиса или, если сказать точнее, автоматизации совместной деятельности…

1 неделя ago

Что такое Zabbix

Zabbix — бесплатная система мониторинга. Позволяет отслеживать состояние сетевых узлов, компьютеров и серверов. Возможности: Поддержка…

1 неделя ago

Что такое YouTube

YouTube — компания-владелец одноименного портала для просмотра и хранения видео. Чтобы пользоваться данным порталом достаточно…

1 неделя ago

Что такое yota

Yota — провайдер, предоставляющий доступ к сети Интернет по беспроводной связи. Впервые, сервис начал работать…

1 неделя ago