Component-Builder/admin/custom/dropbox.php

342 lines
9.2 KiB
PHP

<?php
/*----------------------------------------------------------------------------------| www.vdm.io |----/
Vast Development Method
/-------------------------------------------------------------------------------------------------------/
@version 1.0.0 - 01st July, 2015
@package Dropbox Links builder
@subpackage dropboxlinks.php
@author Llewellyn van der Merwe <http://www.vdm.io>
@copyright Copyright (C) 2015. All Rights Reserved
@license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
/------------------------------------------------------------------------------------------------------*/
// No direct access.
defined('_JEXEC') or die;
/**
* Dropbox class
*/
class Dropbox
{
// the file name
public $fileName;
// the file array
public $files = array();
// the extension to get
protected $getfiles = array();
// the extensions to leave
protected $notfiles = array();
// the folder array
protected $folders = array();
// folder identifiers
protected $getfolders = array('?dl=0');
// the list of extension to help identify what is folders (not exhaustive, only some of the commen files)
protected $notfolders = array(
'.3gp','.3gpp','.7z','.aac','.act','.aiff','.aiff','.amr','.ape','.ar','.asf','.au','.avi','.awb','.bmp','.bup','.bzip2','.crx','.css','.dct','.deb','.djvu',
'.doc','.docx','.drc','.dss','.ear','.egg','.exe','.flac','.flv','.gif','.gifv','.gzip','.htaccess','.html','.ico','.ini','.iso','.jar','.jpeg','.jpg','.js',
'.json','.lzip','.m3u','.m4a','.m4p','.m4v','.mkv','.mmf','.mng','.mov','.mp3','.mp4','.mpc','.mpeg','.mpeg4','.mpegps','.mpg','.mpkg','.msi','.odt','.ogg',
'.opus','.pdf','.pea','.php','.pkg','.png','.ppt','.pptx','.ps','.psd','.pst','.pxv','.rar','.raw','.rm','.rmvb','.rpm','.rtf','.shar','.sql','.svg','.sxw',
'.tar','.tgz','.tgz','.tiff','.txt','.veg','.vep','.vob','.wav','.webm','.wma','.wmv','.xar','.xls','.xml','.yuv','.zip' );
// the directory where the downloaded files should be stored
protected $dir;
/**
* Constructor
*/
public function __construct($mainurl, $config = array('save' => false, 'filename' => 'dropbox', 'download' => false, 'dir' => __DIR__))
{
if ($this->checkArray($config))
{
// we need more then the normal time to run this script 5 minutes at least.
ini_set('max_execution_time', 500); // TODO this is not the best option I am sure, but for now seems like the only option.
// set main url
$this->mainurl = $mainurl;
// if custom get list is set use it
if (isset($config['get']) && $this->checkArray($config['get']))
{
$this->getfiles = $config['get'];
}
elseif (isset($config['get']) && $this->checkString($config['get']))
{
$this->getfiles = array($config['get']);
}
// if custom excludelist is set use it
if (isset($config['not']) && $this->checkArray($config['not']))
{
$this->notfiles = $config['not'];
}
elseif (isset($config['not']) && $this->checkString($config['not']))
{
$this->notfiles = array($config['not']);
}
// set main folder name
$this->fileName = (isset($config['filename'])) ? md5($this->mainurl.$config['filename']) : md5($this->mainurl.'nofilenamewasset');
// set save switch
$save = (isset($config['save'])) ? $config['save'] : false;
// set download switch
$download = (isset($config['download'])) ? $config['download'] : false;
// make sure the note folder identifiers are complete
$this->notfolders = array_unique(array_merge($this->getfiles,$this->notfiles,$this->notfolders));
// set local directory
$this->dir = (isset($config['dir'])) ? $config['dir'] : __DIR__;
// check if the parching of the drobox files is up to date
if (($json = @file_get_contents($this->fileName.".json")) !== FALSE)
{
$this->files = json_decode($json, true);
}
else
{
// set all folders
$this->parseFolders($this->mainurl, 'VDM_pLeK_h0uEr');
}
// check if we should save the file
if ($save)
{
$this->save();
}
// check if we should download the file
if ($download)
{
$this->download();
}
return true;
}
return false;
}
public function download($dir = null)
{
if ($this->checkArray($this->files))
{
// insure the directory is set
$dir = ($dir) ? $dir : $this->dir;
foreach($this->files as $path => $url)
{
// now setup correct path
$path = str_replace('VDM_pLeK_h0uEr', $dir, $path);
// boom here we go move....
$this->getFile($url, $path);
}
}
}
public function getFile($url, $path)
{
$newfname = $path;
if (($file = @fopen($url, "rb")) !== FALSE)
{
$filename = substr($path, strrpos($path, '/'));
$makePath = str_replace($filename,'',$path);
if (!file_exists($makePath))
{
mkdir($makePath, 0755, true);
}
$newf = fopen($newfname, "wb");
}
else
{
echo 'error! '.$url.' not found';
}
if ($newf)
{
while(!feof($file))
{
fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
}
}
if ($file)
{
fclose($file);
}
if ($newf)
{
fclose($newf);
}
}
public function save($filename = null)
{
if ($this->checkString($filename))
{
// set main folder name
$this->fileName = md5($this->mainurl.$filename);
}
if ($this->checkArray($this->files))
{
$data = json_encode($this->files);
// now save this folders data to a file.
$this->saveJson($data);
return true;
}
return false;
}
protected function saveJson($data)
{
if ($this->checkString($data))
{
/*
for now it will save
the files in the same
directory as the php
file where the class
is called we will have
to change this to suite
your custom needs.
*/
$fp = fopen($this->fileName.'.json', 'w');
fwrite($fp, $data);
fclose($fp);
}
}
protected function parseFolders($url, $foldername)
{
if ($this->checkString($url))
{
// get the page html
if (($html = @file_get_contents($url)) !== FALSE)
{
//Create a new DOM document
$dom = new DOMDocument;
//Parse the HTML. The @ is used to suppress any parsing errors
//that will be thrown if the $html string isn't valid XHTML.
@$dom->loadHTML($html);
//Get all links. You could also use any other tag name here,
//like 'img' or 'table', to extract other tags.
$links = $dom->getElementsByTagName('a');
//Iterate over the extracted links and display their URLs
if ($this->checkObject($links))
{
// the types
$types = array('folders','files');
foreach ($types as $type)
{
// folder bucket
$buket = array();
foreach ($links as $nr => $link)
{
// switch to add link
$add = false;
// get actual link
$href = $link->getAttribute('href');
// only use link reated to type
if ($this->checkArray($this->{'get'.$type}) && $this->checkString($href))
{
foreach ($this->{'get'.$type} as $get)
{
if (!$add)
{
if (strpos($get,'?dl') === false)
{
$get = $get . '?dl=0';
}
if (strpos($href,'https://www.dropbox.com/') !== false && strpos($href,$get) !== false)
{
$add = true;
}
}
}
}
else
{
if (strpos($href,'https://www.dropbox.com/') !== false && strpos($href,'?dl=0') !== false)
{
$add = true;
}
}
// remove if not related to type
if ($this->checkArray($this->{'not'.$type}) && $this->checkString($href) && $add)
{
foreach ($this->{'not'.$type} as $not)
{
if ($add)
{
if (strpos($href,$not) !== false)
{
$add = false;
}
}
}
}
// now add if still related to type
if ($add)
{
if (!in_array($href,$buket))
{
$name = str_replace('?dl=0','',substr($href, strrpos($href, '/') + 1));
if ($type == 'folders' && strpos($name,'.') === false)
{
// parse this folder for more files and sub folders
$this->parseFolders($href, $foldername.'/'.str_replace('?lst','',$name));
$buket[] = $href;
unset($links->$nr);
}
elseif ($type == 'files' && strpos($name,'.') !== false)
{
// Add to file list
$this->files[$foldername.'/'.$name] = str_replace('?dl=0','?dl=1',$href);
$buket[] = $href;
unset($links->$nr);
}
}
}
}
}
}
return true;
}
}
return false;
}
protected function checkObject($object)
{
if (isset($object) && is_object($object) && count($object) > 0)
{
return true;
}
return false;
}
protected function checkArray($array)
{
if (isset($array) && is_array($array) && count($array) > 0)
{
return true;
}
return false;
}
protected function checkString($string)
{
if (isset($string) && is_string($string) && strlen($string) > 0)
{
return true;
}
return false;
}
}
?>