' . "\n"; return $head; } /** * annoncer le service oembed dans le head des pages publiques * * @param string $head * @return string */ function oembed_insert_head($head){ if (lire_config('oembed/inserer_head')=='non'){ return $head; } $service = 'oembed.api/'; $ins = '" />' . "\n"; /* $ins .= '" />'."\n"; */ $ins = "$ins"; return $head . $ins; } /** * Generer un apercu pour les oembed sur le formulaire d'edition document * @param $flux * @return */ function oembed_formulaire_charger($flux){ if ($flux['args']['form']=='editer_document'){ if ($flux['data']['oembed'] and !isset($flux['data']['apercu'])){ $flux['data']['_inclus'] = 'embed'; } } return $flux; } /** * Inserer une explication dans le form d'upload * @param $flux * @return array */ function oembed_recuperer_fond($flux){ if ($flux['args']['fond'] === 'formulaires/inc-upload_document') { include_spip('inc/oembed'); $providers = oembed_lister_providers(); $hosts = array(); foreach ($providers as $scheme => $endpoint){ $h = parse_url($scheme, PHP_URL_HOST); $hosts[trim(preg_replace(',^(\*|www)\.,i', '', $h))] = true; } $hosts = implode(', ', array_keys($hosts)); $i = _T('oembed:explication_upload_url', array('hosts' => $hosts)); $i = "

$i

"; $flux['data']['texte'] = str_replace($t = '', $t . $i, $flux['data']['texte']); } elseif ($flux['args']['fond'] === 'modeles/document_case') { $infos_doc = sql_fetsel('id_document, mode, media, oembed', 'spip_documents', 'id_document=' . intval($flux['args']['contexte']['id_document'])); if ($infos_doc and in_array($infos_doc['media'], array('video', 'audio')) and ($infos_doc['mode']=='document') and (strlen($infos_doc['oembed'])>1)){ $info_vignette = '' . _T('medias:info_inclusion_vignette') . ''; $flux['data']['texte'] = str_replace("
", "
" . $info_vignette, $flux['data']['texte']); $raccourci = "
" . _T('medias:info_inclusion_directe') . '' . affiche_raccourci_doc('emb', $infos_doc['id_document'], 'left') . affiche_raccourci_doc('emb', $infos_doc['id_document'], 'center') . affiche_raccourci_doc('emb', $infos_doc['id_document'], 'right') . '
'; $flux['data']['texte'] = str_replace('
'image', 'video' => 'video', 'sound' => 'audio'); include_spip('inc/config'); include_spip('inc/oembed'); // on tente de récupérer les données oembed if ($data = oembed_recuperer_data($flux['source'], null, null, 'json', 'non', true)){ // si on a recupere une URL c'est direct un doc distant if (isset($data['url']) and $data['type']!=='rich' // on recupere les infos du document distant and $doc = recuperer_infos_distantes($data['url'])){ unset($doc['body']); $doc['distant'] = 'oui'; $doc['mode'] = 'document'; // garder la trace de la copie locale le cas echeant if (!empty($doc['fichier'])) { $doc['copie_locale'] = $doc['fichier']; } $doc['fichier'] = set_spip_doc($data['url']); // et on complète par les infos oembed $doc['oembed'] = $flux['source']; $doc['titre'] = $data['title']; // mettre le lien dans le descriptif ? //if (isset($data['web_page'])) { // $doc['titre'] = '['.$doc['titre'].'->'.$data['web_page'].']'; //} $doc['credits'] = $data['author_name']; if (isset($data['author_url'])){ $doc['credits'] = '[' . $doc['credits'] . '->' . $data['author_url'] . ']'; } if (isset($data['media'])){ $doc['media'] = $data['media']; } elseif (isset($medias[$data['type']])) { $doc['media'] = $medias[$data['type']]; } return $doc; } elseif (isset($data['html']) or $data['type']=='link') { if ($data['type']=='link'){ $data['html'] = '' . sinon($data['title'], $flux['source']) . ''; } // créer une copie locale du contenu html // cf recuperer_infos_distantes() // generer un nom de fichier unique : on l'index sur l'id du prochain document + uniqid $id = sql_getfetsel('id_document', 'spip_documents', '', '', 'id_document DESC', '0,1'); include_spip('inc/acces'); $id = "id$id-" . creer_uniqid(); $id = substr(md5($id), 0, 7); $doc['fichier'] = _DIR_RACINE . nom_fichier_copie_locale($flux['source'], 'html'); $doc['fichier'] = preg_replace(',\.html$,i', "-$id.html", $doc['fichier']); ecrire_fichier($doc['fichier'], $data['html']); // set_spip_doc() pour récupérer le chemin du fichier relatif a _DIR_IMG $doc['fichier'] = set_spip_doc($doc['fichier']); $doc['extension'] = 'html'; $doc['taille'] = strlen($data['html']); # a peu pres $doc['distant'] = 'non'; $doc['mode'] = 'document'; $doc['oembed'] = $flux['source']; $doc['titre'] = $data['title']; // mettre le lien dans le descriptif ? //if (isset($data['web_page'])) { // $doc['titre'] = '['.$doc['titre'].'->'.$data['web_page'].']'; //} $doc['credits'] = $data['author_name']; if (isset($data['author_url'])){ $doc['credits'] = '[' . $doc['credits'] . '->' . $data['author_url'] . ']'; } if (isset($data['media'])){ $doc['media'] = $data['media']; } elseif (isset($medias[$data['type']])) { $doc['media'] = $medias[$data['type']]; } return $doc; } } return $flux; } /** * attacher la vignette si disponible pour les documents oembed * on les reconnait via la presence d'un oembed non vide * on relance un appel a oembed_recuperer_data qui a garde la requete precendente en cache * * @param array $flux * @return array */ function oembed_post_edition($flux){ if ( isset($flux['args']['action']) and $flux['args']['action']=='ajouter_document' and !empty($flux['data']['oembed']) ){ $id_document = $flux['args']['id_objet']; if ($data = oembed_recuperer_data($flux['data']['oembed'])){ // vignette disponible ? la recupérer et l'associer au document if ((isset($data['thumbnail_url']) and $v = $data['thumbnail_url']) or (isset($data['image']) and $v = $data['image']) ){ spip_log('ajout de la vignette ' . $v . ' pour ' . $flux['data']['oembed'], 'oembed.' . _LOG_DEBUG); // cf formulaires_illustrer_document_traiter_dist() $ajouter_documents = charger_fonction('ajouter_documents', 'action'); $files = false; // lorsqu'une vignette ne comporte pas d'extension, on cherche l'extension en lisant le fichier $name = basename($v); $name = explode('?', $name); $name = reset($name); if (!preg_match(',\.\w+$,', $name)){ if (!function_exists('recuperer_infos_distantes')){ include_spip('inc/distant'); } // si on peut trouver une extension utilisons la if ($infov = recuperer_infos_distantes($v) and !empty($infov['extension'])){ spip_log("URL " . $flux['data']['oembed'] . " vignette $v sans extension : extension detecteee -> " . $infov['extension'], 'oembed.' . _LOG_DEBUG); $name .= "." . $infov['extension']; } } if (preg_match(',^(\w+:)?//,', $v)){ $files = array( array( 'name' => $name, 'tmp_name' => $v, 'distant' => true, ) ); } elseif (file_exists($v)) { $files = array(array( 'name' => $name, 'tmp_name' => $v )); } if ($files and $ajoute = action_ajouter_documents_dist('new', $files, '', 0, 'vignette') and intval(reset($ajoute))){ $id_vignette = reset($ajoute); include_spip('action/editer_document'); document_modifier($id_document, array('id_vignette' => $id_vignette)); } } else { spip_log('pas de vignette pour ' . $flux['data']['oembed'], 'oembed.' . _LOG_DEBUG); } } } return $flux; } /** * Transformation auto des liens vers contenu oembed correspondant : trop la classe * * @param string $texte * @return mixed */ function oembed_pre_propre($texte){ include_spip('inc/config'); // si oembed/embed_auto==oui on oembed les liens qui sont tous seuls sur une ligne // (mais jamais les liens inline dans le texte car ca casse trop l'ancien contenu) if (stripos($texte, ']*>[^\r\n]*) *((?:\r?\n\r?\n)|$),Uims", trim($texte), $matches, PREG_SET_ORDER); if (count($matches)){ $replace = array(); include_spip('inc/oembed'); foreach ($matches as $match){ if (!isset($replace[$match[0]]) and preg_match(',\bauto\b,', extraire_attribut($match[2], 'class')) and !is_null($emb = oembed_embarquer_lien($match[2]))){ if ($wrap_embed_html = charger_fonction('wrap_embed_html', 'inc', true)){ $emb = $wrap_embed_html($match[2], $emb); } $replace[$match[0]] = $match[1] . echappe_html("$emb") . $match[3]; } } if (count($replace)){ $texte = str_replace(array_keys($replace), array_values($replace), $texte); } } } return $texte; } /** * pipeline pour typo * pour traitement des ressources en SPIP 3.1 * @param $t * @return mixed */ function oembed_post_typo($t){ if (strpos($t, '<')!==false){ $t = preg_replace_callback(_EXTRAIRE_RESSOURCES, 'traiter_ressources', $t); } return $t; } /** * pipeline pour propre * pour traitement des ressources en SPIP 3.1 * @param $t * @return mixed */ function oembed_pre_liens($t){ if (strpos($t, '<')!==false){ $t = preg_replace_callback(_EXTRAIRE_RESSOURCES, 'traiter_ressources', $t); // echapper les autoliens eventuellement inseres (en une seule fois) if (strpos($t, '')!==false){ $t = echappe_html($t); } } return $t; } function oembed_declarer_tables_interfaces($interfaces){ $interfaces['table_des_traitements']['CREDITS']['documents'] = 'PtoBR(' . _TRAITEMENT_RACCOURCIS . ')'; return $interfaces; } include_spip('inc/config'); if (!function_exists('lire_config')){ function lire_config($a = null, $b = null){ return $b; } }