From 258371e1d85d205a1976cb627fc96d4e22edd781 Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Mon, 5 Mar 2007 22:41:36 +0000
Subject: [PATCH] meilleure heuristique de detection des formats pour les
 documents distants (avec plein de BoOz et d'Alexandra dedans)

---
 ecrire/base/typedoc.php |  3 +++
 ecrire/inc/distant.php  | 38 +++++++++++++++++++++++++++++---------
 2 files changed, 32 insertions(+), 9 deletions(-)

diff --git a/ecrire/base/typedoc.php b/ecrire/base/typedoc.php
index 9742da521a..37b00f22ca 100644
--- a/ecrire/base/typedoc.php
+++ b/ecrire/base/typedoc.php
@@ -199,6 +199,9 @@ $tables_mime = array(
 
 
 	$mime_alias = array (
+		'audio/x-mpeg' => 'audio/mpeg',
+		'application/x-ogg' => 'application/ogg',
+		'video/mp4' => 'application/mp4',
 		'video/flv' => 'video/x-flv'
 	);
 
diff --git a/ecrire/inc/distant.php b/ecrire/inc/distant.php
index fe6b29fd4b..1fdfec99ee 100644
--- a/ecrire/inc/distant.php
+++ b/ecrire/inc/distant.php
@@ -316,19 +316,39 @@ function recuperer_infos_distantes($source, $max=0) {
 	// ca echoue l'utilisateur devra les entrer...
 	if ($headers = recuperer_page($source, false, true, $max)) {
 		list($headers, $a['body']) = split("\n\n", $headers, 2);
-		$t = preg_match(",\nContent-Type: *([^[:space:];]*),i",
-				"\n$headers", $regs);
-		if ($t) {
-			$mime_type = (trim($regs[1]));
 
-			// Appliquer les alias
-			while (isset($mime_alias[$mime_type]))
-				$mime_type = $mime_alias[$mime_type];
+		if (preg_match(",\nContent-Type: *([^[:space:];]*),i", "\n$headers", $regs))
+			$mime_type = (trim($regs[1]));
+		else
+			$mime_type = ''; // inconnu
+
+		// Appliquer les alias
+		while (isset($mime_alias[$mime_type]))
+			$mime_type = $mime_alias[$mime_type];
+
+		// Si on a text/plain, c'est peut-etre que le serveur ne sait pas
+		// ce qu'il sert ; on va tenter de detecter via l'extension de l'url
+		$t = null;
+		if (($mime_type == 'text/plain' OR $mime_type == '')
+		AND preg_match(',\.([a-z0-9]+)(\?.*)?$,', $source, $rext)) {
+			$t = spip_fetch_array(spip_query("SELECT id_type,extension FROM spip_types_documents WHERE extension=" . _q($rext[1])));
+		}
 
+		// Autre mime/type (ou text/plain avec fichier d'extension inconnue)
+		if (!$t)
 			$t = spip_fetch_array(spip_query("SELECT id_type,extension FROM spip_types_documents WHERE mime_type=" . _q($mime_type)));
+
+		// Toujours rien ? (ex: audio/x-ogg au lieu de application/ogg)
+		// On essaie de nouveau avec l'extension
+		if (!$t
+		AND $mime_type != 'text/plain'
+		AND preg_match(',\.([a-z0-9]+)(\?.*)?$,', $source, $rext)) {
+			$t = spip_fetch_array(spip_query("SELECT id_type,extension FROM spip_types_documents WHERE extension=" . _q($rext[1])));
 		}
+
+
 		if ($t) {
-			spip_log("mime-type $mime_type ok");
+			spip_log("mime-type $mime_type ok, extension ".$t['extension']);
 			$a['id_type'] = $t['id_type'];
 			$a['extension'] = $t['extension'];
 		} else {
@@ -347,7 +367,7 @@ function recuperer_infos_distantes($source, $max=0) {
 
 	// Echec avec HEAD, on tente avec GET
 	if (!$a AND !$max) {
-	spip_log("tente $source");
+		spip_log("tenter GET $source");
 		$a = recuperer_infos_distantes($source, 1024*1024);
 	}
 
-- 
GitLab