Astro-SpaceTrack
view release on metacpan or search on metacpan
lib/Astro/SpaceTrack.pm view on Meta::CPAN
$rslt->is_success()
or die $rslt->status_line();
open my $fh, '>', 'iridium.json'
or die "Failed to open file: $!";
print { $fh } $rslt->content();
close $fh;
The following is the equivalent example using the F<SpaceTrack> script:
SpaceTrack> set pretty 1
SpaceTrack> spacetrack -json iridium >iridium.json
This method reads the file to be updated, determines the highest C<FILE>
value, and then requests the given OIDs, restricting the return to
C<FILE> values greater than the highest found. If anything is returned,
the file is rewritten.
The following options may be specified:
-json
specifies the TLE be returned in JSON format
Options may be specified either in command-line style (that is, as
C<< spacetrack( '-json', ... ) >>) or as a hash reference (that is, as
C<< spacetrack( { json => 1 }, ... ) >>).
B<Note> that there is no way to specify the C<-rcs> or C<-effective>
options. If the file being updated contains these values, they will be
lost as the individual OIDs are updated.
=cut
{
my %encode = (
'3le' => sub {
my ( undef, $data ) = @_; # JSON object unused
return join '', map {
"$_->{OBJECT_NAME}\n$_->{TLE_LINE1}\n$_->{TLE_LINE2}\n"
} @{ $data };
},
json => sub {
my ( $json, $data ) = @_;
return $json->encode( $data );
},
tle => sub {
my ( undef, $data ) = @_; # JSON object unused
return join '', map {
"$_->{TLE_LINE1}\n$_->{TLE_LINE2}\n"
} @{ $data };
},
);
# Called dynamically
sub _update_opts { ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
return [
_get_retrieve_options(),
];
}
sub update {
my ( $self, @args ) = @_;
my ( $opt, $fn ) = $self->_parse_retrieve_args( @args );
$opt = { %{ $opt } }; # Since we modify it.
delete $opt->{start_epoch}
and Carp::croak '-start_epoch not allowed';
delete $opt->{end_epoch}
and Carp::croak '-end_epoch not allowed';
my $json = $self->_get_json_object();
my $data;
{
local $/ = undef;
open my $fh, '<', $fn
or Carp::croak "Unable to open $fn: $!";
$data = $json->decode( <$fh> );
close $fh;
}
my $file = -1;
my @oids;
foreach my $datum ( @{ $data } ) {
push @oids, $datum->{NORAD_CAT_ID};
my $ff = defined $datum->{_file_of_record} ?
delete $datum->{_file_of_record} :
$datum->{FILE};
$ff > $file
and $file = $ff;
}
defined $opt->{since_file}
or $opt->{since_file} = $file;
my $format = delete $opt->{json} ? 'json' :
$self->getv( 'with_name' ) ? '3le' : 'tle';
$opt->{format} = 'json';
my $resp = $self->retrieve( $opt, sort { $a <=> $b } @oids );
if ( $resp->code() == HTTP_NOT_FOUND ) {
$resp->code( HTTP_OK );
$self->_add_pragmata( $resp,
'spacetrack-type' => 'orbit',
'spacetrack-source' => 'spacetrack',
'spacetrack-interface' => 2,
);
} else {
$resp->is_success()
or return $resp;
my %merge = map { $_->{NORAD_CAT_ID} => $_ } @{ $data };
foreach my $datum ( @{ $json->decode( $resp->content() ) } ) {
%{ $merge{$datum->{NORAD_CAT_ID}} } = %{ $datum };
}
( run in 1.675 second using v1.01-cache-2.11-cpan-bbb979687b5 )