PageRenderTime 69ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/plugins/MediaManager/lib/Flickr/CMS.pm

https://github.com/rayners/mt-plugin-mediamanager
Perl | 228 lines | 184 code | 31 blank | 13 comment | 10 complexity | 3077d4a69ba3f6a6022c9e98506b9247 MD5 | raw file
  1. # Media Manager Movable Type Plugin
  2. # This software is licensed under the GPL
  3. # Copyright (C) 2005-2007, Six Apart, Ltd.
  4. package Flickr::CMS;
  5. use strict;
  6. use base qw( MT::App );
  7. sub plugin {
  8. return MT->component('MediaManagerFlickr');
  9. }
  10. use MT::Util qw( format_ts offset_time_list encode_url );
  11. use MT::ConfigMgr;
  12. use XML::Simple;
  13. sub id { 'flickr_cms' }
  14. sub init {
  15. my $app = shift;
  16. my %param = @_;
  17. return $app->error($@) if $@;
  18. $app;
  19. }
  20. sub _get_auth_url {
  21. use Flickr::API;
  22. my $api = new Flickr::API({
  23. 'key' => _creds()->{flickr_apikey},
  24. 'secret' => _creds()->{flickr_secret},
  25. });
  26. return $api->request_auth_url('read');
  27. }
  28. sub trim {
  29. my($string)=@_;
  30. for ($string) {
  31. s/^\s+//;
  32. s/\s+$//;
  33. }
  34. return $string;
  35. }
  36. sub _creds {
  37. my $config = MT::Request->instance->stash('FlickrConfig');
  38. return $config if (defined($config));
  39. my $sys_config = plugin()->get_config_hash('system');
  40. foreach my $key (keys %$sys_config) {
  41. if (defined($sys_config->{$key} && $sys_config->{$key} ne '')) {
  42. $config->{$key} = trim($sys_config->{$key});
  43. }
  44. }
  45. MT::Request->instance->stash('FlickrConfig', $config);
  46. return $config;
  47. }
  48. sub auth {
  49. my $app = shift;
  50. my $q = $app->{query};
  51. my $tmpl = $app->load_tmpl('flickr/auth.tmpl');
  52. my $token = $app->user->flickr_auth_token();
  53. # if user is already authed, display them a message to that effect. allow them to renew auth token
  54. # TODO - check token
  55. $tmpl->param( auth_url => _get_auth_url() );
  56. $tmpl->param( token => $token );
  57. return $app->build_page($tmpl);
  58. }
  59. sub authed {
  60. my $app = shift;
  61. my $q = $app->{query};
  62. my $tmpl = $app->load_tmpl('flickr/auth.tmpl');
  63. my $frob = $q->param('frob');
  64. use Flickr::API;
  65. use Flickr::API::Request;
  66. my $api = new Flickr::API({
  67. 'key' => _creds()->{flickr_apikey},
  68. 'secret' => _creds()->{flickr_secret},
  69. });
  70. my $request = new Flickr::API::Request({
  71. 'method' => 'flickr.auth.getToken',
  72. 'args' => { frob => $frob },
  73. });
  74. my $r = $api->execute_request($request);
  75. require XML::Simple;
  76. my $xml = $r->content;
  77. my $response = XMLin($xml);
  78. if ($r->{success}) {
  79. my $token = $response->{auth}->{token};
  80. my $user_id = $response->{auth}->{user}->{nsid};
  81. $tmpl->param( token => $token );
  82. $app->user->flickr_auth_token($token);
  83. $app->user->flickr_user_id($user_id);
  84. $app->user->save;
  85. }
  86. $tmpl->param( auth_url => _get_auth_url() );
  87. $tmpl->param( frob => $frob );
  88. return $app->build_page($tmpl);
  89. }
  90. # This handler is responsible for displaying the initial search form
  91. # so that a user can search amazon.
  92. sub find {
  93. my $app = shift;
  94. my $q = $app->{query};
  95. my $blog = $app->blog;
  96. my $tmpl = $app->load_tmpl('flickr/dialog/find.tmpl');
  97. my $token = $app->user->flickr_auth_token();
  98. if ($token) {
  99. use Flickr::API;
  100. use Flickr::API::Request;
  101. my $api = new Flickr::API({
  102. 'key' => _creds()->{flickr_apikey},
  103. 'secret' => _creds()->{flickr_secret},
  104. });
  105. my $request = new Flickr::API::Request({
  106. 'method' => 'flickr.photos.search',
  107. 'args' => { 'user_id' => $app->user->flickr_user_id() },
  108. });
  109. my $r = $api->execute_request($request);
  110. use Data::Dumper;
  111. print STDERR Dumper($r);
  112. if ($r->{success}) {
  113. require XML::Simple;
  114. my $xml = $r->content;
  115. my $response = XMLin($xml);
  116. my $photos = $response->{photos}->{photo};
  117. my @photo_data;
  118. foreach my $key (reverse sort keys %$photos) {
  119. my $p = $photos->{$key};
  120. my $thumb = 'http://farm' . $p->{farm} . '.static.flickr.com/'.$p->{server}.'/'.$key.'_'.$p->{secret}.'_t.jpg';
  121. my $row = {
  122. blog_id => $blog->id,
  123. photo_id => $key,
  124. title => $p->{title},
  125. thumbnail => $thumb,
  126. };
  127. push @photo_data, $row;
  128. }
  129. $tmpl->param(entry_loop => \@photo_data);
  130. }
  131. } else {
  132. # no token display message
  133. }
  134. $tmpl->param(blog_id => $blog->id);
  135. return $app->build_page($tmpl);
  136. }
  137. sub _get_photo_info {
  138. my ($photo_id) = @_;
  139. use Flickr::API;
  140. use Flickr::API::Request;
  141. my $api = new Flickr::API({
  142. 'key' => _creds()->{flickr_apikey},
  143. 'secret' => _creds()->{flickr_secret},
  144. });
  145. my $request = new Flickr::API::Request({
  146. 'method' => 'flickr.photos.getInfo',
  147. 'args' => { 'photo_id' => $photo_id },
  148. });
  149. my $r = $api->execute_request($request);
  150. if ($r->{success}) {
  151. require XML::Simple;
  152. my $xml = $r->content;
  153. my $response = XMLin($xml);
  154. return $response->{photo};
  155. }
  156. }
  157. # This handler is responsible for saving the asset and also for presenting
  158. # the user with a list of options for inserting it into a post.
  159. # Saving however should take place one step earlier because a user may
  160. # decide NOT to insert it into a post.
  161. sub asset_options {
  162. my $app = shift;
  163. init($app);
  164. my $q = $app->{query};
  165. my $blog = $app->blog;
  166. my $pid = $q->param('selected');
  167. my $photo = _get_photo_info( $pid );
  168. my $title = $photo->{title};
  169. require MT::Asset::Flickr;
  170. my $asset = MT::Asset::Flickr->new;
  171. $asset->blog_id($q->param('blog_id'));
  172. $asset->photo_id($pid);
  173. $asset->label($title);
  174. $asset->url('http://www.flickr.com/photos/'.$photo->{owner}.'/'.$pid);
  175. $asset->photo_id($pid);
  176. $asset->photo_server($photo->{server});
  177. $asset->photo_farm($photo->{farm});
  178. $asset->photo_secret($photo->{secret});
  179. $asset->photo_owner($photo->{owner});
  180. $asset->photo_is_public($photo->{ispublic});
  181. $asset->original_title($title);
  182. $asset->created_by( $app->user->id );
  183. $asset->original_title($title);
  184. my $original = $asset->clone;
  185. $asset->save;
  186. $app->run_callbacks( 'cms_post_save.asset', $app, $asset, $original );
  187. return $app->complete_insert(
  188. asset => $asset,
  189. photo_id => $pid,
  190. # title => $title,
  191. description => $asset->description,
  192. thumbnail => $asset->thumbnail_url,
  193. is_youtube => 1,
  194. );
  195. }
  196. 1;
  197. __END__