tv_grab_bg
От: tv_grab_bg
На: 18-10-2009@8:29 GMT+2
Оценка: 1/Неутрален#!/usr/bin/perl -w
=pod
# Инсталирате xmltv и слагате този скрипт при остаnaлите скритове от xmltv пакета.
=cut
use strict;
use utf8;
use Encode;
use XMLTV::Configure::Writer;
use XMLTV::Options qw/ParseOptions/;
use LWP::Simple qw/$ua get/;
$ua->agent("xmltv/$XMLTV::VERSION");
my @channels_ignore = (190,84,177,168,94,147,87,121,111,169);
my @channels_ok = (93,99,116);
my %tv_attributes = (
'source-info-name' => 'Dnevnik',
'source-info-url' => 'http://www.dnevnik.bg',
'source-data-url' => 'http://www.dnevnik.bg/tv/',
'generator-info-name' => 'tv_grab_bg',
#'generator-info-url' => 'http://...',
);
my ($opt, $conf) = ParseOptions ({
grabber_name => 'tv_grab_bg',
capabilities => [qw/baseline manualconfig apiconfig/],
version => '$Id: tv_grab_bg,v 0.1 2009/04/16 $',
description => 'Bulgaria (from www.dnevnik.bg/tv)',
stage_sub => \&config_stage,
listchannels_sub => \&list_channels,
defaults => { days => 7, offset => 0, quiet => 0, debug => 0, },
});
# At this point, grabbing routines take over from ParseOptions
die "Error: You cannot specify --quiet with --debug, exiting"
if ($opt->{quiet} && $opt->{debug});
if (not defined( $conf->{'channel'} )) {
print STDERR "No channels selected in configfile " .
$opt->{'config-file'} . "\n" .
"Please run the grabber with --configure.\n";
exit 1;
}
###############################################
############### GRAB THE DATA #################
###############################################
# Configure output and write XMLTV data - header, channels, listings, and footer
my $writer;
my @channels = ();
setup_xmltv_writer();
write_xmltv_header();
write_xmltv_channels($writer);
write_xmltv_programs();
write_xmltv_footer();
###############################################
################ SUBROUTINES ##################
###############################################
sub config_stage
{
my ( $stage, $conf ) = @_;
my $result;
my $writer = new XMLTV::Configure::Writer( OUTPUT => \$result,
encoding => 'utf-8' );
$writer->start( { grabber => 'tv_grab_bg' } );
# The select-channels stage must be the last stage called
$writer->end( 'select-channels' );
return $result;
}
sub list_channels
{
my $result;
my $writer = new XMLTV::Writer(OUTPUT => \$result, encoding => 'utf-8');
$writer->start(\%tv_attributes);
write_xmltv_channels($writer);
$writer->end();
return $result;
}
# Determine options for, and create XMLTV::Writer object
sub setup_xmltv_writer
{
# output options
my %g_args = ();
if (defined $opt->{output})
{
my $fh = new IO::File ">$opt->{output}";
die "Error: Cannot write to '$opt->{output}', exiting" if (!$fh);
%g_args = (OUTPUT => $fh);
}
$writer = new XMLTV::Writer(%g_args, encoding => 'utf-8');
}
sub write_xmltv_header
{
$writer->start(\%tv_attributes);
}
sub write_xmltv_footer
{
$writer->end;
}
sub write_xmltv_channels
{
$writer = $_[0];
my $url = "http://www.dnevnik.bg/tv/index.php"...
my $page = get $url;
die "Couldn't get $url" unless defined $page;
$page = encode('utf-8', $page);
# while ($page =~ m/<input type="checkbox" name="channels\[\]" value="[0-9]+" [a-z]*\s?id="prgs">[^<]*/g)
while ($page =~ m/<input type="checkbox" id="channels[0-9]+" name="channels\[\]" value="[0-9]+" [a-z]*\s?id="prgs">[^<]*/g)
{
my $channel_data = $&;
# remove: id="channels\[0-9\]+"
$channel_data =~ m/[0-9]+/;
# extract channel ID
$channel_data =~ m/[0-9]+/;
my $channel_id = $&;
# extract channel name
$channel_data =~ m/[>]+[^<]*/;
$& =~ m/[^>]+/;
my $channel_name = $&;
my $ignore = 0;
my $ignored;
foreach $ignored(@channels_ignore)
{
if ($ignored == $channel_id)
{
$ignore = 1;
last;
}
}
# $ignore = 1;
# my $ch_ok;
# foreach $ch_ok(@channels_ok)
# {
# if ($ch_ok == $channel_id)
# {
# $ignore = 0;
# last;
# }
# }
if ($ignore == 0)
{
$writer->write_channel({id => $channel_id . ".dnevnik.bg",
'display-name' => [[ $channel_name ,"bg" ]]});
push(@channels, $channel_id);
}
}
}
sub write_xmltv_program
{
my $seconds = $_[0];
my $url_channel = $_[1];
my $after_midnight = $_[2];
my ($sec_,$min_,$hour_,$day,$month,$yr19,@rest) = localtime($seconds);
++$month;
my $date_day = sprintf("%02d",$day);
my $date_month = sprintf("%02d",$month);
my $date_year = ($yr19+1900);
my $url = "http://www.dnevnik.bg/tv/?den=" . $date_day . "/" . $date_month . "/" . $date_year . "&channels[]=" . $url_channel . "&sthour=&enhour=&tAction=submit";
my $page = get $url;
die "Couldn't get $url" unless defined $page;
$page = encode('utf-8', $page);
my $last_hour = 0;
my @xml_start_date;
my @xml_channel;
my @xml_title;
my $xml_end_date="";
while ($page =~ m/<li><span (class="tvlistnow")?><em>[0-9:]+<\/em><\/span><h3>[^<]*/g)
{
my $prog_data = $&;
$prog_data =~ m/[0-9]+/;
my $hour = $&;
$prog_data =~ m/:[0-9]+/;
$& =~ m/[^:]+/;
my $minutes = $&;
$prog_data =~ m/<h3>[^<]*/;
$& =~ m/>[^<]*/;
$& =~ m/[^>]+/;
my $title = $&;
if ($last_hour > ($hour+0))
{
#icrement day
$seconds = $seconds + 86400;
my ($sec_,$min_,$hour_,$day,$month,$yr19,@rest) = localtime($seconds);
++$month;
$date_day = sprintf("%02d",$day);
$date_month = sprintf("%02d",$month);
$date_year = ($yr19+1900);
if ($after_midnight == 0)
{
$xml_end_date = $date_year . $date_month . $date_day . $hour . $minutes . " +0200";
last;
}
$after_midnight = 0;
}
else
{
if ($after_midnight == 1)
{
$last_hour = $hour+0;
next;
}
}
$last_hour = $hour+0;
push(@xml_start_date, $date_year . $date_month . $date_day . $hour . $minutes . " +0200");
push(@xml_channel, $url_channel . ".dnevnik.bg");
push(@xml_title, $title);
}
my $count = @xml_start_date;
my $i = 0;
for ($i = 0; $i < $count; $i++)
{
if (($i == ($count - 1)) && ($xml_end_date ne ""))
{
$writer->write_programme({ start => $xml_start_date[$i],
stop => $xml_end_date,
channel => $xml_channel[$i],
title => [[$xml_title[$i], 'bg']] });
}
else
{
$writer->write_programme({ start => $xml_start_date[$i],
channel => $xml_channel[$i],
title => [[$xml_title[$i], 'bg']] });
}
}
}
sub write_xmltv_programs
{
my $mytime = time;
my $days = 7;
my $offset = 0;
my $i = 0;
if (defined $opt->{offset})
{
$offset = $opt->{offset};
}
if (defined $opt->{days})
{
$days = $opt->{days};
}
$days = $days + $offset;
for ($i = $offset; $i < $days; $i++)
{
if (($i < 0) || ($i > 10))
{
last;
}
my $channel;
foreach $channel(@channels)
{
write_xmltv_program(($mytime + ($i - 1)*86400), $channel, 1);
write_xmltv_program(($mytime + $i*86400), $channel, 0);
}
}
}
[Отговори на този коментар]
Към: tv_grab_bg
От: jackie <jackie __@__ starazagora__dot__net>
На: 23-10-2009@10:28 GMT+2
Оценка: 1/Неутраленneshto nyakade may burkam "sorry za
latinicata"
root@jackie:/stuff/build/xmltv#
tv_find_grabbers
/usr/bin/tv_grab_ar|Argentina
/usr/bin/tv_grab_ch_search|Switzerland
(tv.search.ch)
/usr/bin/tv_grab_combiner|Combine data from
several other grabbers
/usr/bin/tv_grab_dk_dr|Denmark
/usr/bin/tv_grab_dtv_la|Latin America Direct
TV listings
/usr/bin/tv_grab_ee|Estonia (www.kava.ee)
/usr/bin/tv_grab_es_laguiatv|Spain
(laguiatv.com)
/usr/bin/tv_grab_es_miguiatv|Spain
(miguiatv.com)
/usr/bin/tv_grab_fi|Finland
/usr/bin/tv_grab_fr|France
/usr/bin/tv_grab_hr|Croatia
/usr/bin/tv_grab_huro|Hungary/Romania
/usr/bin/tv_grab_it|Italy
/usr/bin/tv_grab_na_dd|North America (Data
Direct)
/usr/bin/tv_grab_na_dtv|North America using
www.directv.com
/usr/bin/tv_grab_nl|Holland
/usr/bin/tv_grab_no_gfeed|Norway (beta)
/usr/bin/tv_grab_pt|Portugal
/usr/bin/tv_grab_re|Reunion Island
/usr/bin/tv_grab_se_swedb|Sweden
(tv.swedb.se)
/usr/bin/tv_grab_uk_bleb|United Kingdom
(bleb.org)
/usr/bin/tv_grab_uk_rt|United
Kingdom/Republic of Ireland (Radio Times)
/usr/bin/tv_grab_za|South Africa
root@jackie:/stuff/build/xmltv# ls
/usr/bin/tv_grab_*
/usr/bin/tv_grab_ar*
/usr/bin/tv_grab_dtv_la*
/usr/bin/tv_grab_fr*
/usr/bin/tv_grab_na_dtv*
/usr/bin/tv_grab_re*
/usr/bin/tv_grab_bg*
/usr/bin/tv_grab_ee*
/usr/bin/tv_grab_hr*
/usr/bin/tv_grab_na_icons*
/usr/bin/tv_grab_se_swedb*
/usr/bin/tv_grab_ch_search*
/usr/bin/tv_grab_es_laguiatv*
/usr/bin/tv_grab_huro*
/usr/bin/tv_grab_nl*
/usr/bin/tv_grab_uk_bleb*
/usr/bin/tv_grab_combiner*
/usr/bin/tv_grab_es_miguiatv*
/usr/bin/tv_grab_it*
/usr/bin/tv_grab_no_gfeed*
/usr/bin/tv_grab_uk_rt*
/usr/bin/tv_grab_dk_dr*
/usr/bin/tv_grab_fi*
/usr/bin/tv_grab_na_dd*
/usr/bin/tv_grab_pt*
/usr/bin/tv_grab_za*
neshto ne mi namira tv_grab_bg e v /usr/bin
[Отговори на този коментар]
Към: tv_grab_bg
От: plamenip
На: 10-06-2010@17:28 GMT+2
Оценка: 1/Неутраленmy $url = "http://www.dnevnik.bg/tv/index.php"...
Тук се е получила малка грешчица.
Редактирах го така :
my $url = "http://www.dnevnik.bg/tv/index.php"...
и тъгна без проблем.
[Отговори на този коментар]
Към: Към: tv_grab_bg
От: nikolay
На: 23-10-2009@13:39 GMT+2
Оценка: 1/НеутраленВиж дали има права за изпълнение
или направо му дай
chmod 755 /usr/bin/tv_grab_bg
[Отговори на този коментар]
Към: Към: Към: tv_grab_bg
От: jackie <jackie__at__starazagora __точка__ net>
На: 23-10-2009@16:27 GMT+2
Оценка: 1/Неутраленprava si ima tova mi dava
root@jackie:~# tv_grab_bg
Unquoted string "pod" may clash with future
reserved word at /usr/bin/tv_grab_bg line 7.
Unquoted string "cut" may clash with future
reserved word at /usr/bin/tv_grab_bg line 9.
syntax error at /usr/bin/tv_grab_bg line 3,
near "="
"use" not allowed in expression at
/usr/bin/tv_grab_bg line 9, at end of line
BEGIN not safe after errors--compilation
aborted at /usr/bin/tv_grab_bg line 10.
ako iskash svarji na skype -> jackie_stz
Редактиран на: 23-10-2009@16:30
[Отговори на този коментар]
Към: Към: Към: Към: tv_grab_bg
От: nikolay
На: 24-10-2009@9:37 GMT+2
Оценка: 1/НеутраленРазкарай това от файла:
=pod
# Инсталирате xmltv и слагате този скрипт при остаnaлите скритове от xmltv пакета.
=cut
[Отговори на този коментар]
?
От: Stelko
На: 27-10-2009@10:44 GMT+2
Оценка: 1/НеутраленКъде изчезнаха 5-6те коментара които имаше статията :(
[Отговори на този коментар]
epgss
От: Peter
На: 1-05-2010@12:33 GMT+2
Оценка: 1/НеутраленБе нещо това програмче спря да работи:
peter@cfbk:~/Свалени/epgss> ./epgss.sh dirbg.xml
Starting media.dir.bg grabber...
1 of 13: Retrieving uncategorized list of all programs
>> Done: Content grabbed (schedule for next 7 days).
>> Done: Content HTML parsed.
Exception in thread "main" org.mozilla.javascript.EcmaError: TypeError: Cannot read property "tbody" from undefined (grab_media.dir.bg.js#95)
at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3566)
at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3544)
at org.mozilla.javascript.ScriptRuntime.typeError(ScriptRuntime.java:3572)
at org.mozilla.javascript.ScriptRuntime.typeError2(ScriptRuntime.java:3591)
at org.mozilla.javascript.ScriptRuntime.undefReadError(ScriptRuntime.java:3604)
at org.mozilla.javascript.ScriptRuntime.getObjectProp(ScriptRuntime.java:1382)
at org.mozilla.javascript.gen.c2._c4(grab_media.dir.bg.js:95)
at org.mozilla.javascript.gen.c2.call(grab_media.dir.bg.js)
at org.mozilla.javascript.optimizer.OptRuntime.callName(OptRuntime.java:97)
at org.mozilla.javascript.gen.c2._c1(grab_media.dir.bg.js:45)
at org.mozilla.javascript.gen.c2.call(grab_media.dir.bg.js)
at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:401)
at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3003)
at org.mozilla.javascript.gen.c2.call(grab_media.dir.bg.js)
at com.googlecode.epgss.JSScript.call(JSScript.java:50)
at com.googlecode.epgss.EPGSS.work(EPGSS.java:47)
at com.googlecode.epgss.EPGSS.run(EPGSS.java:43)
at com.googlecode.epgss.EPGSS.main(EPGSS.java:21)
А автора май го е зарязал този проект. Някой дали може да го оправи
[Отговори на този коментар]
Към: epgss
От: batvanyo
На: 15-06-2010@11:49 GMT+2
Оценка: 1/НеутраленПо-добре късно отколкото никога. ;-)
Би трябвало проблемът да е окърпен. Има нова версия на програмчето на сайта - ако някой все още се интересува.
BTW:
Кода дето парсва media.dir.bg (намира се във файлчето наречено grab_media.dir.bg.js) нарочно е написан на JavaScript - за да може да се кърпи от всеки без да е необходима Java или нещо такова. Не, че очаквам хорди от желаещи да си губят времето, но човек никога не знае :-)
[Отговори на този коментар]
Към: Към: epgss
От: Peter
На: 20-06-2010@19:38 GMT+2
Оценка: 1/НеутраленБе то хубаво, ама грам не вдявам от скриптиране, а още по-малко от JavaScript. Иначе програмчето е много полезно. Аз например го ползвам за да си направя EPG за Булсатком което да набутам в приемника. Е, налага се малко да преправям получения файл, но успях да си сглобя скриптче което да го прави.
Благодарско
[Отговори на този коментар]
Към: epgss
От: While
На: 8-02-2012@17:38 GMT+2
Оценка: 1/НеутраленТози tv_grab_bg ползващ dnevnik.bg не е съвсем наред. Файловете които генерира не могат да се използват навсякъде. Ако някой има идея, как да се импортира резултата от него в TV Guide за XBMC, нека сподели! Освен това генерираното EPG поне при мен е за всички телевизии, а не само за тези които избрах при конфигурирането. Между другото, можете да погледнете http://www.xmltvepg.be/rytecxmltvbulsat... - готов XMLTV файл, разархивирате и ползвате. И с него има проблем обаче, настроен е за GMT+1 и времената в него са с 1 час назад от българските. Ако ви хрумне как да се оправи това в готовия файл ще бъде чудесно. Горе долу и аз съм го измислил, ама не съвсем...
1.Търсят се в файла стрингове с дължина от 12 знака, състоящи се само от цифри
2.Към всяко попадение, се прибавя числото 000000000100 (алгребрично събиране като число, не конкатенизация на низове)
Това е всичко, обаче трудното е да се направи. Някой желаещ да удари едно рамо?
[Отговори на този коментар]
Към: Към: epgss
От: Нинжа
На: 11-10-2012@16:41 GMT+2
Оценка: 1/Неутраленtv_grab_bg си е наред, просто трябва автора да
добави генериране на stop време за да може да
се използва на всякъде. В момента всичко
свалено от dnevnik.bg просто му липсва stop
времето за съдържанието по канали.
[Отговори на този коментар]
не работи
От: tod <user (a) host< dot >com>
На: 10-06-2013@12:46 GMT+2
Оценка: 2/Въпрос
Нещо му стана на този скрипт , от днес не иска да работи. Някой да има идеи ?
[Отговори на този коментар]
Към: не работи
От: while <while32< at >mail[ точка ]ru>
На: 18-08-2013@23:04 GMT+2
Оценка: 2/Информиращ
Предлагам ти два алтернативни варианта:
1. Използваш готовия EPG за Enigma приемниците;
2. Генерираш си по познатия начин, чрез програмката WebGrab+Plus.
По отношение на вариант 1, ето примерен алгоритъм:
#!/bin/bash
wget -r --tries=2 http://world-of-satellite.com/epg_data/...
gunzip -f world-of-satellite.com/rytecxmltvbulsat.gz
recode ISO-8859-5..UTF-8 ~/.xmltv/world-of-satellite.com/rytecxmltvbulsat
export head="<?xml version="1.0" encoding="UTF-8" ?>"
sed "1c$head" -i ~/.xmltv/world-of-satellite.com/rytecxmltvbulsat
mv ~/.xmltv/world-of-satellite.com/rytecxmltvbulsat ~/.xmltv/world-of-satellite.com/EPG.xml
Полезни връзки:
http://manpages.ubuntu.com/manpages/luc...
http://webgrabplus.com/epg-channels#s36
[Отговори на този коментар]