Extracts information about web pages, like youtube videos, twitter statuses or blog articles.

Overview

Essence

Build status Scrutinizer Code Quality Code Coverage Total downloads

Essence is a simple PHP library to extract media information from websites, like youtube videos, twitter statuses or blog articles.

If you were already using Essence 2.x.x, you should take a look at the migration guide.

Installation

composer require essence/essence

Example

Essence is designed to be really easy to use. Using the main class of the library, you can retrieve information in just those few lines:

$Essence = new Essence\Essence();
$Media = $Essence->extract('http://www.youtube.com/watch?v=39e3KYAmXK4');

if ($Media) {
	// That's all, you're good to go !
}

Then, just do anything you want with the data:

<article>
	<header>
		<h1><?php echo $Media->title; ?></h1>
		<p>By <?php echo $Media->authorName; ?></p>
	</header>

	<div class="player">
		<?php echo $Media->html; ?>
	</div>
</article>

What you get

Using Essence, you will mainly interact with Media objects. Media is a simple container for all the information that are fetched from an URL.

Here are the default properties it provides:

  • type
  • version
  • url
  • title
  • description
  • authorName
  • authorUrl
  • providerName
  • providerUrl
  • cacheAge
  • thumbnailUrl
  • thumbnailWidth
  • thumbnailHeight
  • html
  • width
  • height

These properties were gathered from the OEmbed and OpenGraph specifications, and merged together in a united interface. Based on such standards, these properties should be a solid starting point.

However, "non-standard" properties can and will also be setted.

Here is how you can manipulate the Media properties:

// through dedicated methods
if (!$Media->has('foo')) {
	$Media->set('foo', 'bar');
}

$value = $Media->get('foo');

// or directly like a class attribute
$Media->customValue = 12;

Note that Essence will always try to fill the html property when it is not available.

Advanced usage

The Essence class provides some useful utility functions to ensure you will get some information.

Extracting URLs

The crawl() and crawlUrl() methods let you crawl extractable URLs from a web page, either directly from its source, or from its URL (in which case Essence will take care of fetching the source).

For example, here is how you could get the URL of all videos in a blog post:

$urls = $Essence->crawlUrl('http://www.blog.com/article');
array(2) {
	[0] => 'http://www.youtube.com/watch?v=123456',
	[1] => 'http://www.dailymotion.com/video/a1b2c_lolcat-fun'
}

You can then get information from all the extracted URLs:

$medias = $Essence->extractAll($urls);
array(2) {
	['http://www.youtube.com/watch?v=123456'] => object(Media) {}
	['http://www.dailymotion.com/video/a1b2c_lolcat-fun'] => object(Media) {}
}

Replacing URLs in text

Essence can replace any extractable URL in a text by information about it. By default, any URL will be replaced by the html property of the found Media.

echo $Essence->replace('Look at this: http://www.youtube.com/watch?v=123456');
Look at this: <iframe src="http://www.youtube.com/embed/123456"></iframe>

But you can do more by passing a callback to control which information will replace the URL:

echo $Essence->replace($text, function($Media) {
	return <<<HTML
		<p class="title">$Media->title</p>
		<div class="player">$Media->html</div>
HTML;
});
Look at this:
<p class="title">Video title</p>
<div class="player">
	<iframe src="http://www.youtube.com/embed/123456"></iframe>
<div>

This makes it easy to build rich templates or even to integrate a templating engine:

echo $Essence->replace($text, function($Media) use ($TwigTemplate) {
	return $TwigTemplate->render($Media->properties());
});

Configuring providers

It is possible to pass some options to the providers.

For example, OEmbed providers accepts the maxwidth and maxheight parameters, as specified in the OEmbed spec.

$options = [
	'maxwidth' => 800,
	'maxheight' => 600
];

$Media = $Essence->extract($url, $options);
$medias = $Essence->extractAll($urls, $options);
$text = $Essence->replace($text, null, $options);

Other providers will just ignore the options they don't handle.

Configuration

Essence currently supports 68 specialized providers:

