about summary refs log blame commit diff stats
path: root/lib/UnsplashSource.pm
blob: bcce9663223097b8adfa2d833e93027d50d2d92d (plain) (tree)
1
2
3
4
5
6
7
8






                       
        




































                                                     







                                                     
                                                           
 




                             









                                                    











                                                         
 

                                                








                                                            
                                                           
 



                             
#!/usr/bin/perl

package UnsplashSource;

use strict;
use warnings;

use URI;
use HTTP::Tiny;
use Carp qw( croak carp );

my $api = "https://source.unsplash.com";
my $http = HTTP::Tiny->new(
    agent => "crux - UnsplashSource.pm - HTTP::Tiny",
    max_redirect => 0,
    verify_SSL => 1,
    timeout => 60,

);

sub get {
    my ( %options ) = @_;

    if ( $options{daily} or $options{weekly} ) {
        return fixed( %options );
    } elsif ( $options{user} ) {
        return user_random( %options );
    } elsif ( ( scalar @{$options{search}} > 0 )
                  or $options{featured} ) {
        return random_search( %options );
    } elsif ( $options{collection_id} ) {
        return collection( %options );
    } else {
        return get_random( %options );
    }
}

sub get_random {
    my ( %options ) = @_;
    my $url = "$api/random/$options{resolution}";
    return $http->head($url);
}

sub random_search {
    my ( %options ) = @_;

    my $url = URI->new($api);

    my @segments;
    push @segments, "featured" if $options{featured};
    push @segments, $options{resolution};
    $url->path_segments( @segments );

    $url->query_keywords( join(',', @{$options{search}}) );

    return $http->head($url);
}

sub user_random {
    my ( %options ) = @_;

    my $url = URI->new($api);

    my @segments;
    push @segments, "user";
    push @segments, $options{user};
    push @segments, "likes" if $options{user_likes};
    push @segments, $options{resolution};
    $url->path_segments( @segments );

    return $http->head($url);
}

sub collection {
    my ( %options ) = @_;
    my $url = "$api/collection/$options{collection_id}/";
    $url .= $options{resolution};
    return $http->head($url);
}

sub fixed {
    my ( %options ) = @_;

    croak "Cannot use daily & weekly together"
        if $options{daily} and $options{weekly};

    my $url = URI->new($api);

    my @segments;
    push @segments, "user/$options{user}" if $options{user};
    push @segments, "daily" if $options{daily};
    push @segments, "weekly" if $options{weekly};
    $url->path_segments( @segments );

    $url->query_keywords( join(',', @{$options{search}}) );

    return $http->head($url);
}

1;