TemplateLayouts
3 weeks ago
AirTable.php
1 year ago
Boomplay.php
1 year ago
Calendly.php
2 years ago
Canva.php
1 year ago
FITE.php
1 year ago
GettyImages.php
9 months ago
Giphy.php
2 years ago
GitHub.php
2 years ago
GoogleCalendar.php
7 months ago
GoogleDocs.php
2 years ago
GoogleDrive.php
2 years ago
GoogleMaps.php
2 years ago
GooglePhotos.php
3 months ago
Gumroad.php
2 years ago
InstagramFeed.php
3 weeks ago
LinkedIn.php
2 years ago
Meetup.php
5 months ago
NRKRadio.php
2 years ago
OneDrive.php
10 months ago
OpenSea.php
9 months ago
SelfHosted.php
1 month ago
Spreaker.php
1 year ago
TikTok.php
2 years ago
Twitch.php
2 years ago
Wistia.php
3 months ago
Wrapper.php
2 years ago
X.php
2 years ago
Youtube.php
3 weeks ago
index.html
7 years ago
OneDrive.php
131 lines
| 1 | <?php |
| 2 | |
| 3 | namespace EmbedPress\Providers; |
| 4 | |
| 5 | use Embera\Provider\ProviderAdapter; |
| 6 | use Embera\Provider\ProviderInterface; |
| 7 | use Embera\Url; |
| 8 | |
| 9 | (defined('ABSPATH') && defined('EMBEDPRESS_IS_LOADED')) or die("No direct script access allowed."); |
| 10 | |
| 11 | /** |
| 12 | * OneDrive provider for EmbedPress. |
| 13 | * |
| 14 | * @package EmbedPress |
| 15 | * @subpackage EmbedPress/Providers |
| 16 | * @author EmbedPress |
| 17 | * @license GPLv3 or later |
| 18 | * @since 1.0.0 |
| 19 | */ |
| 20 | class OneDrive extends ProviderAdapter implements ProviderInterface |
| 21 | { |
| 22 | protected static $hosts = ["onedrive.live.com", "1drv.ms"]; |
| 23 | |
| 24 | /** |
| 25 | * Validates if the URL belongs to OneDrive. |
| 26 | * |
| 27 | * @param Url $url |
| 28 | * @return bool |
| 29 | */ |
| 30 | public function validateUrl(Url $url) |
| 31 | { |
| 32 | return (bool) preg_match( |
| 33 | '~https?:\/\/(?:onedrive\.live\.com|1drv\.ms)\/(?:embed|redir|w\/c)?\/?(?:[^\/]*\/)*([^\/]+)~i', |
| 34 | (string) $url |
| 35 | ); |
| 36 | } |
| 37 | |
| 38 | |
| 39 | /** |
| 40 | * Determines the appropriate iframe src for the given URL. |
| 41 | * |
| 42 | * @param string $url |
| 43 | * @return string|null |
| 44 | */ |
| 45 | private function getIframeSrc(string $url): ?string |
| 46 | { |
| 47 | // CASE 1: All 1drv.ms embed styles — including /w/s!abc123 or /w/c/abc123 or /p/c/x/y |
| 48 | if (preg_match('~https?://1drv\.ms/[a-z]+/[a-z0-9!_-]+(?:/[^?\s]*)?~i', $url)) { |
| 49 | return $this->appendEmbedParam($url); |
| 50 | } |
| 51 | |
| 52 | // CASE 2: Short link like /w/abc123 → convert to /w/c/abc123 |
| 53 | if (preg_match('~https?://1drv\.ms/([a-z]+)/([a-zA-Z0-9_-]+)$~i', $url, $matches)) { |
| 54 | return "https://1drv.ms/{$matches[1]}/c/{$matches[2]}?embed=1&em=2"; |
| 55 | } |
| 56 | |
| 57 | // CASE 3: SharePoint or OneDrive full link |
| 58 | if (preg_match('~https?://(?:onedrive\.live\.com|[\w.-]+\.sharepoint\.com)/.*?(?:resid=|id=|file/)([^&?/]+)(?:&authkey=([^&]+))?~i', $url, $matches)) { |
| 59 | $fileId = $matches[1]; |
| 60 | $authKey = $matches[2] ?? ''; |
| 61 | $iframeSrc = "https://1drv.ms/w/c/$fileId"; |
| 62 | |
| 63 | if ($authKey) { |
| 64 | $iframeSrc .= "?authkey=$authKey"; |
| 65 | } |
| 66 | |
| 67 | return $this->appendEmbedParam($iframeSrc); |
| 68 | } |
| 69 | |
| 70 | return null; |
| 71 | } |
| 72 | |
| 73 | |
| 74 | /** |
| 75 | * Appends ?em=2 or &em=2 to a URL if not already present. |
| 76 | * |
| 77 | * @param string $url |
| 78 | * @return string |
| 79 | */ |
| 80 | private function appendEmbedParam(string $url): string |
| 81 | { |
| 82 | if (strpos($url, 'em=') !== false) { |
| 83 | return $url; |
| 84 | } |
| 85 | |
| 86 | return $url . (strpos($url, '?') === false ? '?em=2' : '&em=2'); |
| 87 | } |
| 88 | |
| 89 | /** |
| 90 | * Generates a fake oEmbed response. |
| 91 | * |
| 92 | * @return array |
| 93 | */ |
| 94 | public function fakeResponse() |
| 95 | { |
| 96 | $srcUrl = urldecode($this->url); |
| 97 | $iframeSrc = $this->getIframeSrc($srcUrl); |
| 98 | |
| 99 | if (!$iframeSrc) { |
| 100 | return []; |
| 101 | } |
| 102 | |
| 103 | $width = $this->config['maxwidth'] ?? 600; |
| 104 | $height = $this->config['maxheight'] ?? 450; |
| 105 | |
| 106 | return [ |
| 107 | 'type' => 'rich', |
| 108 | 'provider_name' => 'OneDrive', |
| 109 | 'provider_url' => 'https://onedrive.live.com', |
| 110 | 'title' => 'OneDrive Document', |
| 111 | 'html' => sprintf( |
| 112 | '<iframe title="OneDrive Document" width="%d" height="%d" src="%s" frameborder="0" scrolling="no"></iframe>', |
| 113 | esc_attr($width), |
| 114 | esc_attr($height), |
| 115 | esc_url($iframeSrc) |
| 116 | ), |
| 117 | ]; |
| 118 | } |
| 119 | |
| 120 | /** |
| 121 | * Fallback for modifyResponse, returns fakeResponse. |
| 122 | * |
| 123 | * @param array $response |
| 124 | * @return array |
| 125 | */ |
| 126 | public function modifyResponse(array $response = []) |
| 127 | { |
| 128 | return $this->fakeResponse(); |
| 129 | } |
| 130 | } |
| 131 |