23hq                Deviantart          Kickstarter         Sketchfab
Animoto             Dipity              Meetup              SlideShare
Aol                 Dotsub              Mixcloud            SoundCloud
App.net             Edocr               Mobypicture         SpeakerDeck
Bambuser            Flickr              Nfb                 Spotify
Bandcamp            FunnyOrDie          Official.fm         Ted
Blip.tv             Gist                Polldaddy           Twitter
Cacoo               Gmep                PollEverywhere      Ustream
CanalPlus           HowCast             Prezi               Vhx
Chirb.it            Huffduffer          Qik                 Viddler
CircuitLab          Hulu                Rdio                Videojug
Clikthrough         Ifixit              Revision3           Vimeo
CollegeHumor        Ifttt               Roomshare           Vine
Coub                Imgur               Sapo                Wistia
CrowdRanking        Instagram           Screenr             WordPress
DailyMile           Jest                Scribd              Yfrog
Dailymotion         Justin.tv           Shoudio             Youtube

Plus the OEmbed and OpenGraph providers, which can be used to extract any URL.

You can configure these providers on instanciation:

$Essence = new Essence\Essence([
	// the SoundCloud provider is an OEmbed provider with a specific endpoint
	'SoundCloud' => Essence\Di\Container::unique(function($C) {
		return $C->get('OEmbedProvider')->setEndpoint(
			'http://soundcloud.com/oembed?format=json&url=:url'
		);
	}),

	'filters' => [
		// the SoundCloud provider will be used for URLs that matches this pattern
		'SoundCloud' => '~soundcloud\.com/[a-zA-Z0-9-_]+/[a-zA-Z0-9-]+~i'
	]
]);

You can also disable the default ones:

$Essence = new Essence\Essence([
	'filters' => [
		'SoundCloud' => false
	]
]);

You will find the default configuration in the standard DI container of Essence (see the following part).

Customization

Almost everything in Essence can be configured through dependency injection. Under the hoods, the constructor uses a dependency injection container to return a fully configured instance of Essence.

To customize the Essence behavior, the easiest way is to configure injection settings when building Essence:

$Essence = new Essence\Essence([
	// the container will return a unique instance of CustomHttpClient
	// each time an HTTP client is needed
	'Http' => Essence\Di\Container::unique(function() {
		return new CustomHttpClient();
	})
]);

The default injection settings are defined in the Standard container class.

Try it out

Once you've installed essence, you should try to run ./cli/essence.php in a terminal. This script allows you to test Essence quickly:

# will fetch and print information about the video
./cli/essence.php extract http://www.youtube.com/watch?v=4S_NHY9c8uM

# will fetch and print all extractable URLs found at the given HTML page
./cli/essence.php crawl http://www.youtube.com/watch?v=4S_NHY9c8uM

Third-party libraries

If you're interested in embedding videos, you should take a look at the Multiplayer lib. It allows you to build customizable embed codes painlessly:

$Multiplayer = new Multiplayer\Multiplayer();

