diff options
Diffstat (limited to 'perl-install/standalone/drakdvb')
| -rwxr-xr-x | perl-install/standalone/drakdvb | 168 | 
1 files changed, 168 insertions, 0 deletions
diff --git a/perl-install/standalone/drakdvb b/perl-install/standalone/drakdvb new file mode 100755 index 000000000..2ced12974 --- /dev/null +++ b/perl-install/standalone/drakdvb @@ -0,0 +1,168 @@ +#!/usr/bin/perl +# +# Copyright (C) 2009 Mandriva +#                    Pascal Terjan <pterjan> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +use lib qw(/usr/lib/libDrakX); + +use MDK::Common; +use common; +use standalone; +use mygtk3; +use interactive; +use ugtk3 qw(:create :helpers :wrappers); +use Gtk3::SimpleList; + +my $title = N("DVB"); +$ugtk3::wm_icon = "/usr/share/mcc/themes/default/tv-mdk.png"; +my $w = ugtk3->new($title); +$w->{window}->signal_connect('destroy' => \&exitapp); +mygtk3::register_main_window($w->{real_window}); +my $in = 'interactive'->vnew; + +my $config_file = "$ENV{HOME}/.mplayer/channels.conf"; + +my $channel_list = Gtk3::SimpleList->new(N("Channel") => "text", "id" => "hidden"); +my %buttons; +my $pid; +my $wait; + +sub get_selected_channel() { +    my ($index) = $channel_list->get_selected_indices; +    defined $index && $channel_list->{data}[$index][1]; +} + +sub exitapp() { +    local $SIG{TERM} = 'IGNORE'; +    kill TERM => -$$; +    Gtk3->main_quit; +} + +sub detect_channels() { +    if (-s $config_file) { +        $in->ask_okcancel(N("Warning"), N("%s already exists and its contents will be lost", $config_file)) or return; +    } +    gtkset_mousecursor_wait($w->{window}->get_window); +    $channel_list->set_sensitive(0); +    $_->set_sensitive(0) foreach values %buttons; + +    $in->do_pkgs->install('w_scan'); + +    gtkflush(); + +    $SIG{CHLD} = sub { +        $SIG{CHLD} = 'IGNORE'; +        $wait->{window}->hide; +        waitpid($pid, 0); +        if (($? >> 8) == 0) { +            load_channels(); +        } else { +            $in->ask_warn(N("Error"), N("Could not get the list of available channels")); +        } +        gtkset_mousecursor_normal($w->{window}->get_window); +        $buttons{detect}->set_sensitive(1); +        $channel_list->set_sensitive(1); +    }; +    $wait = ugtk3->new(N("Please wait"), grab => 1); +    $wait->{window}->signal_connect('destroy' => \&exitapp); +    if ($pid = fork()) { +        gtkadd($wait->{window}, +               gtkpack($wait->create_box_with_title(N("Detecting DVB channels, this will take a few minutes")), +                       gtknew('Button', text => N("Cancel"), clicked => \&exitapp), +               ) +            ); +        $wait->main; +    } else { +        $SIG{CHLD} = 'DEFAULT'; +        mkdir_p(dirname($config_file)); +        my $ret = system("w_scan -X > $config_file"); +        sleep(1); +        POSIX::_exit($ret >> 8); +    } +} + +sub load_channels() { +    my @channels; +    open(my $CHANNELCONF, "<$config_file"); +    local $_; +    while (<$CHANNELCONF>) { +        my $line = $_; +        if ($line =~ /^([^:]*?)(\([^(:]*\))?:/) { +            push @channels, [ $1, $1 . $2 ]; +        } +    } +    close($CHANNELCONF); +    @{$channel_list->{data}} = sort { $a->[0] cmp $b->[0] } @channels; +    if (defined @{$channel_list->{data}}[0]) { +        $channel_list->select(0); +    } +} + +sub get_channel_info { +    my ($channel) = @_; +    foreach (cat_($config_file)) { +        chomp; +        my %channel_info; +        @channel_info{qw(name frequency options vpid apid serviceid)} = /^([^:]+):([^:]+):(.*):([^:]+):([^:]+):([^:]+)+$/; +        next if $channel_info{name} ne $channel; +        ($channel_info{bandwidth}) = $channel_info{options} =~ /\bBANDWIDTH_(\d+)_MHZ\b/; +        return \%channel_info; +    } +    undef; +} + +sub launch_tv() { +    my $channel = get_selected_channel() or return; +    if (whereis_binary("vlc")) { +        my $info = get_channel_info($channel) or return; +        my %vlc_config = read_gnomekderc("$ENV{HOME}/.config/vlc/vlcrc", "main"); +        if ($vlc_config{'one-instance'}) { +            # changing dvb options does not work with --one-instance, kill running vlc +            system("killall vlc"); +        } +        system("vlc dvb:// --dvb-frequency=$info->{frequency} --dvb-adapter=0 --dvb-bandwidth=$info->{bandwidth} --program=$info->{serviceid} &"); +    } else { +        system('mplayer "dvb://' . $channel . '"&'); +    } +} + +gtkadd($w->{window}, +       gtknew('VBox', spacing => 5, children => [ +                  $::isEmbedded ? () : (0, Gtk3::Banner->new($ugtk3::wm_icon, $title)), +                  1, gtknew('ScrolledWindow', width => 300, height => 400, child => $channel_list), +                  0, gtknew('HButtonBox', layout => 'end', children_loose => [ +                                $buttons{detect} = gtknew('Button', text => N("Detect Channels"), clicked => \&detect_channels), +                                gtknew('Button', text => N("Quit"), clicked => \&exitapp), +                                $buttons{view} = gtknew('Button', text => N("View Channel"), clicked => \&launch_tv), +                            ]), +              ]), +    ); + +$buttons{view}->set_sensitive(0); + +$channel_list->get_selection->signal_connect('changed' => sub { +    my ($index) = $channel_list->get_selected_indices; +    $buttons{view}->set_sensitive(defined $index); +}); + +$channel_list->signal_connect('row-activated' => sub { +    launch_tv(); +}); + +load_channels(); + +$w->main;  | 
