piątek, 12 lutego 2010

Ładowanie filmów na YouTube off-line

Trudno jest znaleźć gotowe i działające rozwiązanie pn. jak wysłać (upload) film na YT, nie używając formularza i przeglądarki. Teoretycznie jest API; jest tam nawet to opisane, ale jakoś tak na tyle pokrętnie, że nie mogę się połapać na szybko jak to zaimplementować. Szukałem po linii Pythona, por. Getting comments from youtube via... oraz python uploading scripts for youtube. Nic z tego nie wyszło...

Działa za to skrypt opisany na stronie How to Upload YouTube Videos Programmatically. Nie korzysta on wprawdzie z API--udaje przeglądarkę i analizuje kod HTML metodą data scrapping. Data scrapping ma ten minus, że w każdej chwili może przestać działać ale może nie będzie aż tak źle. Takie sztuczki sam kiedyś stosowałem, zresztą (por. Czy flickr umie liczyć -- rozwiązanie).

Przechodząc do konkretów. Uruchomienie skryptu ytup.pl wygląda następująco:


perl ytup.pl -l login -p hasło -c nr_kategorii -d opis - t tytuł_filmu -x słowa-kluczowe -f plik

Ja chcę uruchamiać ytup.pl w nocy, jak wszyscy śpią. W tym celu opis filmu wstawiam do pliku z rozszerzenie .descr, np.:


-t Elka plays accordion
-d Elka's warm-up exercises
-x elka,accordion,weltmaister,rehearsal,music,warm-up
-c 24
-f Zi6_0042.MOV

Jak widać, plik zawiera wszystko co trzeba do uruchomienia skryptu ytup.pl. Teraz inny plik przegląda wybrane katalogi, czyta pliki .descr i uruchamia ytup.pl [pliki Video i pliki .descr muszą być w tym samym katalogu]:


#!/usr/bin/perl
use File::Spec;
use File::Basename;

my $YTlogin = 'login'; ## wstaw login
my $YTpassword = 'hasło'; ## wstaw hasło
my $YTlog_file = "/home/tomek/SD/ytube/logs/YT_Upload.log";
my $PerlProg = "/usr/bin/perl";
my $PerlScript = '/home/tomek/bin/ytup.pl';
my @YT_watch_dirs=('/home/tomek/SD/ytube/upload', '/public/sheeva/winstuff/YTube');

open LOG, ">>$YTlog_file";

for my $dir (@YT_watch_dirs) {
# Read directory and collect description files.
opendir(DIR, $dir) or die "*** Can't open directory $dir: $!.";

print STDERR "*** Processing directory: $dir\n";

my $count = 0;
while (defined(my $file = readdir(DIR))) {
if ($file =~ /^\./) { next ; } # pomin plik z kropka na poczatku
if ($file =~ /\.descr$/) {
$file = File::Spec->rel2abs(File::Spec->join($dir,$file));
print STDERR "*** Description file: $file\n";
Upload_video($file);
rename($file, "${file}_") || print LOG "Problem ze zmiana $file => ${file}_\n";
$count++;
}
}
closedir(DIR);
print STDERR " $count .dscr file" . ($count!=1?'s':'') . ".\n";
}

close(LOG);

### ### ###

sub Upload_video {
# Przeczytaj plik z opisem, wyslij plik video za pomoca system(...)
my $file_name = shift ;
my $key, $val;

my @Options = ();

open (DESCRIPTION, $file_name);

while (<DESCRIPTION>) {
# plik zawiera w kazdym wierszu: opcja spacja wartosc-opcji
$_ =~ /([-\w]+)\s+(\S.*)/;
$key = $1; $val = $2; # na wszelki wypadek
if ($key =~ /-f/) { $val = dirname($file_name) . "/$val" ;
}
push (@Options, ("$key", "$val")); }
my @UploadScript = ($PerlProg, $PerlScript, '-l', $YTlogin, '-p', $YTpassword, @Options);
print STDERR "*** Executing: @UploadScript\n";

system ( @UploadScript ) == 0 || print LOG "Problem z zaladowaniem pliku $file_name\n" ;
}

Powyższy plik jest uruchamiany -- w stosownym momencie -- przez crona, a przesłany film jest tutaj.

Brak komentarzy:

Prześlij komentarz