if ($Media->type === 'video') {
	echo $Multiplayer->html($Media->url, [
		'autoPlay' => true,
		'highlightColor' => 'BADA55'
	]);
}
Comments
  • Extract from non-providers?

    Extract from non-providers?

    to extract media information from websites, like youtube videos, twitter statuses or blog articles.

    I just want to clarify if this can extract information from non-providers such as blogs?

    $Media = $Essence->extract('https://maptia.com/daesung/stories/on-the-shores-of-a-vanishing-island');
    if ($Media) {
        echo $Media->title;
    } else {
        echo 'nothing';
    }
    

    I have tried:

    • https://maptia.com/daesung/stories/on-the-shores-of-a-vanishing-island
    • http://www.bbc.com/future/story/20161125-the-worms-that-cost-20000-a-kilo
    • http://www.marvelous-homes.com/top-10-most-beautiful-forest-house/
    • https://aeon.co/essays/how-domestication-changes-species-including-the-human
    • http://listverse.com/2013/08/11/10-ridiculously-slow-to-bloom-plants/
    • http://mentalfloss.com/article/26483/4-bizarre-experiments-should-never-be-repeated

    but it results to "nothing"

    question 
    opened by OxyFuse 12
  • Trying to get property of non-object

    Trying to get property of non-object

    Hi, Since few days, I have a very strange issue!

    I use Laravel 4. Please note that everything was working very well.

    1. I fetch data from database returned as a collection of objects. (tested and working)
    // fetch resources collection
    $resources = $xxx->resources()->orderBy('created_at', 'DESC')->get();
    
    1. I instantiate the Essence object. (tested and working)
    // Essence to work on resources
    $essence = Essence\Essence::instance();
    
    1. I perform a foreach (->each) on the collection
    // Fetch metadata from the resource
    $resources->each(function ($resource) use ($essence)
    {
        $media = $essence->embed($resource->url, ['thumbnailFormat' => 'medium']);
        var_dump($media); // A
        var_dump($media->title); // B
    });
    

    // A output

    object(Essence\Media)[259]
      protected '_properties' => 
        array (size=23) ...
    

    // B output

    Trying to get property of non-object
    

    Do you have any idea? It should be very simple! That drives me nuts!!

    With best regards.

    opened by jrean 11
  • Class 'Parkour\Transform' not found in /var/www/html/essence/lib/Essence/Di/Container.php on line 76

    Class 'Parkour\Transform' not found in /var/www/html/essence/lib/Essence/Di/Container.php on line 76

    <?php 
    
    spl_autoload_register(function($class) {
      $path = dirname( __FILE__ ).'/lib/'.str_replace('\\', '/', $class) . '.php';
      if (file_exists($path)) require $path;
    });
    
    require 'lib/Essence/Essence.php';
    
    error_reporting(-1);
    ini_set('display_errors', 'On');
    
    $Essence = new Essence\Essence();
    echo $Media = $Essence->extract('http://www.youtube.com/watch?v=39e3KYAmXK4');
    ?>
    

    Gives Me,

    Class 'Parkour\Transform' not found in /var/www/html/essence/lib/Essence/Di/Container.php on line 76
    

    Where i am wrong? :(

    question 
    opened by Ananth103 9
  • Performance

    Performance

    Hi guys, i need to generate multiples youtube embeds in one page(about 50 videos), and the performance is not good at all, there's a way of increase performance?

    opened by thiagomoraesp 8
  • Conflicting support for PHP 5.4 vs 7.0

    Conflicting support for PHP 5.4 vs 7.0

    Hi guys,

    Tag v2.5.2 does not work on PHP 7.0 because the "Null" class conflicts with reserved keywords in PHP 7.0. Tag 3.2.0 does not work on PHP 5.4 because of the use of "yield", which only appears since PHP 5.5.

    One of our (Chamilo) team members applied a patch to your branch 2.0 to support PHP 7.0. Not sure this is something you're interested in, but it would be great for us if you could include it so we could benefit from our lib and not require our users to support PHP 5.5 to upgrade to our new version.

    The solution is clean and seems to work well so far: https://github.com/jmontoyaa/essence/commits/jmontoyaa-patch-1

    I know about end of life of PHP 5.4 and all that. We just have a relatively non-technical target of people installing our portal in schools and stuff.

    enhancement 
    opened by ywarnier 8
  • Minimun PHP version

    Minimun PHP version

    Hi!

    I was trying to install Essence in my MediaTemple Gridserver and found that the latest PHP version it offers is 5.5.something, while Essence requires >=5.6.0 Is Essence currently using features from 5.6.0+, or you've set that requirement just because it's the latest PHP stable release? I've found that many other hosting providers are also missing PHP 5.6 support.

    Best regards, Gonzalo

    question 
    opened by chonz0 7
  • [Request] Support for

    [Request] Support for "maxresdefault" for YouTube videos

    Any chance to have support for this high resolution image? (e.g.: http://i.ytimg.com/vi/lDi9uFcD7XI/maxresdefault.jpg)

    BTW, loving Essence so far ;-) amazing work!

    Best regards, Gonzalo

    question 
    opened by chonz0 7
  • Exposing other methods

    Exposing other methods

    I’m interested in interacting with providers programatically without rebuilding the entire Collection service.

    A couple of things I’m trying to do:

    • List providers
    • Check URLs against providers

    It doesn’t appear to be possible to access the providers service instance within the current API. If I’m missing something let me know but I can’t figure out how to interact with these at present.

    What might be the approach for this?

    question 
    opened by joshuabaker 7
  • thumbnailUrl on Youtube urls

    thumbnailUrl on Youtube urls

    Hi,

    Thank you for your amazing work! Can you please provide me any guidelines to achieve my wish:

    When I use ->thumbnailUrl it returns something like "http://i1.ytimg.com/vi/youtube-video-id/hqdefault.jpg" As you can see, the default format of the thumbnail is "hqdefault.jpg". I don't know if you are aware of this but you can ask other format for exemple to get rid of the black borders "mqdefault.jpg"

    How can I ask ->thumbnailUrl to return such format?

    With best regards,

    J.

    enhancement 
    opened by jrean 7
  • Incorrect format used

    Incorrect format used

    Soundcloud is defined in the constructor like this:

                parent::__construct(
                        '#soundcloud\.com/[a-zA-Z0-9_]+/.+#i',
                        'http://soundcloud.com/oembed.json?url=%s',
                        self::json
                );
    

    However it seems to download XML version instead:

    http://soundcloud.com/oembed?url=http://soundcloud.com/forss/flickermood vs http://soundcloud.com/oembed?url=http://soundcloud.com/forss/flickermood&format=json

    due to this problem thumbnail-url gets into properties instead of thumbnail_url and also iframe is wrapped inside CDATA:

    thumbnail-url: http://i1.sndcdn.com/artworks-000030703701-n5da7c-t500x500.jpg?ca77017 html: ]]>

    SoundCloud should use json

    p.s. this was working fine yesterday, but something was changed by SoundCloud in their XML format of OEmbed.

    bug 
    opened by romaninsh 7
  • embed.ly and other providers

    embed.ly and other providers

    Firstly this is awesome and I love the way you code.

    Was wondering whether it would be possible to have embed.ly as a oembed provider. I have already done a few other oembed providers and will create a fork and then make a pull request.

    Also a heads up that I am integrating essence into Concrete5 as part of a package that I am developing.

    Cheers

    enhancement 
    opened by laughingwithu 6
  • php 8.1 compatibility

    php 8.1 compatibility

    Currently encountering fatal errors while using with php 8.1:

    ERROR php_swoole_server_rshutdown() (ERRNO 503): Fatal error: During inheritance of IteratorAggregate: Uncaught ErrorException: Return type of Essence\Media::getIterator() should either be compatible with IteratorAggregate::getIterator(): Traversable, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /var/www/site/vendor/essence/essence/lib/Essence/Media.php:259

    ERROR php_swoole_server_rshutdown() (ERRNO 503): Fatal error: During inheritance of JsonSerializable: Uncaught ErrorException: Return type of Essence\Media::jsonSerialize() should either be compatible with JsonSerializable::jsonSerialize(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /var/www/site/vendor/essence/essence/lib/Essence/Media.php:271

    opened by linuxd3v 1
  • Add docker compose test environment

    Add docker compose test environment

    For those of us who may not have a readily available local test environment, this PR adds php5.6 test runner using Docker Compose.

    To execute the standard test suite: docker-compose run test To execute the end to end test suite: docker-compose run e2e

    Example output:

    $ docker-compose run e2e
    > __exec_command: phpunit '-c' 'phpunit.e2e.xml' '-v'
    PHPUnit 5.7.27 by Sebastian Bergmann and contributors.
    
    Runtime:       PHP 5.6.40 with Xdebug 2.5.5
    Configuration: /app/phpunit.e2e.xml
    
    ........W......................................................  63 / 126 ( 50%)
    ..........SSSSS......S.S.S..S..SS...S....S.SS..SS..........S... 126 / 126 (100%)
    
    
    Time: 1.08 minutes, Memory: 22.00MB
    
    There was 1 warning:
    
    1) Essence\EssenceTest::testCrawlUrl
    PHPUnit_Framework_TestCase::getMock() is deprecated, use PHPUnit_Framework_TestCase::createMock() or PHPUnit_Framework_TestCase::getMockBuilder() instead
    
    --
    
    There were 18 skipped tests:
    
    1) ProvidersTest::testExtract with data set #1 ('500px', 'https://500px.com/photo/38873...azhiqi', 'title', 'oo')
    Unable to extract info from 'https://500px.com/photo/388736/oo-by-besim-mazhiqi'
    
    /app/tests/e2e/ProvidersTest.php:49
    
    2) ProvidersTest::testExtract with data set #2 ('App.net', 'https://alpha.app.net/chrifpa...hoto/1', 'authorName', '@chrifpa')
    Unable to extract info from 'https://alpha.app.net/chrifpa/post/33532003/photo/1'
    
    /app/tests/e2e/ProvidersTest.php:49
    
    3) ProvidersTest::testExtract with data set #3 ('Bambuser', 'http://bambuser.com/v/4740575', 'authorName', 'dancole')
    Unable to extract info from 'http://bambuser.com/v/4740575'
    
    /app/tests/e2e/ProvidersTest.php:49
    
    4) ProvidersTest::testExtract with data set #4 ('Bandcamp', 'http://jeanjean.bandcamp.com/...-phant', 'providerName', 'bandcamp')
    The value of 'providerName' ('@bandcamp') is not as expected ('bandcamp') when trying to extract info from 'http://jeanjean.bandcamp.com/track/coquin-l-l-phant'
    
    /app/tests/e2e/ProvidersTest.php:59
    
    5) ProvidersTest::testExtract with data set #5 ('CanalPlus', 'http://www.canalplus.fr/c-div...067507', 'providerName', 'Canalplus.fr')
    The value of 'providerName' ('myCANAL') is not as expected ('Canalplus.fr') when trying to extract info from 'http://www.canalplus.fr/c-divertissement/c-le-grand-journal/pid6831-connasse.html?vid=1067507'
    
    /app/tests/e2e/ProvidersTest.php:59
    
    6) ProvidersTest::testExtract with data set #12 ('DailyMile', 'http://www.dailymile.com/peop...297912', 'authorName', 'Ben W.')
    Unable to extract info from 'http://www.dailymile.com/people/ben/entries/29297912'
    
    /app/tests/e2e/ProvidersTest.php:49
    
    7) ProvidersTest::testExtract with data set #14 ('Dai.ly', 'http://dai.ly/x2091k1', 'authorName', 'Golden Moustache')
    Unable to extract info from 'http://dai.ly/x2091k1'
    
    /app/tests/e2e/ProvidersTest.php:49
    
    8) ProvidersTest::testExtract with data set #16 ('Dipity', 'http://www.dipity.com/multime...rdoch/', 'authorName', 'multimediajournalism')
    Unable to extract info from 'http://www.dipity.com/multimediajournalism/30-days-that-destroyed-the-House-of-Murdoch/'
    
    /app/tests/e2e/ProvidersTest.php:49
    
    9) ProvidersTest::testExtract with data set #19 ('Edocr', 'http://www.edocr.com/doc/1766...-guide', 'authorName', 'info_769')
    Unable to extract info from 'http://www.edocr.com/doc/176612/saint-petersburg-travellers-guide'
    
    /app/tests/e2e/ProvidersTest.php:49
    
    10) ProvidersTest::testExtract with data set #22 ('FunnyOrDie', 'http://www.funnyordie.com/vid...ey-you', 'title', 'Hey You')
    Unable to extract info from 'http://www.funnyordie.com/videos/75d77b0795/hey-you'
    
    /app/tests/e2e/ProvidersTest.php:49
    
    11) ProvidersTest::testExtract with data set #23 ('HowCast', 'http://www.howcast.com/videos...ecipes', 'title', 'How to Make an Alabama Slamme...owcast')
    The value of 'title' ('') is not as expected ('How to Make an Alabama Slammer | Howcast') when trying to extract info from 'http://www.howcast.com/videos/512882-How-to-Make-an-Alabama-Slammer-Shots-Recipes'
    
    /app/tests/e2e/ProvidersTest.php:59
    
    12) ProvidersTest::testExtract with data set #27 ('Ifttt', 'https://ifttt.com/recipes/987...-500px', 'title', 'Instagram to 500px')
    The value of 'title' ('Automatically share your Instagram posts on 500px') is not as expected ('Instagram to 500px') when trying to extract info from 'https://ifttt.com/recipes/98797-instagram-to-500px'
    
    /app/tests/e2e/ProvidersTest.php:59
    
    13) ProvidersTest::testExtract with data set #32 ('Meetup', 'http://www.meetup.com/France-...Group/', 'title', 'France HTML5 User Group')
    The value of 'title' ('Frontend Developer Meetup Paris') is not as expected ('France HTML5 User Group') when trying to extract info from 'http://www.meetup.com/France-HTML5-User-Group/'
    
    /app/tests/e2e/ProvidersTest.php:59
    
    14) ProvidersTest::testExtract with data set #34 ('Mobypicture', 'http://www.mobypicture.com/us...242008', 'authorName', 'Mathys van Abbe')
    Unable to extract info from 'http://www.mobypicture.com/user/mathys/view/242008'
    
    /app/tests/e2e/ProvidersTest.php:49
    
    15) ProvidersTest::testExtract with data set #35 ('Official.fm', 'http://www.official.fm/playlists/U2CP', 'authorName', 'Cameo Gallery')
    Unable to extract info from 'http://www.official.fm/playlists/U2CP'
    
    /app/tests/e2e/ProvidersTest.php:49
    
    16) ProvidersTest::testExtract with data set #38 ('Rdio', 'https://www.rdio.com/artist/S...known/', 'title', 'Superunknown')
    Unable to extract info from 'https://www.rdio.com/artist/Soundgarden/album/Superunknown/'
    
    /app/tests/e2e/ProvidersTest.php:49
    
    17) ProvidersTest::testExtract with data set #39 ('Screenr', 'http://www.screenr.com/A7ks', 'authorName', 'elearning')
    Unable to extract info from 'http://www.screenr.com/A7ks'
    
    /app/tests/e2e/ProvidersTest.php:49
    
    18) ProvidersTest::testExtract with data set #50 ('Vine', 'https://vine.co/v/MdnPb5ivU52', 'description', 'Vine by Renee Derr')
    The value of 'description' ('') is not as expected ('Vine by Renee Derr') when trying to extract info from 'https://vine.co/v/MdnPb5ivU52'
    
    /app/tests/e2e/ProvidersTest.php:59
    
    WARNINGS!
    Tests: 126, Assertions: 145, Warnings: 1, Skipped: 18.
    
    opened by solocommand 0
  • Add JWPlayer support

    Add JWPlayer support

    JWPlayer doesn't have a native oEmbed endpoint, but they do have a public JSON api. This PR adds an implementation for JWPlayer to support building out oEmbed data from that API.

    JWPlayer docs Example URL

    opened by solocommand 0
  • Add Libsyn special provider

    Add Libsyn special provider

    For reasons I can't quite discern, Libsyn' oEmbed URL isn't detected as a regular oEmbed provider. This patch adds Libsyn as a registered special provider.

    Example Libsyn oEmbed URL: https://oembed.libsyn.com/embed?item_id=8634992

    Per Libsyn support:

    The url's absolutely do support oEmbed spec correctly - they wouldn't work with Embed.ly otherwise. You could always try just using the embed code for the player directly in your new site instead of the oEmbed. Most of the 'testers' out there seem to be looking for the metatags for discovery: https://oembed.com/#section4 and not actually parsing the response.

    Tested with the oEmbed plugin, which uses Essence to render oEmbed in Craft CMS.

    I'd love to understand what is needed to address this as a regular oEmbed provider, but I'm not entirely sure that the discovery method above is what is stopping Essence from parsing.

    I did notice that the Libsyn oEmbed link type is text/json+oembed, whereas the spec denotes application/json+oembed. Essence seems to search specifically forjson in the type field though, from what I can see (in Oembed.php line 214's string filter), which seems like it should work?

    My PHP is a little rusty, so... :) At any rate, this patch seems to work fine, and happy to help test or report to Libsyn why their file isn't working with the default Essence code.

    opened by rtgoodwin 3
  • Add permalink.php, photo.php FacebookPost support

    Add permalink.php, photo.php FacebookPost support

    Add FacebookPost support for url like photo.php and permalink.php Examples: https://www.facebook.com/photo.php?fbid=2071641476382993&set=a.1546936945520118.1073741829.100006114824847&type=3&theater

    https://www.facebook.com/permalink.php?story_fbid=457794347977739&id=100012415323608

    enhancement 
    opened by Somethingideally 0
