package XML::Atom::Lifeblog::Media; use strict; use Carp; use File::Basename; use File::Type; use MIME::Types; sub new { my $class = shift; my $self = bless { }, $class; $self->init(@_); } sub title { $_[0]->{title} } sub type { $_[0]->{type} } sub content { $_[0]->{content} } sub init { my($self, %param) = @_; if (my $name = $param{filename}) { $self->{content} = $self->_slurp($name); $self->{type} = $param{type} || $self->_guess_type($name); $self->{title} = $param{title} || $self->_basename($name); } elsif (my $content = $param{content}) { $self->{content} = $content; $self->{type} = $param{type} || $self->_guess_type(\$content); $self->{title} = $param{title} || $self->_random_title; } elsif (my $fh = $param{filehandle}) { local $/; $self->{content} = <$fh>; $self->{type} = $param{type} || $self->_guess_type(\$self->content); $self->{title} = $param{title} || $self->_random_title; } else { Carp::croak("XML::Atom::Lifeblog::Media->new(): requires filename, content or filehandle parameter"); } $self; } sub _slurp { my($self, $file) = @_; local $/; open my $fh, $file or Carp::croak("$file: $!"); <$fh>; } sub _guess_type { my($self, $foo) = @_; ref($foo) ? $self->_guess_type_magic($$foo) : $self->_guess_type_mime($foo); } sub _guess_type_magic { my($self, $content) = @_; return File::Type->new->checktype_contents($content); } sub _guess_type_mime { my($self, $filename) = @_; my $mime = MIME::Types->new->mimeTypeOf($filename); return $mime ? $mime->type : undef; } sub _random_title { my $self = shift; my $ext = eval { [ MIME::Types->new->type($self->type)->extensions ]->[0]; } || "dat"; return "XML::Atom::Lifeblog-$$.$ext"; } sub _basename { my($self, $file) = @_; File::Basename::basename($file); } 1;