Вход Регистрация
Файл: outs/oembed/oembed.php
Строк: 126
<?php

require_once dirname(__FILE__) . DS 'providers.php';

class 
OEmbed
{
    private static 
$providers = array();

    
/**
     *
     * @var OEmbedProvider
     */
    
private static $defaultProvider;

    public static function 
addProviderOEmbedProvider $provider )
    {
        
self::$providers[] = $provider;
    }

    public static function 
parse$url )
    {
        
$oembed null;

        foreach ( 
self::$providers as $p )
        {
            if ( 
$p->check($url) )
            {
                
$oembed $p->parse($url);
                break;
            }
        }

        if ( empty(
$oembed) )
        {
            
self::$defaultProvider = empty(self::$defaultProvider)
                    ? new 
OEmbedDefaultProvider()
                    : 
self::$defaultProvider;

            
$oembed self::$defaultProvider->parse($url);
        }

        if ( !empty(
$oembed) )
        {
            
$oembed['href'] = $url;
        }

        return 
$oembed;
    }
}

abstract class 
OEmbedProvider
{
    public abstract function 
check$url );
    public abstract function 
parse$url );
}

class 
OEmbedApiProvider extends OEmbedProvider
{
    private 
$api;
    private 
$scheme = array();

    public function 
__construct$api$scheme )
    {
        
$this->api $api;
        
$this->scheme = (array) $scheme;
    }

    private function 
request$requestUrl )
    {
        
$response UTIL_HttpResource::getContents($requestUrl);

        if ( empty(
$response) )
        {
            return 
null;
        }

        return 
json_decode($responsetrue);
    }

    private function 
getRequestUrl$url )
    {
        return 
str_replace(':url'urlencode($url), $this->api);
    }

    public function 
check$url )
    {
        foreach ( 
$this->scheme as $s )
        {
            if ( 
preg_match($s$url) )
            {
                return 
true;
            }
        }

        return 
false;
    }

    public function 
parse$url )
    {
        return 
$this->request($this->getRequestUrl($url));
    }
}


class 
OEmbedDefaultProvider extends OEmbedProvider
{
    public function 
__construct()
    {

    }

    public function 
check$url )
    {
        return 
true;
    }

    private function 
getType$url )
    {
        
$urlInfo parse_url($url);

        if ( empty(
$urlInfo['path']) )
        {
            return 
'link';
        }

        
$foo explode('.'$urlInfo['path']);
        
$ext end($foo);

        switch ( 
trim($ext) )
        {
           case 
'gif':
           case 
'jpeg':
           case 
'jpg':
           case 
'png':
                return 
'image';

            default :
                return 
'link';
        }
    }

    private function 
parsePage$url )
    {
        
$content = @UTIL_HttpResource::getContents($url);

        
$matches = array();
        
preg_match('/<s*metas*[^>]*?http-equiv=['"]content-type['"][^>]*?s*>/i',$content,$matches);
        $meta = empty($matches[0]) ? null : $matches[0];

        preg_match('
/content=['"][^'"]*?charset=([w-]+)(:[^w-][^'"])*?['"]/i',$meta,$matches);
        
$encoding = empty($matches[1]) ? 'UTF-8' $matches[1];

        
preg_match('/<s*titles*>([sS]*?)<s*/s*titles*>/i',$content,$matches);
        
$title = empty($matches[1]) ? null mb_convert_encoding($matches[1], 'UTF-8'$encoding);

        
$matches = array();
        
$meta "";
        
preg_match('/<s*metas*[^>]*?name=['"]description['"][^>]*?s*>/i',$content,$matches);
        $meta = empty($matches[0]) ? null : $matches[0];

        $matches = array();
        preg_match('
/content=['"](.*?)['"]/i',$meta,$matches);
        
$description = empty($matches[1]) ? null : mb_convert_encoding($matches[1], 'UTF-8', $encoding);

        
$matches = array();
        preg_match_all('/<s*imgs*.*?src=['"
](.+?)['"].*?>/i',$content$matches);

        
$images = array();

        foreach ( 
$matches[1] as $img )
        {
            
$urlInfo parse_url($url);
            
$imgInfo parse_url($img);

            if ( empty(
$imgInfo['host']) )
            {
                
$imgDir dirname($imgInfo['path']);

                
$urlScheme = empty($urlInfo['scheme']) ? '' $urlInfo['scheme'] . '://';
                
$urlAddr $urlScheme $urlInfo['host'];

                if ( 
strpos($imgDir'/') === )
                {
                    
$img $urlAddr $imgInfo['path'];
                }
                elseif ( !empty(
$urlInfo['path']) )
                {
                    
$pp pathinfo($urlInfo['path']);
                    
$urlPath $pp['dirname'] . ( empty($pp['extension']) ? $pp['basename'] . '/' '' );
                    
$img $urlAddr $urlPath $imgInfo['path'];
                }
                else
                {
                    
$img $urlAddr '/' $imgInfo['path'];
                }
            }

            
$images[] = $img;
        }

        
$firstImg reset($images);
        
$firstImg $firstImg $firstImg null;

        return array(
            
'type' => 'link',
            
'description' => $description,
            
'title' => $title,
            
'thumbnail_url' => $firstImg,
            
'allImages' => $images
        
);
    }

    public function 
parse$url )
    {
        
$sType $this->getType($url);

        if ( 
$sType == 'image' )
        {
            return array(
                
'url' => $url,
                
'href' => $url,
                
'type' => 'photo'
            
);
        }

        return 
$this->parsePage($url);
    }
}
Онлайн: 0
Реклама