Releases(3.5.4)
Owner
Essence
A library to extract information from web pages.
Essence
All in one Video Downloader - Download videos from facebook twitter youtube tiktok and 1000+ other sites .. made by Vijay Kumar

VKRdownloader Video Downloader by @TherealVKR Vijay Kumar .... Download Video From YouTube , Facebook , Twitter , Instagram , TikTok , And 1000+ Other

Vijay Kumar 35 Dec 29, 2022
Michael Pratt 307 Dec 23, 2022
🖍 Write beautiful blog articles using Markdown inside your Laravel app.

Blogged Write beautiful blog articles using Markdown inside your Laravel app. Blogged ?? Blogged is a carefully designed Laravel package provides an e

Saleem Hadad 131 Dec 16, 2022
Arc youtube - Youtube plugin for Textpattern

arc_youtube A Textpattern plugin for easily embedding Youtube videos in pages using a customisable player. This plugin works well with arc_vimeo and o

Andy Carter 5 May 17, 2018
This package provides a simple and intuitive way to work on the Youtube Data API. It provides fluent interface to Youtube features.

Laravel Youtube Client This package provides a simple and intuitive way to work on the Youtube Data API. It provides fluent interface to Youtube featu

Tilson Mateus 6 May 31, 2023
Run your WP site on github pages, php innovation award winner https://www.phpclasses.org/package/12091-PHP-Make-a-WordPress-site-run-on-GitHub-pages.html

