SVN: toys/rsget.pl/RSGet: ListAdder.pm ListManager.pm
sparky
sparky at pld-linux.org
Fri Oct 9 23:27:18 CEST 2009
Author: sparky
Date: Fri Oct 9 23:27:18 2009
New Revision: 10746
Added:
toys/rsget.pl/RSGet/ListAdder.pm
Modified:
toys/rsget.pl/RSGet/ListManager.pm
Log:
- add_list* subs moved to ListAdder and rewritten in object-oriented code
Added: toys/rsget.pl/RSGet/ListAdder.pm
==============================================================================
--- (empty file)
+++ toys/rsget.pl/RSGet/ListAdder.pm Fri Oct 9 23:27:18 2009
@@ -0,0 +1,328 @@
+package RSGet::ListAdder;
+
+use strict;
+use warnings;
+use RSGet::Tools;
+use RSGet::ListManager;
+use RSGet::Dispatch;
+set_rev qq$Id: ListManager.pm 10719 2009-10-07 21:24:52Z sparky $;
+
+sub new
+{
+ my $class = shift;
+ my $self = {};
+ $self->{comment} = [];
+ $self->{lines} = [];
+ $self->{ids} = {};
+
+ bless $self, $class;
+ return $self;
+}
+
+sub add_links
+{
+ my $self = shift;
+ my $text = shift;
+
+ my $lines = $self->{lines};
+
+ my %list_uris;
+ foreach my $mcd ( @$act_clist ) {
+ foreach my $ucd ( @$mcd ) {
+ my $uri = $ucd->[0];
+ $list_uris{ $uri } = 1;
+ }
+ }
+
+ my %all_uris;
+ foreach my $line ( @$lines ) {
+ next unless ref $line;
+ my $uris = $line->{uris};
+ foreach my $uri ( keys %$uris ) {
+ if ( $all_uris{ $uri } ) {
+ warn "$uri repeated!";
+ delete $uris->{ $uri };
+ } else {
+ $all_uris{ $uri } = 1;
+ }
+ }
+ }
+
+ my $u = qr/[a-z0-9_-]+/;
+ my $tld = qr/[a-z]{2,8}/;
+ foreach ( split /\s+/s, $text ) {
+ next unless m{^(.*?)(https?://)?((?:$u\.)*$u\.$tld/.+)$};
+ my $pre = $1;
+ my $proto = $2 || "http://";
+ my $uri = $proto . $3;
+ if ( $pre ) {
+ if ( $pre =~ /%([0-9A-F]{2})$/ ) {
+ my $l = chr hex $1;
+ $l =~ tr/[](){}<>/][)(}{></;
+ $l = sprintf "%.2X", ord $l;
+ $uri =~ s/%$l.*//i;
+ } elsif ( $pre =~ m{.*([^a-zA-Z0-9_/])$} ) {
+ my $l = $1;
+ $l =~ tr/[](){}<>/][)(}{></;
+ $uri =~ s/\Q$l\E.*//;
+ }
+ }
+
+ (my $getter, $uri) = RSGet::Dispatch::unigetter( $uri );
+ next unless $getter;
+ next if exists $all_uris{ $uri };
+ $all_uris{ $uri } = 1;
+ my $options = {};
+ $options->{error} = "Already on the list" if $list_uris{ $uri };
+ my $line = { cmd => "ADD", globals => {}, uris => { $uri => [ $getter, $options ] } };
+ push @$lines, $line;
+ }
+
+ return $self;
+}
+
+sub add_comment
+{
+ my $self = shift;
+ my $text = shift;
+
+ my $c = $self->{comment};
+
+ foreach ( split /[\r\n]+/s, $text ) {
+ s/^\s*#\s*//;
+ push @$c, "# " . $_;
+ }
+
+ return $self;
+}
+
+sub list_update
+{
+ my $self = shift;
+
+ my $lines = $self->{lines};
+ $self->{select_clone} = 1;
+ my @used_save;
+ for ( my $i = 0; $i < scalar @$lines; $i++ ) {
+ my $line = $lines->[$i];
+ next unless ref $line;
+ my $globals = $line->{globals};
+ my $uris = $line->{uris};
+ unless ( keys %$uris ) {
+ my $l = splice @$lines, $i, 1;
+ redo;
+ }
+
+ foreach my $uri ( keys %$uris ) {
+ my ( $getter, $options ) = @{ $uris->{ $uri } };
+
+ if ( my $save = $RSGet::FileList::save{ $uri } ) {
+ push @used_save, $uri;
+ $self->{select_clone} = 0;
+
+ $line->{cmd} = $save->{cmd} if $save->{cmd};
+ hadd $globals, %{$save->{globals}} if $save->{globals};
+ hadd $options, %{$save->{options}} if $save->{options};
+
+ if ( my $links = $save->{links} ) {
+ my @new;
+ foreach my $luri ( @$links ) {
+ my ($getter, $uri) = RSGet::Dispatch::unigetter( $luri );
+ if ( $getter ) {
+ push @new, { cmd => "ADD", globals => {}, uris => { $uri => [ $getter, {} ] } };
+ } else {
+ push @new, "# unsupported uri: $uri";
+ }
+ }
+ splice @$lines, $i+1, 0, @new;
+ }
+ if ( my $clones = $save->{clones} ) {
+ hadd $uris, %$clones;
+ # will check new ones next time
+ }
+ if ( $save->{delete} ) {
+ delete $uris->{ $uri };
+ next;
+ }
+ }
+
+ my $chk = RSGet::Dispatch::check( $uri, $getter, $options );
+ $self->{select_clone} = 0 unless $chk;
+ }
+ }
+
+ foreach my $uri ( @used_save ) {
+ delete $RSGet::FileList::save{ $uri };
+ }
+
+ return $self;
+}
+
+sub find_clones
+{
+ my $self = shift;
+
+ $self->{select_clone} = 1;
+ my $lines = $self->{lines};
+ my $own_clist = [ @$act_clist ];
+ my $active = 0;
+
+ my $clone_select;
+
+ foreach my $line ( @$lines ) {
+ next unless ref $line;
+ my ( $cmd, $globals, $uris ) = @$line{ qw(cmd globals uris) };
+
+ foreach my $uri ( keys %$uris ) {
+ my ( $getter, $options ) = @{ $uris->{ $uri } };
+
+ my @cd = RSGet::ListManager::clone_data( { %$options, %$globals } );
+ unless ( @cd ) {
+ $line->{cmd} = "STOP" if $options->{error};
+ next;
+ }
+
+ if ( $line->{cmd} ne "ADD" ) {
+ $active++;
+ push @$own_clist, [ [ $uri, @cd ] ];
+ next;
+ }
+
+ my @clones = RSGet::ListManager::find_clones( $own_clist, \@cd );
+ if ( @clones ) {
+ $clone_select = [ $uri, $options, \@clones ];
+ } else {
+ $line->{cmd} = "GET";
+ push @$own_clist, [ [ $uri, @cd ] ];
+ }
+ }
+ last if $clone_select;
+ }
+ $self->{active} = $active;
+
+ return $clone_select;
+}
+
+sub find_uri
+{
+ my $self = shift;
+ my $furi = shift;
+
+ my $lines = $self->{lines};
+ foreach my $line ( @$lines ) {
+ next unless ref $line;
+ my ( $cmd, $globals, $uris ) = @$line{ qw(cmd globals uris) };
+
+ foreach my $uri ( keys %$uris ) {
+ if ( $uri eq $furi ) {
+ return $line;
+ }
+ }
+ }
+ return;
+}
+
+sub finish
+{
+ my $self = shift;
+
+ my @new;
+ my $comment = $self->{comment};
+ foreach my $line ( @$comment ) {
+ push @new, $line . "\n";
+ }
+
+ my $added = 0;
+ my $lines = $self->{lines};
+ foreach my $line ( @$lines ) {
+ next unless ref $line;
+ my ( $cmd, $globals, $uris ) = @$line{ qw(cmd globals uris) };
+
+ foreach my $uri ( sort keys %$uris ) {
+ my $o = $uris->{ $uri }->[1];
+ delete $uris->{ $uri } unless $o->{size} or $o->{asize} or $o->{quality};
+ }
+
+ next unless keys %$uris;
+
+ $added++;
+ {
+ my @out = ( "$cmd:", RSGet::FileList::h2a( $globals ) );
+ push @new, (join " ", @out) . "\n";
+ }
+ foreach my $uri ( sort keys %$uris ) {
+ my @out = ( $uri, RSGet::FileList::h2a( $uris->{ $uri }->[1] ) );
+ push @new, (join " ", '+', @out) . "\n";
+ }
+ }
+ push @RSGet::FileList::added, @new;
+ RSGet::FileList::update();
+
+ $self->{msg} = $added == 1 ? "One link added" : "$added links added";
+}
+
+sub command
+{
+ my $self = shift;
+ my $exec = shift;
+
+ unless ( $exec =~ s/^(.*?):(.*?)_// ) {
+ warn "Invalid command: $exec\n";
+ return;
+ }
+ my $cmd = $1;
+ my $grp = $2;
+
+ my $list_ids = $self->{ids};
+ my $idgrp = $list_ids->{$grp};
+ my $data = $idgrp->{ $exec };
+ unless ( $data ) {
+ warn "Invalid ID: $cmd, $grp, $exec\n";
+ return undef;
+ }
+
+ if ( $grp eq "addclone" ) {
+ my @save;
+ if ( $cmd ne "SELECT" ) {
+ warn "Invalid command: $cmd, $grp, $exec\n";
+ return;
+ }
+ my $newuri = $idgrp->{uri};
+ my $newline = $self->find_uri( $newuri );
+ if ( $data eq "NEW SOURCE" ) {
+ my $line = $self->find_uri( $newuri );
+ $line->{cmd} = "GET";
+ } elsif ( my $line = $self->find_uri( $data ) ) {
+ $line->{uris}->{ $newuri } = $newline->{uris}->{ $newuri };
+ delete $newline->{uris}->{ $newuri };
+ } else {
+ RSGet::FileList::save( $data, clones =>
+ { $newuri => $newline->{uris}->{ $newuri } } );
+ delete $newline->{uris}->{ $newuri };
+ RSGet::FileList::update();
+ }
+ } elsif ( $grp eq "adduri" ) {
+ my $target = $self->find_uri( $data );
+ if ( $cmd eq "CLEAR ERROR" ) {
+ delete $target->{uris}->{ $data }->[1]->{error};
+ } elsif ( $cmd eq "DISABLE" ) {
+ $target->{uris}->{ $data }->[1]->{error} = "disabled";
+ } elsif ( $cmd eq "REMOVE" ) {
+ delete $target->{uris}->{ $data };
+ } else {
+ warn "Invalid command: $cmd, $grp, $exec\n";
+ return;
+ }
+ } elsif ( $grp eq "addlist" ) {
+ if ( $cmd eq "CONFIRM" ) {
+ $self->finish();
+ }
+ } else {
+ warn "Invalid command group: $cmd, $grp, $exec\n";
+ return;
+ }
+}
+
+1;
+
+# vim: ts=4:sw=4:fdm=marker
Modified: toys/rsget.pl/RSGet/ListManager.pm
==============================================================================
--- toys/rsget.pl/RSGet/ListManager.pm (original)
+++ toys/rsget.pl/RSGet/ListManager.pm Fri Oct 9 23:27:18 2009
@@ -109,16 +109,6 @@
# }}}
-sub arr_exists
-{
- my $arr = shift;
- my $scalar = shift;
- foreach my $v ( @$arr ) {
- return 1 if $v eq $scalar;
- }
- return 0;
-}
-
sub clone_data
{
my $o = shift;
@@ -135,8 +125,6 @@
return ( $n, $sn, $s, $sr );
}
-
-
sub add_clone_info
{
my $clist = shift;
@@ -269,341 +257,6 @@
}
}
-
-my %all_lists;
-sub add_list
-{
- my $text = shift;
- my $id = shift;
-
- unless ( $id ) {
- do {
- $id = sprintf "%.6x", int rand ( 1 << 24 );
- } while ( exists $all_lists{$id} );
- }
- my $list = $all_lists{$id} ||= {};
- return unless ref $list;
-
- $list->{comment} ||= [];
- my $lines = $list->{lines} ||= [];
-
- my %list_uris;
- foreach my $mcd ( @$act_clist ) {
- foreach my $ucd ( @$mcd ) {
- my $uri = $ucd->[0];
- $list_uris{ $uri } = 1;
- }
- }
-
- my %all_uris;
- foreach my $line ( @$lines ) {
- next unless ref $line;
- my $uris = $line->{uris};
- foreach my $uri ( keys %$uris ) {
- if ( $all_uris{ $uri } ) {
- warn "$uri repeated!";
- delete $uris->{ $uri };
- } else {
- $all_uris{ $uri } = 1;
- }
- }
- }
-
- my $u = qr/[a-z0-9_-]+/;
- my $tld = qr/[a-z]{2,8}/;
- foreach ( split /\s+/s, $text ) {
- next unless m{^(.*?)(https?://)?((?:$u\.)*$u\.$tld/.+)$};
- my $pre = $1;
- my $proto = $2 || "http://";
- my $uri = $proto . $3;
- if ( $pre ) {
- if ( $pre =~ /%([0-9A-F]{2})$/ ) {
- my $l = chr hex $1;
- $l =~ tr/[](){}<>/][)(}{></;
- $l = sprintf "%.2X", ord $l;
- $uri =~ s/%$l.*//i;
- } elsif ( $pre =~ m{.*([^a-zA-Z0-9_/])$} ) {
- my $l = $1;
- $l =~ tr/[](){}<>/][)(}{></;
- $uri =~ s/\Q$l\E.*//;
- }
- }
-
- (my $getter, $uri) = RSGet::Dispatch::unigetter( $uri );
- next unless $getter;
- next if exists $all_uris{ $uri };
- $all_uris{ $uri } = 1;
- my $options = {};
- $options->{error} = "Already on the list" if $list_uris{ $uri };
- my $line = { cmd => "ADD", globals => {}, uris => { $uri => [ $getter, $options ] } };
- push @$lines, $line;
- }
- $list->{id} = $id;
-
- return $list;
-}
-
-sub add_list_find
-{
- my $id = shift;
-
- my $list = $all_lists{ $id };
- return () unless $list;
-}
-
-sub add_list_comment
-{
- my $text = shift;
- my $id = shift;
-
- my $list = add_list_find( $id ) || return;
- return $list unless ref $list;
-
- my $c = $list->{comment};
-
- foreach ( split /[\r\n]+/s, $text ) {
- s/^\s*#\s*//;
- push @$c, "# " . $_;
- }
-
- return $list;
-}
-
-
-sub add_list_update
-{
- my $id = shift;
-
- my $list = add_list_find( $id ) || return;
- return $list unless ref $list;
-
- my $lines = $list->{lines};
- $list->{select_clone} = 1;
- my @used_save;
- for ( my $i = 0; $i < scalar @$lines; $i++ ) {
- my $line = $lines->[$i];
- next unless ref $line;
- my $globals = $line->{globals};
- my $uris = $line->{uris};
- unless ( keys %$uris ) {
- my $l = splice @$lines, $i, 1;
- redo;
- }
-
- foreach my $uri ( keys %$uris ) {
- my ( $getter, $options ) = @{ $uris->{ $uri } };
-
- if ( my $save = $RSGet::FileList::save{ $uri } ) {
- push @used_save, $uri;
- $list->{select_clone} = 0;
-
- $line->{cmd} = $save->{cmd} if $save->{cmd};
- hadd $globals, %{$save->{globals}} if $save->{globals};
- hadd $options, %{$save->{options}} if $save->{options};
-
- if ( my $links = $save->{links} ) {
- my @new;
- foreach my $luri ( @$links ) {
- my ($getter, $uri) = RSGet::Dispatch::unigetter( $luri );
- if ( $getter ) {
- push @new, { cmd => "ADD", globals => {}, uris => { $uri => [ $getter, {} ] } };
- } else {
- push @new, "# unsupported uri: $uri";
- }
- }
- splice @$lines, $i+1, 0, @new;
- }
- if ( my $clones = $save->{clones} ) {
- hadd $uris, %$clones;
- # will check new ones next time
- }
- if ( $save->{delete} ) {
- delete $uris->{ $uri };
- next;
- }
- }
-
- my $chk = RSGet::Dispatch::check( $uri, $getter, $options );
- $list->{select_clone} = 0 unless $chk;
- }
- }
-
- foreach my $uri ( @used_save ) {
- delete $RSGet::FileList::save{ $uri };
- }
-
- return $list;
-}
-
-sub add_list_clones
-{
- my $id = shift;
-
- my $list = add_list_find( $id ) || return;
- return $list unless ref $list;
-
- $list->{select_clone} = 1;
- my $lines = $list->{lines};
- my $own_clist = [ @$act_clist ];
- my $active = 0;
-
- my $clone_select;
-
- foreach my $line ( @$lines ) {
- next unless ref $line;
- my ( $cmd, $globals, $uris ) = @$line{ qw(cmd globals uris) };
-
- foreach my $uri ( keys %$uris ) {
- my ( $getter, $options ) = @{ $uris->{ $uri } };
-
- my @cd = clone_data( { %$options, %$globals } );
- unless ( @cd ) {
- $line->{cmd} = "STOP" if $options->{error};
- next;
- }
-
- if ( $line->{cmd} ne "ADD" ) {
- $active++;
- push @$own_clist, [ [ $uri, @cd ] ];
- next;
- }
-
- my @clones = find_clones( $own_clist, \@cd );
- if ( @clones ) {
- $clone_select = [ $uri, $options, \@clones ];
- } else {
- $line->{cmd} = "GET";
- push @$own_clist, [ [ $uri, @cd ] ];
- }
- }
- last if $clone_select;
- }
- $list->{active} = $active;
-
- return ( $list, $clone_select );
-}
-
-sub add_list_find_uri
-{
- my $list = shift;
- my $furi = shift;
-
- my $lines = $list->{lines};
- foreach my $line ( @$lines ) {
- next unless ref $line;
- my ( $cmd, $globals, $uris ) = @$line{ qw(cmd globals uris) };
-
- foreach my $uri ( keys %$uris ) {
- if ( $uri eq $furi ) {
- return $line;
- }
- }
- }
- return;
-}
-
-sub add_list_add
-{
- my $id = shift;
- my $list = add_list_find( $id );
-
- my @new;
- my $comment = $list->{comment};
- foreach my $line ( @$comment ) {
- push @new, $line . "\n";
- }
-
- my $lines = $list->{lines};
- foreach my $line ( @$lines ) {
- next unless ref $line;
- my ( $cmd, $globals, $uris ) = @$line{ qw(cmd globals uris) };
-
- foreach my $uri ( sort keys %$uris ) {
- my $o = $uris->{ $uri }->[1];
- delete $uris->{ $uri } unless $o->{size} or $o->{asize} or $o->{quality};
- }
-
- next unless keys %$uris;
-
- {
- my @out = ( "$cmd:", RSGet::FileList::h2a( $globals ) );
- push @new, (join " ", @out) . "\n";
- }
- foreach my $uri ( sort keys %$uris ) {
- my @out = ( $uri, RSGet::FileList::h2a( $uris->{ $uri }->[1] ) );
- push @new, (join " ", '+', @out) . "\n";
- }
- }
- push @RSGet::FileList::added, @new;
- RSGet::FileList::update();
-
- $all_lists{ $id } = "Sources added";
-}
-
-sub add_command
-{
- my $lastid = shift;
- my $id = shift;
- my $exec = shift;
- unless ( $exec =~ s/^(.*?):(.*?_.*?)_// ) {
- warn "Invalid command: $exec\n";
- return;
- }
- my $cmd = $1;
- my $grp = $2;
-
- my $idgrp = $lastid->{$grp};
- my $data = $idgrp->{ $exec };
- unless ( $data ) {
- warn "Invalid ID: $cmd, $grp, $exec\n";
- return undef;
- }
-
- my $list = add_list_find( $id ) || return;
- return $list unless ref $list;
-
- if ( $grp =~ s/addclone_// ) {
- my @save;
- if ( $cmd ne "SELECT" ) {
- warn "Invalid command: $cmd, $grp, $exec\n";
- return;
- }
- my $newuri = $idgrp->{uri};
- my $newline = add_list_find_uri( $list, $newuri );
- if ( $data eq "NEW SOURCE" ) {
- my $line = add_list_find_uri( $list, $newuri );
- $line->{cmd} = "GET";
- } elsif ( my $line = add_list_find_uri( $list, $data ) ) {
- $line->{uris}->{ $newuri } = $newline->{uris}->{ $newuri };
- delete $newline->{uris}->{ $newuri };
- } else {
- RSGet::FileList::save( $data, clones =>
- { $newuri => $newline->{uris}->{ $newuri } } );
- delete $newline->{uris}->{ $newuri };
- RSGet::FileList::update();
- }
- } elsif ( $grp =~ s/adduri_// ) {
- my $target = add_list_find_uri( $list, $data );
- if ( $cmd eq "CLEAN ERROR" ) {
- delete $target->{uris}->{ $data }->[1]->{error};
- } elsif ( $cmd eq "DISABLE" ) {
- $target->{uris}->{ $data }->[1]->{error} = "disabled";
- } elsif ( $cmd eq "REMOVE" ) {
- delete $target->{uris}->{ $data };
- } else {
- warn "Invalid command: $cmd, $grp, $exec\n";
- return;
- }
- } elsif ( $grp =~ s/addlist_// ) {
- if ( $cmd eq "CONFIRM" ) {
- add_list_add( $id );
- }
- } else {
- warn "Invalid command group: $cmd, $grp, $exec\n";
- return;
- }
-}
-
1;
# vim: ts=4:sw=4:fdm=marker
More information about the pld-cvs-commit
mailing list