This is an automated email from the ASF dual-hosted git repository.
tballison pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git
The following commit(s) were added to refs/heads/main by this push:
new 119448b204 TIKA-5029: Asx texinfo parsing (#3591)
119448b204 is described below
commit 119448b2046764b7cb17f29147e08ec841c9dc5c
Author: Tim Allison <[email protected]>
AuthorDate: Mon Nov 9 17:12:36 2026 -0500
TIKA-5029: Asx texinfo parsing (#3591)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
---
CHANGES.txt | 4 ++++
docs/modules/ROOT/partials/supported-formats.adoc | 1 +
.../org/apache/tika/mime/tika-mimetypes.xml | 1 +
.../apache/tika/parser/AutoDetectParserTest.java | 28 ++++++++++++++++++++++
.../org/apache/tika/parser/html/JSoupParser.java | 4 +++-
5 files changed, 37 insertions(+), 1 deletion(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index b8dab5dccd..3718dad971 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -104,6 +104,10 @@ Release 4.3.0 - ???
EXTRACTION AND FORMATS
+ * ASX playlists (application/x-ms-asx) are parsed by JSoupParser; XMLParser
failed on
+ many real ones (mixed-case or unclosed tags, raw '&', non-UTF-8 without a
declaration).
+ Texinfo files are parsed as text; they produced no content (TIKA-5029).
+
* ISO-2022-JP is decoded as x-windows-50221, so NEC/IBM extension
characters (circled
numbers, Roman numerals) no longer become U+FFFD. ISO-8859-1, ISO-8859-9,
TIS-620 and
ISO-8859-11 decode as windows-1252, windows-1254 and windows-874, as
browsers do, when a
diff --git a/docs/modules/ROOT/partials/supported-formats.adoc
b/docs/modules/ROOT/partials/supported-formats.adoc
index 0f017d6b7c..6d7071db7c 100644
--- a/docs/modules/ROOT/partials/supported-formats.adoc
+++ b/docs/modules/ROOT/partials/supported-formats.adoc
@@ -98,6 +98,7 @@
** `application/vnd.mozilla.xul+xml`
** `application/vnd.wap.xhtml+xml`
** `application/x-asp`
+** `application/x-ms-asx`
** `application/xhtml+xml`
** `text/html`
* `org.apache.tika.parser.http.`
link:{tika-javadoc-url}/org/apache/tika/parser/http/HttpParser.html[HttpParser]
diff --git
a/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
b/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
index d3079faabe..f2f793daab 100644
--- a/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
+++ b/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
@@ -6378,6 +6378,7 @@
</magic>
<glob pattern="*.texinfo"/>
<glob pattern="*.texi"/>
+ <sub-class-of type="text/plain"/>
</mime-type>
<mime-type type="application/x-tex-virtual-font">
<_comment>TeX Virtual Font format</_comment>
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/parser/AutoDetectParserTest.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/parser/AutoDetectParserTest.java
index 4e96457028..eac7aad0a3 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/parser/AutoDetectParserTest.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/parser/AutoDetectParserTest.java
@@ -401,6 +401,34 @@ public class AutoDetectParserTest extends TikaTest {
Arrays.asList(m.getValues(TikaCoreProperties.TIKA_PARSED_BY)));
}
+ @Test
+ public void testMalformedAsx() throws Exception {
+ // shapes from Common Crawl: no declaration, windows-1252, raw '&',
unclosed REF, mixed case
+ String asx = "<ASX version=\"3.0\">\n<TITLE>Café radio</TITLE>\n"
+ + "<AUTHOR>TBS RADIO & COMMUNICATIONS,Inc.</AUTHOR>\n<Entry>\n"
+ + "<REF
HREF=\"mms://example.com/news/clip.wmv\">\n</ENTRY>\n</asx>\n";
+ Metadata m = new Metadata();
+ XMLResult r = getXML(TikaInputStream.get(asx.getBytes("windows-1252")),
+ AUTO_DETECT_PARSER, m);
+ assertEquals("application/x-ms-asx", m.get(HttpHeaders.CONTENT_TYPE));
+ assertContains("Café radio", r.xml);
+ assertContains("TBS RADIO & COMMUNICATIONS", r.xml);
+ assertContains(JSoupParser.class.getName(),
+ Arrays.asList(m.getValues(TikaCoreProperties.TIKA_PARSED_BY)));
+ }
+
+ @Test
+ public void testTexinfoIsText() throws Exception {
+ String texi = "\\input texinfo\n@setfilename diff.info\n"
+ + "@settitle Comparing and Merging Files\n@bye\n";
+ Metadata m = new Metadata();
+ m.set(TikaCoreProperties.RESOURCE_NAME_KEY, "diff.texi");
+ String text = getText(TikaInputStream.get(texi.getBytes(UTF_8)),
AUTO_DETECT_PARSER, m);
+
assertTrue(m.get(HttpHeaders.CONTENT_TYPE).startsWith("application/x-texinfo"),
+ m.get(HttpHeaders.CONTENT_TYPE));
+ assertContains("Comparing and Merging Files", text);
+ }
+
@Test
public void testZeroByteFileException() throws Exception {
String[] exts = new String[]{"xls", "doc", "pdf", "rtf"};
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/JSoupParser.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/JSoupParser.java
index 4a1c783cfe..5e5da5456b 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/JSoupParser.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/JSoupParser.java
@@ -89,9 +89,11 @@ public class JSoupParser extends
AbstractEncodingDetectorParser {
private static final MediaType X_ASP = MediaType.application("x-asp");
// XUL leans on entities from chrome:// DTDs, which strict XML parsing
rejects
private static final MediaType XUL =
MediaType.application("vnd.mozilla.xul+xml");
+ // ASX playlists are rarely well-formed: mixed-case tags, unclosed REFs,
raw '&', no declaration
+ private static final MediaType ASX = MediaType.application("x-ms-asx");
private static final Set<MediaType> SUPPORTED_TYPES =
Collections.unmodifiableSet(
- new HashSet<MediaType>(Arrays.asList(MediaType.text("html"),
XHTML, WAP_XHTML, X_ASP, XUL)));
+ new HashSet<MediaType>(Arrays.asList(MediaType.text("html"),
XHTML, WAP_XHTML, X_ASP, XUL, ASX)));
private static final TagSet SELF_CLOSEABLE_TAGS = TagSet.Html();