Gitpress Run wordpress directly on github pages Gitpress won the innovation award for may 2021 Read more about this https://naveen17797.github.io/gitp

naveen 13 Nov 18, 2022
A Magento 2 module that allows for creating discrete PDP (Product Detail Pages) page layouts for customers landing on the site from a PPC (Pay Per Click) link/ad by allowing routing to the same pages using a `/ppc/` prefix in the URL path.

A Magento 2 module that allows for creating discrete PDP (Product Detail Pages) page layouts for customers landing on the site from a PPC (Pay Per Click) link/ad by allowing routing to the same pages using a `/ppc/` prefix in the URL path.

null 16 Nov 11, 2022
Create a web service for discussion and comments of articles.

Test technique But Créer un service web de discussion et de commentaires d’articles. Fonctionnalités Les fonctionnalités attendus sont les suivantes :

Mathieu Ledru 1 Feb 8, 2022
TXP-Tweet - arc twitter - Twitter-Textpattern integration

TXP Tweet This is TXP Tweet, a collection of Textpattern plugins for Twitter integration. TXP Tweet consists of two plugins: arc_twitter (the core Tex

Andy Carter 11 Sep 20, 2021
Create Youtube-Like IDs With PHP.

AlphaID Install composer require sy-records/alphaid Usage

沈唁 4 Mar 31, 2022
A small PHP library to generate YouTube-like ids from numbers.

A small PHP library to generate YouTube-like ids from numbers. Use it when you don't want to expose your database ids to the user.

Vincent Klaiber 4.9k Dec 30, 2022
A customizable decentralized micro-blog (Twitter) and cms (Wordpress) that only you host and moderate.

Consider this --> each Miter account is individually hosted on a user's personal and private third party server (host) - either purchased or free - as

Vije Miller 3 Jun 8, 2022
CRUD Build a system to insert student name information, grade the class name, and edit and delete this information

CRUD Build a system to insert student name information, grade the class name, and edit and delete this information

Sajjad 2 Aug 14, 2022
A curated list of awesome Laravel bookmarks, packages, tools, articles, tutorials and related resources.

ATTENTION: This list is obsolete and discontinued. Please find a much more comprehensive, much more well-maintained awesome-laravel list at chiraggude

Unnawut Leepaisalsuwanna 96 Aug 5, 2022
🎓 Collection of useful PHP frequently asked questions, articles and best practices

PHP.earth documentation These files are available online at PHP.earth. Contributing and license We are always looking forward to see your contribution

PHP.earth 278 Dec 27, 2022
Enable Facebook Instant Articles on your WordPress site.

Instant Articles for WP Enable Instant Articles for Facebook on your WordPress site. Plugin activity Description This plugin adds support for Instant

Automattic 633 Nov 21, 2022
Laravel Blog Package. Easiest way to add a blog to your Laravel website. A package which adds wordpress functionality to your website and is compatible with laravel 8.

Laravel Blog Have you worked with Wordpress? Developers call this package wordpress-like laravel blog. Give our package a Star to support us ⭐ ?? Inst

Binshops 279 Dec 28, 2022
Magento 2 Blog Extension - FREE, fully featured, powerful Blog solution for your online store!

Blog MX | Magento 2 Blog Module by Mirasvit FREE, fully featured, powerful Blog solution for your online store! Magento 2 Blog MX allows you to open a

Mirasvit 71 Dec 7, 2022