You've already forked joomla_test
							
							
		
			
				
	
	
		
			483 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			483 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * @package     Joomla.Platform
 | |
|  * @subpackage  Google
 | |
|  *
 | |
|  * @copyright   Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved
 | |
|  * @license     GNU General Public License version 2 or later; see LICENSE
 | |
|  */
 | |
| 
 | |
| defined('JPATH_PLATFORM') or die;
 | |
| 
 | |
| /**
 | |
|  * Google Picasa data class for the Joomla Platform.
 | |
|  *
 | |
|  * @package     Joomla.Platform
 | |
|  * @subpackage  Google
 | |
|  * @since       12.3
 | |
|  */
 | |
| class JGoogleDataPicasaAlbum extends JGoogleData
 | |
| {
 | |
| 	/**
 | |
| 	 * @var    SimpleXMLElement  The album's XML
 | |
| 	 * @since  12.3
 | |
| 	 */
 | |
| 	protected $xml;
 | |
| 
 | |
| 	/**
 | |
| 	 * Constructor.
 | |
| 	 *
 | |
| 	 * @param   SimpleXMLElement  $xml      XML from Google
 | |
| 	 * @param   JRegistry         $options  Google options object
 | |
| 	 * @param   JGoogleAuth       $auth     Google data http client object
 | |
| 	 *
 | |
| 	 * @since   12.3
 | |
| 	 */
 | |
| 	public function __construct(SimpleXMLElement $xml, JRegistry $options = null, JGoogleAuth $auth = null)
 | |
| 	{
 | |
| 		$this->xml = $xml;
 | |
| 
 | |
| 		parent::__construct($options, $auth);
 | |
| 
 | |
| 		if (isset($this->auth) && !$this->auth->getOption('scope'))
 | |
| 		{
 | |
| 			$this->auth->setOption('scope', 'https://picasaweb.google.com/data/');
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Method to delete a Picasa album
 | |
| 	 *
 | |
| 	 * @param   mixed  $match  Check for most up to date album
 | |
| 	 *
 | |
| 	 * @return  boolean  Success or failure.
 | |
| 	 *
 | |
| 	 * @since   12.3
 | |
| 	 * @throws UnexpectedValueException
 | |
| 	 */
 | |
| 	public function delete($match = '*')
 | |
| 	{
 | |
| 		if ($this->isAuthenticated())
 | |
| 		{
 | |
| 			$url = $this->getLink();
 | |
| 
 | |
| 			if ($match === true)
 | |
| 			{
 | |
| 				$match = $this->xml->xpath('./@gd:etag');
 | |
| 				$match = $match[0];
 | |
| 			}
 | |
| 
 | |
| 			try
 | |
| 			{
 | |
| 				$jdata = $this->query($url, null, array('GData-Version' => 2, 'If-Match' => $match), 'delete');
 | |
| 			}
 | |
| 			catch (Exception $e)
 | |
| 			{
 | |
| 				if (strpos($e->getMessage(), 'Error code 412 received requesting data: Mismatch: etags') === 0)
 | |
| 				{
 | |
| 					throw new RuntimeException("Etag match failed: `$match`.");
 | |
| 				}
 | |
| 				throw $e;
 | |
| 			}
 | |
| 
 | |
| 			if ($jdata->body != '')
 | |
| 			{
 | |
| 				throw new UnexpectedValueException("Unexpected data received from Google: `{$jdata->body}`.");
 | |
| 			}
 | |
| 			$this->xml = null;
 | |
| 
 | |
| 			return true;
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Method to get the album link
 | |
| 	 *
 | |
| 	 * @param   string  $type  Type of link to return
 | |
| 	 *
 | |
| 	 * @return  string  Link or false on failure
 | |
| 	 *
 | |
| 	 * @since   12.3
 | |
| 	 */
 | |
| 	public function getLink($type = 'edit')
 | |
| 	{
 | |
| 		$links = $this->xml->link;
 | |
| 
 | |
| 		foreach ($links as $link)
 | |
| 		{
 | |
| 			if ($link->attributes()->rel == $type)
 | |
| 			{
 | |
| 				return (string) $link->attributes()->href;
 | |
| 			}
 | |
| 		}
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Method to get the title of the album
 | |
| 	 *
 | |
| 	 * @return  string  Album title
 | |
| 	 *
 | |
| 	 * @since   12.3
 | |
| 	 */
 | |
| 	public function getTitle()
 | |
| 	{
 | |
| 		return (string) $this->xml->children()->title;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Method to get the summary of the album
 | |
| 	 *
 | |
| 	 * @return  string  Album summary
 | |
| 	 *
 | |
| 	 * @since   12.3
 | |
| 	 */
 | |
| 	public function getSummary()
 | |
| 	{
 | |
| 		return (string) $this->xml->children()->summary;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Method to get the location of the album
 | |
| 	 *
 | |
| 	 * @return  string  Album location
 | |
| 	 *
 | |
| 	 * @since   12.3
 | |
| 	 */
 | |
| 	public function getLocation()
 | |
| 	{
 | |
| 		return (string) $this->xml->children('gphoto', true)->location;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Method to get the access level of the album
 | |
| 	 *
 | |
| 	 * @return  string  Album access level
 | |
| 	 *
 | |
| 	 * @since   12.3
 | |
| 	 */
 | |
| 	public function getAccess()
 | |
| 	{
 | |
| 		return (string) $this->xml->children('gphoto', true)->access;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Method to get the time of the album
 | |
| 	 *
 | |
| 	 * @return  double  Album time
 | |
| 	 *
 | |
| 	 * @since   12.3
 | |
| 	 */
 | |
| 	public function getTime()
 | |
| 	{
 | |
| 		return (double) $this->xml->children('gphoto', true)->timestamp / 1000;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Method to set the title of the album
 | |
| 	 *
 | |
| 	 * @param   string  $title  New album title
 | |
| 	 *
 | |
| 	 * @return  JGoogleDataPicasaAlbum  The object for method chaining
 | |
| 	 *
 | |
| 	 * @since   12.3
 | |
| 	 */
 | |
| 	public function setTitle($title)
 | |
| 	{
 | |
| 		$this->xml->children()->title = $title;
 | |
| 
 | |
| 		return $this;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Method to set the summary of the album
 | |
| 	 *
 | |
| 	 * @param   string  $summary  New album summary
 | |
| 	 *
 | |
| 	 * @return  JGoogleDataPicasaAlbum  The object for method chaining
 | |
| 	 *
 | |
| 	 * @since   12.3
 | |
| 	 */
 | |
| 	public function setSummary($summary)
 | |
| 	{
 | |
| 		$this->xml->children()->summary = $summary;
 | |
| 
 | |
| 		return $this;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Method to set the location of the album
 | |
| 	 *
 | |
| 	 * @param   string  $location  New album location
 | |
| 	 *
 | |
| 	 * @return  JGoogleDataPicasaAlbum  The object for method chaining
 | |
| 	 *
 | |
| 	 * @since   12.3
 | |
| 	 */
 | |
| 	public function setLocation($location)
 | |
| 	{
 | |
| 		$this->xml->children('gphoto', true)->location = $location;
 | |
| 
 | |
| 		return $this;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Method to set the access level of the album
 | |
| 	 *
 | |
| 	 * @param   string  $access  New album access
 | |
| 	 *
 | |
| 	 * @return  JGoogleDataPicasaAlbum  The object for method chaining
 | |
| 	 *
 | |
| 	 * @since   12.3
 | |
| 	 */
 | |
| 	public function setAccess($access)
 | |
| 	{
 | |
| 		$this->xml->children('gphoto', true)->access = $access;
 | |
| 
 | |
| 		return $this;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Method to set the time of the album
 | |
| 	 *
 | |
| 	 * @param   int  $time  New album time
 | |
| 	 *
 | |
| 	 * @return  JGoogleDataPicasaAlbum  The object for method chaining
 | |
| 	 *
 | |
| 	 * @since   12.3
 | |
| 	 */
 | |
| 	public function setTime($time)
 | |
| 	{
 | |
| 		$this->xml->children('gphoto', true)->timestamp = $time * 1000;
 | |
| 
 | |
| 		return $this;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Method to modify a Picasa Album
 | |
| 	 *
 | |
| 	 * @param   string  $match  Optional eTag matching parameter
 | |
| 	 *
 | |
| 	 * @return  mixed  Data from Google.
 | |
| 	 *
 | |
| 	 * @since   12.3
 | |
| 	 */
 | |
| 	public function save($match = '*')
 | |
| 	{
 | |
| 		if ($this->isAuthenticated())
 | |
| 		{
 | |
| 			$url = $this->getLink();
 | |
| 
 | |
| 			if ($match === true)
 | |
| 			{
 | |
| 				$match = $this->xml->xpath('./@gd:etag');
 | |
| 				$match = $match[0];
 | |
| 			}
 | |
| 
 | |
| 			try
 | |
| 			{
 | |
| 				$headers = array('GData-Version' => 2, 'Content-type' => 'application/atom+xml', 'If-Match' => $match);
 | |
| 				$jdata = $this->query($url, $this->xml->asXML(), $headers, 'put');
 | |
| 			}
 | |
| 			catch (Exception $e)
 | |
| 			{
 | |
| 				if (strpos($e->getMessage(), 'Error code 412 received requesting data: Mismatch: etags') === 0)
 | |
| 				{
 | |
| 					throw new RuntimeException("Etag match failed: `$match`.");
 | |
| 				}
 | |
| 				throw $e;
 | |
| 			}
 | |
| 
 | |
| 			$this->xml = $this->safeXML($jdata->body);
 | |
| 
 | |
| 			return $this;
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Refresh Picasa Album
 | |
| 	 *
 | |
| 	 * @return  mixed  Data from Google
 | |
| 	 *
 | |
| 	 * @since   12.3
 | |
| 	 * @throws UnexpectedValueException
 | |
| 	 */
 | |
| 	public function refresh()
 | |
| 	{
 | |
| 		if ($this->isAuthenticated())
 | |
| 		{
 | |
| 			$url = $this->getLink();
 | |
| 			$jdata = $this->query($url, null, array('GData-Version' => 2));
 | |
| 			$this->xml = $this->safeXML($jdata->body);
 | |
| 
 | |
| 			return $this;
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Method to retrieve a list of Picasa Photos
 | |
| 	 *
 | |
| 	 * @return  mixed  Data from Google
 | |
| 	 *
 | |
| 	 * @since   12.3
 | |
| 	 * @throws UnexpectedValueException
 | |
| 	 */
 | |
| 	public function listPhotos()
 | |
| 	{
 | |
| 		if ($this->isAuthenticated())
 | |
| 		{
 | |
| 			$url = $this->getLink('http://schemas.google.com/g/2005#feed');
 | |
| 			$jdata = $this->query($url, null, array('GData-Version' => 2));
 | |
| 			$xml = $this->safeXML($jdata->body);
 | |
| 
 | |
| 			if (isset($xml->children()->entry))
 | |
| 			{
 | |
| 				$items = array();
 | |
| 
 | |
| 				foreach ($xml->children()->entry as $item)
 | |
| 				{
 | |
| 					$items[] = new JGoogleDataPicasaPhoto($item, $this->options, $this->auth);
 | |
| 				}
 | |
| 				return $items;
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				throw new UnexpectedValueException("Unexpected data received from Google: `{$jdata->body}`.");
 | |
| 			}
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Add photo
 | |
| 	 *
 | |
| 	 * @param   string  $file     Path of file to upload
 | |
| 	 * @param   string  $title    Title to give to file (defaults to filename)
 | |
| 	 * @param   string  $summary  Description of the file
 | |
| 	 *
 | |
| 	 * @return  mixed  Data from Google
 | |
| 	 *
 | |
| 	 * @since   12.3
 | |
| 	 * @throws  RuntimeException
 | |
| 	 */
 | |
| 	public function upload($file, $title = '', $summary = '')
 | |
| 	{
 | |
| 		if ($this->isAuthenticated())
 | |
| 		{
 | |
| 			jimport('joomla.filesystem.file');
 | |
| 			$title = $title != '' ? $title : JFile::getName($file);
 | |
| 
 | |
| 			if (!($type = $this->getMIME($file)))
 | |
| 			{
 | |
| 				throw new RuntimeException("Inappropriate file type.");
 | |
| 			}
 | |
| 			if (!($data = JFile::read($file)))
 | |
| 			{
 | |
| 				throw new RuntimeException("Cannot access file: `$file`");
 | |
| 			}
 | |
| 
 | |
| 			$xml = new SimpleXMLElement('<entry></entry>');
 | |
| 			$xml->addAttribute('xmlns', 'http://www.w3.org/2005/Atom');
 | |
| 			$xml->addChild('title', $title);
 | |
| 			$xml->addChild('summary', $summary);
 | |
| 			$cat = $xml->addChild('category', '');
 | |
| 			$cat->addAttribute('scheme', 'http://schemas.google.com/g/2005#kind');
 | |
| 			$cat->addAttribute('term', 'http://schemas.google.com/photos/2007#photo');
 | |
| 
 | |
| 			$post = "Media multipart posting\n";
 | |
| 			$post .= "--END_OF_PART\n";
 | |
| 			$post .= "Content-Type: application/atom+xml\n\n";
 | |
| 			$post .= $xml->asXML() . "\n";
 | |
| 			$post .= "--END_OF_PART\n";
 | |
| 			$post .= "Content-Type: {$type}\n\n";
 | |
| 			$post .= $data;
 | |
| 
 | |
| 			$jdata = $this->query($this->getLink(), $post, array('GData-Version' => 2, 'Content-Type: multipart/related'), 'post');
 | |
| 
 | |
| 			return new JGoogleDataPicasaPhoto($this->safeXML($jdata->body), $this->options, $this->auth);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Add photo
 | |
| 	 *
 | |
| 	 * @param   string  $file  Filename
 | |
| 	 *
 | |
| 	 * @return  mixed  Data from Google
 | |
| 	 *
 | |
| 	 * @since   12.3
 | |
| 	 * @throws UnexpectedValueException
 | |
| 	 */
 | |
| 	protected function getMIME($file)
 | |
| 	{
 | |
| 		switch (strtolower(JFile::getExt($file)))
 | |
| 		{
 | |
| 			case 'bmp':
 | |
| 			case 'bm':
 | |
| 			return 'image/bmp';
 | |
| 			case 'gif':
 | |
| 			return 'image/gif';
 | |
| 			case 'jpg':
 | |
| 			case 'jpeg':
 | |
| 			case 'jpe':
 | |
| 			case 'jif':
 | |
| 			case 'jfif':
 | |
| 			case 'jfi':
 | |
| 			return 'image/jpeg';
 | |
| 			case 'png':
 | |
| 			return 'image/png';
 | |
| 			case '3gp':
 | |
| 			return 'video/3gpp';
 | |
| 			case 'avi':
 | |
| 			return 'video/avi';
 | |
| 			case 'mov':
 | |
| 			case 'moov':
 | |
| 			case 'qt':
 | |
| 			return 'video/quicktime';
 | |
| 			case 'mp4':
 | |
| 			case 'm4a':
 | |
| 			case 'm4p':
 | |
| 			case 'm4b':
 | |
| 			case 'm4r':
 | |
| 			case 'm4v':
 | |
| 			return 'video/mp4';
 | |
| 			case 'mpg':
 | |
| 			case 'mpeg':
 | |
| 			case 'mp1':
 | |
| 			case 'mp2':
 | |
| 			case 'mp3':
 | |
| 			case 'm1v':
 | |
| 			case 'm1a':
 | |
| 			case 'm2a':
 | |
| 			case 'mpa':
 | |
| 			case 'mpv':
 | |
| 			return 'video/mpeg';
 | |
| 			case 'asf':
 | |
| 			return 'video/x-ms-asf';
 | |
| 			case 'wmv':
 | |
| 			return 'video/x-ms-wmv';
 | |
| 			default:
 | |
| 			return false;
 | |
| 		}
 | |
| 	}
 | |
| }
 | 
