/php/photobucket_external_repository_manager_connector.class.php

https://bitbucket.org/chamilo/chamilo-ext-repo-photobucket-dev/ · PHP · 393 lines · 323 code · 51 blank · 19 comment · 28 complexity · 11b60854d48dfb906c3f2a9722325ee9 MD5 · raw file

  1. <?php
  2. namespace common\extensions\external_repository_manager\implementation\photobucket;
  3. use common\libraries;
  4. use common\libraries\Request;
  5. use common\libraries\Path;
  6. use common\libraries\Session;
  7. use common\libraries\Utilities;
  8. use common\libraries\Redirect;
  9. use common\libraries\ArrayResultSet;
  10. use common\extensions\external_repository_manager\ExternalRepositoryManagerConnector;
  11. use common\extensions\external_repository_manager\ExternalRepositoryObject;
  12. use repository\RepositoryDataManager;
  13. use repository\ExternalSetting;
  14. use repository\ExternalUserSetting;
  15. use PBAPI;
  16. require_once dirname(__FILE__) . '/photobucket_external_repository_object.class.php';
  17. require_once 'OAuth/Request.php';
  18. require_once Path :: get_plugin_path(__NAMESPACE__) . 'PBAPI/PBAPI.php';
  19. /**
  20. *
  21. * @author magali.gillard
  22. * key : 149830482
  23. * secret : 410277f61d5fc4b01a9b9e763bf2e97b
  24. */
  25. class PhotobucketExternalRepositoryManagerConnector extends ExternalRepositoryManagerConnector
  26. {
  27. private $photobucket;
  28. private $consumer;
  29. private $key;
  30. private $secret;
  31. private $photobucket_session;
  32. function __construct($external_repository_instance)
  33. {
  34. parent :: __construct($external_repository_instance);
  35. $this->key = ExternalSetting :: get('consumer_key', $this->get_external_repository_instance_id());
  36. $this->secret = ExternalSetting :: get('consumer_secret', $this->get_external_repository_instance_id());
  37. $url = ExternalSetting :: get('url', $this->get_external_repository_instance_id());
  38. $this->login();
  39. }
  40. function login()
  41. {
  42. $this->consumer = new PBAPI($this->key, $this->secret);
  43. $this->consumer->setResponseParser('simplexmlarray');
  44. $this->photobucket_session = unserialize(ExternalUserSetting :: get('session', $this->get_external_repository_instance_id()));
  45. $oauth_access_token = $this->photobucket_session['photobucket_access_token'];
  46. $oauth_request_token = Session :: retrieve('photobucket_request_token');
  47. if (! $oauth_access_token)
  48. {
  49. if (! $oauth_request_token)
  50. {
  51. $this->consumer->login('request')->post()->loadTokenFromResponse();
  52. Session :: register('photobucket_request_token', serialize($this->consumer->getOauthToken()));
  53. $this->consumer->goRedirect('login', Redirect :: current_url());
  54. }
  55. else
  56. {
  57. $oauth_request_token = unserialize($oauth_request_token);
  58. $this->consumer->setOAuthToken($oauth_request_token->getKey(), $oauth_request_token->getSecret());
  59. $this->consumer->login('access')->post()->loadTokenFromResponse();
  60. $session_array = array();
  61. $session_array['photobucket_access_token'] = $this->consumer->getOAuthToken();
  62. $session_array['photobucket_username'] = $this->consumer->getUsername();
  63. $session_array['photobucket_subdomain'] = $this->consumer->getSubdomain();
  64. $session_array = serialize($session_array);
  65. $setting = RepositoryDataManager :: get_instance()->retrieve_external_setting_from_variable_name('session', $this->get_external_repository_instance_id());
  66. $user_setting = new ExternalUserSetting();
  67. $user_setting->set_setting_id($setting->get_id());
  68. $user_setting->set_user_id(Session :: get_user_id());
  69. $user_setting->set_value($session_array);
  70. if ($user_setting->create())
  71. {
  72. Session :: unregister('photobucket_request_token');
  73. }
  74. }
  75. }
  76. else
  77. {
  78. $username = $this->photobucket_session['photobucket_username'];
  79. $subdomain = $this->photobucket_session['photobucket_subdomain'];
  80. $this->consumer->setOAuthToken($oauth_access_token->getKey(), $oauth_access_token->getSecret(), $username);
  81. $this->consumer->setSubdomain($subdomain);
  82. }
  83. }
  84. //Only image for the moment
  85. function retrieve_external_repository_objects($condition, $order_property, $offset, $count)
  86. {
  87. $response = $this->retrieve_photos($condition, $order_property, $offset, $count);
  88. $objects = array();
  89. foreach ($response['media'] as $media)
  90. {
  91. $objects[] = $this->set_photo_object($media);
  92. }
  93. return new ArrayResultSet($objects);
  94. }
  95. function retrieve_photos($condition, $order_property, $offset, $count)
  96. {
  97. $feed_type = Request :: get(PhotobucketExternalRepositoryManager :: PARAM_FEED_TYPE);
  98. $offset = (($offset - ($offset % $count)) / $count) + 1;
  99. if (is_null($condition))
  100. {
  101. $condition = '';
  102. }
  103. switch ($feed_type)
  104. {
  105. case PhotobucketExternalRepositoryManager :: FEED_TYPE_GENERAL :
  106. $response = $this->consumer->search($condition, array('num' => $count, 'perpage' => $count,
  107. 'page' => $offset, 'secondaryperpage' => 1))->get()->getParsedResponse(true);
  108. if ($condition)
  109. {
  110. $response = $response['result']['primary'];
  111. }
  112. else
  113. {
  114. $response = $response['result'];
  115. }
  116. break;
  117. case PhotobucketExternalRepositoryManager :: FEED_TYPE_MY_PHOTOS :
  118. if ($condition)
  119. {
  120. $response = $this->consumer->search($condition, array('num' => $count, 'perpage' => $count,
  121. 'page' => $offset, 'secondaryperpage' => 1))->get()->getParsedResponse(true);
  122. $response = $response['result']['primary'];
  123. }
  124. else
  125. {
  126. $response = $this->consumer->user($this->photobucket_session['photobucket_username'])->search($condition, array(
  127. 'perpage' => $count, 'page' => $offset, 'type' => 'image'))->get()->getParsedResponse(true);
  128. if ($response['_attribs']['totalresults'] == 1)
  129. {
  130. $response['media'] = array($response['media']);
  131. }
  132. }
  133. break;
  134. default :
  135. if ($condition)
  136. {
  137. $response = $this->consumer->search($condition, array('num' => $count, 'perpage' => $count,
  138. 'page' => $offset, 'secondaryperpage' => 1))->get()->getParsedResponse(true);
  139. $response = $response['result']['primary'];
  140. }
  141. else
  142. {
  143. $response = $this->consumer->user($this->photobucket_session['photobucket_username'])->search($condition, array(
  144. 'perpage' => $count, 'page' => $offset, 'type' => 'image'))->get()->getParsedResponse(true);
  145. if ($response['_attribs']['totalresults'] == 1)
  146. {
  147. $response['media'] = array($response['media']);
  148. }
  149. }
  150. break;
  151. }
  152. return $response;
  153. }
  154. function retrieve_external_repository_object($id)
  155. {
  156. $data = $this->consumer->media(urldecode($id))->get()->getParsedResponse(true);
  157. return $this->set_photo_object($data['media']);
  158. }
  159. function set_photo_object($data)
  160. {
  161. $object = new PhotobucketExternalRepositoryObject();
  162. $object->set_id(urlencode($data['url']));
  163. $object->set_title($data['title']);
  164. $object->set_description($data['description']);
  165. $object->set_url($data['url']);
  166. $object->set_thumbnail($data['thumb']);
  167. $object->set_owner_id($data['_attribs']['username']);
  168. $object->set_created($data['_attribs']['uploaddate']);
  169. $object->set_modified($data['_attribs']['uploaddate']);
  170. $object->set_type(Utilities :: camelcase_to_underscores($data['_attribs']['type']));
  171. $object->set_rights($this->determine_rights($data));
  172. $tags = array();
  173. if (array_key_exists('_attribs', $data['tag']))
  174. {
  175. $data['tag'] = array($data['tag']);
  176. }
  177. if (count($data['tag']) > 0)
  178. {
  179. foreach ($data['tag'] as $tag)
  180. {
  181. $tags[] = $tag['_attribs']['tag'];
  182. }
  183. }
  184. // elseif (count($data['media']['tag']) == 1)
  185. // {
  186. // $tags[] = $data['tag']['_attribs']['tag'];
  187. // }
  188. $object->set_tags($tags);
  189. return $object;
  190. }
  191. function count_external_repository_objects($condition)
  192. {
  193. $feed_type = Request :: get(PhotobucketExternalRepositoryManager :: PARAM_FEED_TYPE);
  194. if (is_null($condition))
  195. {
  196. $condition = '';
  197. }
  198. switch ($feed_type)
  199. {
  200. case PhotobucketExternalRepositoryManager :: FEED_TYPE_GENERAL :
  201. if ($condition)
  202. {
  203. $response = $this->consumer->search($condition, array('num' => 1, 'perpage' => 1, 'page' => 1,
  204. 'secondaryperpage' => 1))->get()->getParsedResponse(true);
  205. return $response['result']['_attribs']['totalresults'];
  206. }
  207. else
  208. {
  209. return 900;
  210. }
  211. break;
  212. case PhotobucketExternalRepositoryManager :: FEED_TYPE_MY_PHOTOS :
  213. if ($condition)
  214. {
  215. $response = $this->consumer->search($condition, array('num' => 1, 'perpage' => 1, 'page' => 1,
  216. 'secondaryperpage' => 1))->get()->getParsedResponse(true);
  217. return $response['result']['_attribs']['totalresults'];
  218. }
  219. else
  220. {
  221. $response = $this->consumer->user($this->photobucket_session['photobucket_username'])->get()->getParsedResponse(true);
  222. return $response['total_pictures'];
  223. }
  224. break;
  225. default :
  226. if ($condition)
  227. {
  228. $response = $this->consumer->search($condition, array('num' => 1, 'perpage' => 1, 'page' => 1,
  229. 'secondaryperpage' => 1))->get()->getParsedResponse(true);
  230. return $response['result']['_attribs']['totalresults'];
  231. }
  232. else
  233. {
  234. $response = $this->consumer->user($this->photobucket_session['photobucket_username'])->get()->getParsedResponse(true);
  235. return $response['total_pictures'];
  236. }
  237. break;
  238. }
  239. }
  240. /**
  241. * @param array $values
  242. * @return boolean
  243. */
  244. function update_external_repository_object($values)
  245. {
  246. while ($data = $this->consumer->media(urldecode($values[PhotobucketExternalRepositoryObject :: PROPERTY_ID]))->tag()->get()->getParsedResponse(true))
  247. {
  248. $response = $this->consumer->media(urldecode($values[PhotobucketExternalRepositoryObject :: PROPERTY_ID]))->tag($data['tagid'])->delete()->getParsedResponse(true);
  249. }
  250. $response = $this->consumer->media(urldecode($values[PhotobucketExternalRepositoryObject :: PROPERTY_ID]))->title(array(
  251. 'title' => $values[PhotobucketExternalRepositoryObject :: PROPERTY_TITLE]))->put()->getParsedResponse(true);
  252. if (! $response)
  253. {
  254. return false;
  255. }
  256. else
  257. {
  258. $response = $this->consumer->media(urldecode($values[PhotobucketExternalRepositoryObject :: PROPERTY_ID]))->description(array(
  259. 'description' => $values[PhotobucketExternalRepositoryObject :: PROPERTY_DESCRIPTION]))->put()->getParsedResponse(true);
  260. if (! $response)
  261. {
  262. return false;
  263. }
  264. }
  265. if ($values[PhotobucketExternalRepositoryObject :: PROPERTY_TAGS])
  266. {
  267. $tags = explode(',', $values[PhotobucketExternalRepositoryObject :: PROPERTY_TAGS]);
  268. foreach ($tags as $tag)
  269. {
  270. $response = $this->consumer->media(urldecode($values[PhotobucketExternalRepositoryObject :: PROPERTY_ID]))->tag(array(
  271. 'tag' => $tag, 'topleftx' => 0, 'toplefty' => 0, 'bottomrightx' => 0, 'bottomrighty' => 0))->post()->getParsedResponse(true);
  272. if (! $response)
  273. {
  274. return false;
  275. }
  276. }
  277. }
  278. return true;
  279. }
  280. function delete_external_repository_object($id)
  281. {
  282. $response = $this->consumer->media($id)->delete()->getParsedResponse(true);
  283. if ($response['deleted'] == 1)
  284. {
  285. return true;
  286. }
  287. return false;
  288. }
  289. function create_external_repository_object($values, $file)
  290. {
  291. $photo = base64_encode(file_get_contents($file['tmp_name']));
  292. $tags = explode(',', $values[PhotobucketExternalRepositoryObject :: PROPERTY_TAGS]);
  293. $session = unserialize(ExternalUserSetting :: get('session', $this->get_external_repository_instance_id(), Session :: get_user_id()));
  294. $response = $this->consumer->album($session['photobucket_username'])->upload(array('type' => 'base64',
  295. 'filename' => $file['name'], 'uploadfile' => $photo,
  296. 'title' => $values[PhotobucketExternalRepositoryObject :: PROPERTY_TITLE],
  297. 'description' => $values[PhotobucketExternalRepositoryObject :: PROPERTY_DESCRIPTION]))->post()->getParsedResponse(true);
  298. foreach ($tags as $tag)
  299. {
  300. $this->consumer->media(urlencode($response['url']))->tag(array('tag' => $tag, 'topleftx' => 0,
  301. 'toplefty' => 0, 'bottomrightx' => 0, 'bottomrighty' => 0))->post()->getParsedResponse(true);
  302. }
  303. return urlencode($response['url']);
  304. }
  305. function export_external_repository_object($object)
  306. {
  307. $photo = base64_encode(file_get_contents($object->get_full_path()));
  308. $response = $this->consumer->album($this->photobucket_session['photobucket_username'])->upload(array(
  309. 'type' => 'base64', 'filename' => $object->get_filename(), 'uploadfile' => $photo,
  310. 'title' => $object->get_title(), 'description' => $object->get_description()))->post()->getParsedResponse(true);
  311. return urlencode($response['url']);
  312. }
  313. function determine_rights($photo)
  314. {
  315. $rights = array();
  316. if ($this->photobucket_session['photobucket_username'] == $photo['_attribs']['username'])
  317. {
  318. $rights[ExternalRepositoryObject :: RIGHT_USE] = true;
  319. $rights[ExternalRepositoryObject :: RIGHT_EDIT] = true;
  320. $rights[ExternalRepositoryObject :: RIGHT_DELETE] = true;
  321. $rights[ExternalRepositoryObject :: RIGHT_DOWNLOAD] = true;
  322. }
  323. else
  324. {
  325. $rights[ExternalRepositoryObject :: RIGHT_USE] = true;
  326. $rights[ExternalRepositoryObject :: RIGHT_EDIT] = false;
  327. $rights[ExternalRepositoryObject :: RIGHT_DELETE] = false;
  328. $rights[ExternalRepositoryObject :: RIGHT_DOWNLOAD] = false;
  329. }
  330. return $rights;
  331. }
  332. /**
  333. * @param string $query
  334. * @return string
  335. */
  336. static
  337. function translate_search_query($query)
  338. {
  339. return $query;
  340. }
  341. }
  342. ?>