Skip to content
Extraits de code Groupes Projets

Comparer les révisions

Les modifications sont affichées comme si la révision source était fusionnée avec la révision cible. En savoir plus sur la comparaison des révisions.

Source

Sélectionner le projet cible
No results found

Cible

Sélectionner le projet cible
  • spip/medias
  • pierre.laszczak/medias
  • cy.altern/medias
  • MathieuAlphamosa/medias
  • taffit/medias
  • RealET/medias
  • johan/medias
  • Yohooo/medias
  • pierretux/medias
  • placido/medias
  • JLuc/medias
11 résultats
Afficher les modifications
Validations sur la source (37)
Affichage de
avec 362 ajouts et 111 suppressions
/.editorconfig export-ignore
/.gitattributes export-ignore
/.gitignore export-ignore
/phpcs.xml.dist export-ignore
/phpstan.neon.dist export-ignore
/phpstan-baseline.neon export-ignore
/rector.php export-ignore
/tests export-ignore
# Changelog
## [Unreleased]
## Unreleased
### Fixed
- #4952 HTML mal formé sur modeles/document_desc.html
## 4.1.3 - 2023-10-05
### Fixed
- #4931 Normaliser `autoriser_document_voir()` pour retourner toujours un booleen
- #4941 Compléter le jeu d’icones pour certains types de documents
- #4946 Affichage des puces statut des documents dans la médiathèque
- #4944 Ne pas appliquer 2 fois les traitements typo sur les titres, descriptifs et crédits de document
## 4.1.2 - 2023-09-01
### Fixed
- #4937 Éviter une fatale sur media_determine_autolien avec des tailles nulles
- Exclure les tests et fichiers de développement des livrables
- spip/spip#3637 Lever l'ambiguité sur les balises simples des `url()`
## 4.1.1 - 2023-06-07
### Security
- spip-team/securite#4841 Limiter l’usage de `#ENV**` dans les formulaires.
### Changed
- Utiliser `spip_livrer_fichier()` pour envoyer les fichiers (refactor)
## 4.1.0 - 2023-01-27
### Added
......
......@@ -89,42 +89,23 @@ function action_acceder_document_dist() {
break;
default:
header('Content-Type: ' . $doc['mime_type']);
// pour les images ne pas passer en attachment
// sinon, lorsqu'on pointe directement sur leur adresse,
// le navigateur les downloade au lieu de les afficher
include_spip('inc/livrer_fichier');
$options = ['attachment' => false];
if ($doc['inclus'] == 'non') {
$options['attachment'] = true;
// Si le fichier a un titre avec extension,
// ou si c'est un nom bien connu d'Unix, le prendre
// sinon l'ignorer car certains navigateurs pataugent
$f = basename($file);
if (
isset($doc['titre'])
and (preg_match('/^\w+[.]\w+$/', $doc['titre']) or $doc['titre'] == 'Makefile')
) {
$f = $doc['titre'];
$options['attachment'] = $doc['titre'];
}
// ce content-type est necessaire pour eviter des corruptions de zip dans ie6
header('Content-Type: application/octet-stream');
header("Content-Disposition: attachment; filename=\"$f\";");
header('Content-Transfer-Encoding: binary');
// fix for IE catching or PHP bug issue
header('Pragma: public');
header('Expires: 0'); // set expiration time
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
}
if ($cl = filesize($file)) {
header('Content-Length: ' . $cl);
}
readfile($file);
spip_livrer_fichier($file, $doc['mime_type'], $options);
exit;
break;
}
}
......@@ -10,13 +10,13 @@
parametre : url d'action ]
#ACTION_FORMULAIRE
<div class="editer-groupe">
#SET{name,documents_objets}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
#SET{name,documents_objets}#SET{erreurs,#ENV*{erreurs/#GET{name}}}
<div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label><:medias:label_activer_document_objets:></label>[
<span class='erreur_message'>(#GET{erreurs})</span>
]#INCLURE{fond=formulaires/inc-choisir-objets,name=#GET{name},selected=#ENV**{#GET{name}},exclus=spip_documents}
]#INCLURE{fond=formulaires/inc-choisir-objets,name=#GET{name},selected=#ENV{#GET{name}},exclus=spip_documents}
</div>
#SET{name,documents_date}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
#SET{name,documents_date}#SET{erreurs,#ENV*{erreurs/#GET{name}}}
<div class="editer pleine_largeur editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
[
<span class='erreur_message'>(#GET{erreurs})</span>
......@@ -35,4 +35,4 @@
<p class='boutons'><span class='image_loading'>&nbsp;</span><input type='submit' class='btn submit' value='<:bouton_enregistrer:>' /></p>
</div></form>
]
</div>
\ No newline at end of file
</div>
......@@ -3,7 +3,7 @@
[<p class="reponse_formulaire reponse_formulaire_erreur" role="alert">(#ENV*{message_erreur})</p>]
[(#ENV{editable})
<form method='post' action='#ENV{action}' enctype='multipart/form-data'><div>
[(#REM) declarer les hidden qui declencheront le service du formulaire
[(#REM) declarer les hidden qui declencheront le service du formulaire
parametre : url d'action ]
#ACTION_FORMULAIRE
<input type='hidden' name='id_document' value='#ENV{id_document}' />
......@@ -12,19 +12,19 @@
]
<div style="position:absolute;#LANG_LEFT:-10000px;" class="invisible-first-save-button"><input type='submit' class='btn submit' tabindex="-1" value='<:bouton_enregistrer:>' /></div>
<div class="editer-groupe">
<div class="editer editer_titre[ (#ENV**{erreurs}|table_valeur{titre}|oui)erreur]">
<div class="editer editer_titre[ (#ENV*{erreurs/titre}|oui)erreur]">
<label for="titre">[(#ENV{mode}|=={document}|?{<:medias:entree_titre_document:>,<:medias:entree_titre_image:>})]</label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{titre})</span>
]<input type='text' class='text' name='titre' id='titre' value="[(#ENV**{titre,''})]" />
<span class='erreur_message'>(#ENV*{erreurs/titre})</span>
]<input type='text' class='text' name='titre' id='titre' value="[(#ENV{titre,''})]" />
</div>
<div class='editer editer_parent[ (#ENV**{erreurs}|table_valeur{parents}|oui)erreur]'>
<div class='editer editer_parent[ (#ENV*{erreurs/parents}|oui)erreur]'>
<label for="parents"><:medias:label_parents:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{parents})</span>
<span class='erreur_message'>(#ENV*{erreurs/parents})</span>
]<INCLURE{fond=formulaires/selecteur/articles, selected=#ENV{parents}, name=parents, rubriques=1, articles=1} />
</div>
[<div class="editer editer_fichier[ (#ENV**{erreurs}|table_valeur{fichier}|oui)erreur]">
[<div class="editer editer_fichier[ (#ENV*{erreurs/fichier}|oui)erreur]">
<label for="fichier"><:medias:label_fichier:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{fichier})</span>
<span class='erreur_message'>(#ENV*{erreurs/fichier})</span>
]
(#ENV{fichier})
<p class='actions right'>
......@@ -50,7 +50,7 @@
[(#ENV{apercu}|non)
#SET{hauteur,#HAUTEUR|et{#LARGEUR}|?{#HAUTEUR|div{#LARGEUR}|mult{320}|round{0},200}}
[(#MEDIA|=={audio}|oui) #SET{hauteur,0}]
[(#ENV**{_inclus}|=={embed}|?{
[(#ENV{_inclus}|=={embed}|?{
[(#MODELE{emb,id_document=#ENV{id_document,''},largeur=320,hauteur=#GET{hauteur}})]
,
[(#MODELE{doc,id_document=#ENV{id_document,''},largeur=320,hauteur=#GET{hauteur}}|extraire_balise{a})]
......@@ -60,47 +60,47 @@
<div class="editer editer_infos">
<label><:medias:label_caracteristiques:></label>
[<span class='type'>(#ENV{type_document}) - </span>]
<span class='taille'>[(#LARGEUR|ou{#HAUTEUR}|oui)[(#VAL{info_largeur_vignette}|_T{#ARRAY{largeur_vignette,#LARGEUR,hauteur_vignette,#HAUTEUR}})] -
<span class='taille'>[(#LARGEUR|ou{#HAUTEUR}|oui)[(#VAL{info_largeur_vignette}|_T{#ARRAY{largeur_vignette,#LARGEUR,hauteur_vignette,#HAUTEUR}})] -
][(#TAILLE|taille_en_octets|texte_backend)]</span>
[(#ENV{_taille_modif}|oui)<div class='taille_modifiee'><:medias:fichier_modifie:><br />[(#ENV{_largeur_modif}|ou{#ENV{_hauteur_modif}}|oui)[(#VAL{info_largeur_vignette}|_T{#ARRAY{largeur_vignette,#ENV{_largeur_modif},hauteur_vignette,#ENV{_hauteur_modif}}})] -
][(#ENV{_taille_modif}|taille_en_octets|texte_backend)]</div>]
[(#PIPELINE{afficher_metas_document,#ARRAY{args,#ARRAY{'quoi','editer_document','id_document',#ENV{id_document}},data,''}})]
</div>
<div class="editer editer_descriptif[ (#ENV**{erreurs}|table_valeur{descriptif}|oui)erreur]">
<div class="editer editer_descriptif[ (#ENV*{erreurs/descriptif}|oui)erreur]">
<label for="descriptif"><:info_description:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{descriptif})</span>
]<textarea name='descriptif' id='descriptif'[ lang='(#LANGUE)'] rows='2' cols='40'>[(#ENV**{descriptif})]</textarea>
<span class='erreur_message'>(#ENV*{erreurs/descriptif})</span>
]<textarea name='descriptif' id='descriptif'[ lang='(#LANGUE)'] rows='2' cols='40'>[(#ENV{descriptif})]</textarea>
</div>
[(#ENV{_editer_date})
<div class="editer editer_date[ (#ENV**{erreurs}|table_valeur{saisie_date}|oui)erreur][ (#ENV**{erreurs}|table_valeur{saisie_heure}|oui)erreur]">
<div class="editer editer_date[ (#ENV*{erreurs/saisie_date}|oui)erreur][ (#ENV*{erreurs/saisie_heure}|oui)erreur]">
<label for="saisie_date" class='date'><:date:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{saisie_date})</span>
<span class='erreur_message'>(#ENV*{erreurs/saisie_date})</span>
]<input type='text' class='text date' name='saisie_date' id='saisie_date' size="10" maxlength="10" value="[(#ENV{saisie_date})]" aria-describedby="format_date_doc_#ENV{id_document,nouveau}"/>
<span class='choix heure'>
<label for='saisie_heure' class='heure'><:medias:info_heure:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{saisie_heure})</span>]
<span class='erreur_message'>(#ENV*{erreurs/saisie_heure})</span>]
<input type='text' class='text heure' name='saisie_heure' id='saisie_heure' size="5" maxlength="5" value="[(#ENV{saisie_heure})]" aria-describedby="format_heure_doc_#ENV{id_document,nouveau}"/>
</span>
<p hidden id="format_date_doc_#ENV{id_document,nouveau}"><:format_date_attendu:></p>
<p hidden id="format_heure_doc_#ENV{id_document,nouveau}"><:format_heure_attendu:></p>
</div>]
<div class="editer editer_credits[ (#ENV**{erreurs}|table_valeur{credits}|oui)erreur]">
<div class="editer editer_credits[ (#ENV*{erreurs/credits}|oui)erreur]">
<label for="credits"><:medias:label_credits:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{credits})</span>
]<input type='text' class='text' name='credits' id='credits' value="#ENV**{credits,''}" />
<span class='erreur_message'>(#ENV*{erreurs/credits})</span>
]<input type='text' class='text' name='credits' id='credits' value="#ENV{credits,''}" />
</div>
[(#MEDIA|=={image}|oui)
<div class="editer editer_alt[ (#ENV**{erreurs}|table_valeur{alt}|oui)erreur]">
<div class="editer editer_alt[ (#ENV*{erreurs/alt}|oui)erreur]">
<label for="alt"><:medias:label_alt:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{alt})</span>
<span class='erreur_message'>(#ENV*{erreurs/alt})</span>
]<p class="explication"><:medias:info_alt:></p>
<input type='text' class='text' name='alt' id='alt' value="#ENV**{alt,''}" />
<input type='text' class='text' name='alt' id='alt' value="#ENV{alt,''}" />
</div>
]
[(#ENV{_editer_dimension})
<div class="editer editer_dimensions[ (#ENV**{erreurs}|table_valeur{dimensions}|oui)erreur]">
<div class="editer editer_dimensions[ (#ENV*{erreurs/dimensions}|oui)erreur]">
<label><:medias:entree_dimensions:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{dimensions})</span>]
<span class='erreur_message'>(#ENV*{erreurs/dimensions})</span>]
<span class='choix largeur'>
<label for='largeur' class='largeur'><:medias:info_largeur:></label>
<input type='text' class='text' name='largeur' id='largeur' value="[(#ENV{largeur})]" />
......
......@@ -5,9 +5,9 @@
<form action="#ENV{action}#formulaire_illustrer_document-#ENV{id,new}" method="post" enctype='multipart/form-data'><div>
#ACTION_FORMULAIRE
<div class="editer-groupe">
<div class="editer editer_fichier[ (#ENV**{erreurs}|table_valeur{fichier}|oui)erreur]">
<div class="editer editer_fichier[ (#ENV*{erreurs/fichier}|oui)erreur]">
<label for="fichier"><:medias:label_fichier_vignette:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{fichier})</span>
<span class='erreur_message'>(#ENV*{erreurs/fichier})</span>
][<tt>(#ENV{vignette}|set_spip_doc)</tt><br />][
(#CONFIG{taille_preview}|intval|?{#ENV*{vignette}|image_reduire{#CONFIG{taille_preview}},#ENV*{vignette}|balise_img})
][(#ENV*{vignette}|non)<:medias:aucune_vignette:>
......
......@@ -13,7 +13,7 @@
<div class='joindre_mode#GET{domid}[(#GET{methode}|=={#CLE}|non)none-js]' id='joindre_#CLE#GET{domid}'>
<INCLURE{fond=formulaires/methodes_upload/#CLE,env,domid=#GET{domid}} />
[(#GET{methodes_upload}|count|>{1}|oui)
<div class='sourceup'>
<:medias:bouton_download_depuis:>
......@@ -32,7 +32,7 @@
</BOUCLE_methodes>
[(#REM) Formulaire pour deballer un zip]
[<div class="editer-groupe"><div class='fieldset deballer_zip'>(#ENV**{erreurs}|table_valeur{lister_contenu_archive})</div></div>]
[<div class="editer-groupe"><div class='fieldset deballer_zip'>(#ENV**{erreurs/lister_contenu_archive})</div></div>]
<script type='text/javascript'>/*<!\[CDATA\[*/
if (window.jQuery){
......
<div class="editer-groupe">
<div class='editer editer_url[ (#ENV**{erreurs}|table_valeur{url}|oui)erreur]'>
<div class='editer editer_url[ (#ENV*{erreurs/url}|oui)erreur]'>
<label for='url#ENV{domid}'><:medias:info_referencer_doc_distant:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{url})</span>
<span class='erreur_message'>(#ENV*{erreurs/url})</span>
]<input class='text' placeholder="https://" type="text" name="url" value='#ENV{url}' id="url#ENV{domid}"/>
<!--editer_url-->
</div>
......
<div class="editer-groupe">
[<div class='editer editer_cheminftp[ (#ENV**{erreurs}|table_valeur{cheminftp}|oui)erreur]'>
[<div class='editer editer_cheminftp[ (#ENV*{erreurs/cheminftp}|oui)erreur]'>
<label for='cheminftp#ENV{domid}'>[(#VAL{info_selectionner_fichier}|_T{#ARRAY{upload,#ENV*{_dir_upload_ftp}}})]</label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{cheminftp})</span>
<span class='erreur_message'>(#ENV*{erreurs/cheminftp})</span>
]<select name='cheminftp' id='cheminftp#ENV{domid}' size='1'>
<option value=''>&gt;&gt;</option>
(#ENV*{_options_upload_ftp})
......
<div class="editer-groupe">
<div class='editer editer_refdoc_joindre[ (#ENV**{erreurs}|table_valeur{refdoc_joindre}|oui)erreur]'>
<div class='editer editer_refdoc_joindre[ (#ENV*{erreurs/refdoc_joindre}|oui)erreur]'>
<label for='refdoc_joindre#ENV{domid}'><:medias:label_refdoc_joindre:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{refdoc_joindre})</span>
<span class='erreur_message'>(#ENV*{erreurs/refdoc_joindre})</span>
]<input class='text' type="text" name="refdoc_joindre" value='#ENV{refdoc_joindre}' id="refdoc_joindre#ENV{domid}"/>
<input class='btn submit' type="button" name="parcourir" value="<:medias:bouton_parcourir:>"
onclick="jQuery.modalboxload('#URL_ECRIRE{popin-choisir_document,var_zajax=contenu&selectfunc=mediaselect#ENV{domid}}',{autoResize: true});"
......
<div class="editer-groupe">
<div class='editer editer_fichier_upload[ (#ENV**{erreurs}|table_valeur{fichier_upload}|oui)erreur]'>
<div class='editer editer_fichier_upload[ (#ENV*{erreurs/fichier_upload}|oui)erreur]'>
<label for='fichier_upload#ENV{domid}'><:bouton_upload:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{fichier_upload})</span>
<span class='erreur_message'>(#ENV*{erreurs/fichier_upload})</span>
]<input class='file[(#ENV{multi}|=={non}|non) multi]' type="file" name="fichier_upload[]" value='[(#ENV{fichier_upload}|is_array|?{'', #ENV{fichier_upload}})]' id="fichier_upload#ENV{domid}" size='11' />
<!--editer_fichier_upload-->
</div>
......
......@@ -62,7 +62,8 @@ function contenu_document($arg, $charset = '') {
function generer_url_document_dist($id_document, $args = '', $ancre = '') {
include_spip('inc/autoriser');
if (!autoriser('voir', 'document', $id_document)) {
// si on a pas le droit de voir le document, meme via le htaccess
if (!autoriser('voir', 'document', $id_document, null, ['htaccess' => true])) {
return '';
}
......@@ -78,10 +79,9 @@ function generer_url_document_dist($id_document, $args = '', $ancre = '') {
return $f;
}
// Si droit de voir tous les docs, pas seulement celui-ci
// Si droit de voir tous les docs, sans htaccess, pas seulement celui-ci
// il est inutilement couteux de rajouter une protection
$r = (autoriser('voir', 'document'));
if (($r and $r !== 'htaccess')) {
if (autoriser('voir', 'document')) {
return get_spip_doc($f);
}
......
......@@ -11,6 +11,13 @@
// ///
/////////////////////////////////////////////////////////////////
if(!defined('GETID3_LIBXML_OPTIONS') && defined('LIBXML_VERSION')) {
if(LIBXML_VERSION >= 20621) {
define('GETID3_LIBXML_OPTIONS', LIBXML_NOENT | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_COMPACT);
} else {
define('GETID3_LIBXML_OPTIONS', LIBXML_NOENT | LIBXML_NONET | LIBXML_NOWARNING);
}
}
class getid3_lib
{
......@@ -303,11 +310,10 @@ class getid3_lib
}
} elseif (($exponent == 0) && ($fraction == 0)) {
if ($signbit == '1') {
$floatvalue = -0;
$floatvalue = -0.0;
} else {
$floatvalue = 0;
$floatvalue = 0.0;
}
$floatvalue = ($signbit ? 0 : -0);
} elseif (($exponent == 0) && ($fraction != 0)) {
// These are 'unnormalized' values
$floatvalue = pow(2, (-1 * (pow(2, $exponentbits - 1) - 2))) * self::DecimalBinary2Float($fractionstring);
......@@ -732,7 +738,7 @@ class getid3_lib
// This function has been deprecated in PHP 8.0 because in libxml 2.9.0, external entity loading is
// disabled by default, but is still needed when LIBXML_NOENT is used.
$loader = @libxml_disable_entity_loader(true);
$XMLobject = simplexml_load_string($XMLstring, 'SimpleXMLElement', LIBXML_NOENT);
$XMLobject = simplexml_load_string($XMLstring, 'SimpleXMLElement', GETID3_LIBXML_OPTIONS);
$return = self::SimpleXMLelement2array($XMLobject);
@libxml_disable_entity_loader($loader);
return $return;
......
......@@ -182,7 +182,7 @@ class getID3
public $option_md5_data = false;
/**
* Use MD5 of source file if availble - only FLAC and OptimFROG
* Use MD5 of source file if available - only FLAC and OptimFROG
*
* @var bool
*/
......@@ -387,12 +387,15 @@ class getID3
*/
protected $startup_warning = '';
const VERSION = '1.9.21-202109171300';
const VERSION = '1.9.22-202207161647';
const FREAD_BUFFER_SIZE = 32768;
const ATTACHMENTS_NONE = false;
const ATTACHMENTS_INLINE = true;
/**
* @throws getid3_exception
*/
public function __construct() {
// Check for PHP version
......@@ -565,7 +568,7 @@ class getID3
$this->info['php_memory_limit'] = (($this->memory_limit > 0) ? $this->memory_limit : false);
// remote files not supported
if (preg_match('#^(ht|f)tp://#', $filename)) {
if (preg_match('#^(ht|f)tps?://#', $filename)) {
throw new getid3_exception('Remote files are not supported - please copy the file locally first');
}
......@@ -1051,15 +1054,16 @@ class getID3
'mime_type' => 'audio/x-monkeys-audio',
),
// has been known to produce false matches in random files (e.g. JPEGs), leave out until more precise matching available
// // MOD - audio - MODule (assorted sub-formats)
// 'mod' => array(
// 'pattern' => '^.{1080}(M\\.K\\.|M!K!|FLT4|FLT8|[5-9]CHN|[1-3][0-9]CH)',
// 'group' => 'audio',
// 'module' => 'mod',
// 'option' => 'mod',
// 'mime_type' => 'audio/mod',
// ),
// MOD - audio - MODule (SoundTracker)
'mod' => array(
//'pattern' => '^.{1080}(M\\.K\\.|M!K!|FLT4|FLT8|[5-9]CHN|[1-3][0-9]CH)', // has been known to produce false matches in random files (e.g. JPEGs), leave out until more precise matching available
'pattern' => '^.{1080}(M\\.K\\.)',
'group' => 'audio',
'module' => 'mod',
'option' => 'mod',
'mime_type' => 'audio/mod',
),
// MOD - audio - MODule (Impulse Tracker)
'it' => array(
......@@ -1090,7 +1094,7 @@ class getID3
// MPC - audio - Musepack / MPEGplus
'mpc' => array(
'pattern' => '^(MPCK|MP\\+|[\\x00\\x01\\x10\\x11\\x40\\x41\\x50\\x51\\x80\\x81\\x90\\x91\\xC0\\xC1\\xD0\\xD1][\\x20-\\x37][\\x00\\x20\\x40\\x60\\x80\\xA0\\xC0\\xE0])',
'pattern' => '^(MPCK|MP\\+)',
'group' => 'audio',
'module' => 'mpc',
'mime_type' => 'audio/x-musepack',
......@@ -1547,6 +1551,13 @@ class getID3
$info = $GetFileFormatArray['mp3'];
$info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php';
return $info;
} elseif (preg_match('#\\.mp[cp\\+]$#i', $filename) && preg_match('#[\x00\x01\x10\x11\x40\x41\x50\x51\x80\x81\x90\x91\xC0\xC1\xD0\xD1][\x20-37][\x00\x20\x40\x60\x80\xA0\xC0\xE0]#s', $filedata)) {
// old-format (SV4-SV6) Musepack header that has a very loose pattern match and could falsely match other data (e.g. corrupt mp3)
// only enable this pattern check if the filename ends in .mpc/mpp/mp+
$GetFileFormatArray = $this->GetFileFormatArray();
$info = $GetFileFormatArray['mpc'];
$info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php';
return $info;
} elseif (preg_match('#\\.cue$#i', $filename) && preg_match('#FILE "[^"]+" (BINARY|MOTOROLA|AIFF|WAVE|MP3)#', $filedata)) {
// there's not really a useful consistent "magic" at the beginning of .cue files to identify them
// so until I think of something better, just go by filename if all other format checks fail
......@@ -2193,6 +2204,11 @@ abstract class getid3_handler
$this->data_string_position += $bytes;
return substr($this->data_string, $this->data_string_position - $bytes, $bytes);
}
if ($bytes == 0) {
return '';
} elseif ($bytes < 0) {
throw new getid3_exception('cannot fread('.$bytes.' from '.$this->ftell().')', 10);
}
$pos = $this->ftell() + $bytes;
if (!getid3_lib::intValueSupported($pos)) {
throw new getid3_exception('cannot fread('.$bytes.' from '.$this->ftell().') because beyond PHP filesystem limit', 10);
......
......@@ -297,7 +297,7 @@ class getid3_zip extends getid3_handler
$DataDescriptor = $this->fread(16);
$LocalFileHeader['data_descriptor']['signature'] = getid3_lib::LittleEndian2Int(substr($DataDescriptor, 0, 4));
if ($LocalFileHeader['data_descriptor']['signature'] != 0x08074B50) { // "PK\x07\x08"
$this->getid3->warning('invalid Local File Header Data Descriptor Signature at offset '.($this->ftell() - 16).' - expecting 08 07 4B 50, found '.getid3_lib::PrintHexBytes($LocalFileHeader['data_descriptor']['signature']));
$this->getid3->warning('invalid Local File Header Data Descriptor Signature at offset '.($this->ftell() - 16).' - expecting 08 07 4B 50, found '.getid3_lib::PrintHexBytes(substr($DataDescriptor, 0, 4)));
$this->fseek($LocalFileHeader['offset']); // seek back to where filepointer originally was so it can be handled properly
return false;
}
......
......@@ -20,6 +20,24 @@ getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php',
class getid3_asf extends getid3_handler
{
protected static $ASFIndexParametersObjectIndexSpecifiersIndexTypes = array(
1 => 'Nearest Past Data Packet',
2 => 'Nearest Past Media Object',
3 => 'Nearest Past Cleanpoint'
);
protected static $ASFMediaObjectIndexParametersObjectIndexSpecifiersIndexTypes = array(
1 => 'Nearest Past Data Packet',
2 => 'Nearest Past Media Object',
3 => 'Nearest Past Cleanpoint',
0xFF => 'Frame Number Offset'
);
protected static $ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes = array(
2 => 'Nearest Past Media Object',
3 => 'Nearest Past Cleanpoint'
);
/**
* @param getID3 $getid3
*/
......@@ -317,6 +335,7 @@ class getid3_asf extends getid3_handler
// shortcut
$thisfile_asf['codec_list_object'] = array();
/** @var mixed[] $thisfile_asf_codeclistobject */
$thisfile_asf_codeclistobject = &$thisfile_asf['codec_list_object'];
$thisfile_asf_codeclistobject['offset'] = $NextObjectOffset + $offset;
......@@ -332,6 +351,9 @@ class getid3_asf extends getid3_handler
break;
}
$thisfile_asf_codeclistobject['codec_entries_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
if ($thisfile_asf_codeclistobject['codec_entries_count'] > 0) {
$thisfile_asf_codeclistobject['codec_entries'] = array();
}
$offset += 4;
for ($CodecEntryCounter = 0; $CodecEntryCounter < $thisfile_asf_codeclistobject['codec_entries_count']; $CodecEntryCounter++) {
// shortcut
......@@ -528,7 +550,7 @@ class getid3_asf extends getid3_handler
$offset += 16;
$thisfile_asf_markerobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_markerobject['reserved']);
if ($thisfile_asf_markerobject['reserved'] != $this->GUIDtoBytestring('4CFEDB20-75F6-11CF-9C0F-00A0C90349CB')) {
$this->warning('marker_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_markerobject['reserved_1']).'} does not match expected "GETID3_ASF_Reserved_1" GUID {4CFEDB20-75F6-11CF-9C0F-00A0C90349CB}');
$this->warning('marker_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_markerobject['reserved']).'} does not match expected "GETID3_ASF_Reserved_1" GUID {4CFEDB20-75F6-11CF-9C0F-00A0C90349CB}');
break;
}
$thisfile_asf_markerobject['markers_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
......@@ -648,7 +670,7 @@ class getid3_asf extends getid3_handler
break;
default:
$this->warning('error_correction_object.error_correction_type GUID {'.$this->BytestringToGUID($thisfile_asf_errorcorrectionobject['reserved']).'} does not match expected "GETID3_ASF_No_Error_Correction" GUID {'.$this->BytestringToGUID(GETID3_ASF_No_Error_Correction).'} or "GETID3_ASF_Audio_Spread" GUID {'.$this->BytestringToGUID(GETID3_ASF_Audio_Spread).'}');
$this->warning('error_correction_object.error_correction_type GUID {'.$this->BytestringToGUID($thisfile_asf_errorcorrectionobject['error_correction_type']).'} does not match expected "GETID3_ASF_No_Error_Correction" GUID {'.$this->BytestringToGUID(GETID3_ASF_No_Error_Correction).'} or "GETID3_ASF_Audio_Spread" GUID {'.$this->BytestringToGUID(GETID3_ASF_Audio_Spread).'}');
//return false;
break;
}
......@@ -1442,7 +1464,7 @@ class getid3_asf extends getid3_handler
}
}
}
$info['bitrate'] = (isset($thisfile_audio['bitrate']) ? $thisfile_audio['bitrate'] : 0) + (isset($thisfile_video['bitrate']) ? $thisfile_video['bitrate'] : 0);
$info['bitrate'] = 0 + (isset($thisfile_audio['bitrate']) ? $thisfile_audio['bitrate'] : 0) + (isset($thisfile_video['bitrate']) ? $thisfile_video['bitrate'] : 0);
if ((!isset($info['playtime_seconds']) || ($info['playtime_seconds'] <= 0)) && ($info['bitrate'] > 0)) {
$info['playtime_seconds'] = ($info['filesize'] - $info['avdataoffset']) / ($info['bitrate'] / 8);
......@@ -1577,8 +1599,9 @@ class getid3_asf extends getid3_handler
'GETID3_ASF_Audio_Media' => 'F8699E40-5B4D-11CF-A8FD-00805F5C442B',
'GETID3_ASF_Media_Object_Index_Object' => 'FEB103F8-12AD-4C64-840F-2A1D2F7AD48C',
'GETID3_ASF_Alt_Extended_Content_Encryption_Obj' => 'FF889EF1-ADEE-40DA-9E71-98704BB928CE',
'GETID3_ASF_Index_Placeholder_Object' => 'D9AADE20-7C17-4F9C-BC28-8555DD98E2A2', // http://cpan.uwinnipeg.ca/htdocs/Audio-WMA/Audio/WMA.pm.html
'GETID3_ASF_Compatibility_Object' => '26F18B5D-4584-47EC-9F5F-0E651F0452C9', // http://cpan.uwinnipeg.ca/htdocs/Audio-WMA/Audio/WMA.pm.html
'GETID3_ASF_Index_Placeholder_Object' => 'D9AADE20-7C17-4F9C-BC28-8555DD98E2A2', // https://metacpan.org/dist/Audio-WMA/source/WMA.pm
'GETID3_ASF_Compatibility_Object' => '26F18B5D-4584-47EC-9F5F-0E651F0452C9', // https://metacpan.org/dist/Audio-WMA/source/WMA.pm
'GETID3_ASF_Media_Object_Index_Parameters_Object'=> '6B203BAD-3F11-48E4-ACA8-D7613DE2CFA7',
);
return $GUIDarray;
}
......@@ -1741,7 +1764,7 @@ class getid3_asf extends getid3_handler
* @return array
*/
public function HeaderExtensionObjectDataParse(&$asf_header_extension_object_data, &$unhandled_sections) {
// http://msdn.microsoft.com/en-us/library/bb643323.aspx
// https://web.archive.org/web/20140419205228/http://msdn.microsoft.com/en-us/library/bb643323.aspx
$offset = 0;
$objectOffset = 0;
......@@ -1805,8 +1828,8 @@ class getid3_asf extends getid3_handler
$thisObject['stream_language_id_index'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
$offset += 2;
$thisObject['average_time_per_frame'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4));
$offset += 4;
$thisObject['average_time_per_frame'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 8));
$offset += 8;
$thisObject['stream_name_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
$offset += 2;
......@@ -1823,7 +1846,7 @@ class getid3_asf extends getid3_handler
$streamName['stream_name_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
$offset += 2;
$streamName['stream_name'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, $streamName['stream_name_length']));
$streamName['stream_name'] = substr($asf_header_extension_object_data, $offset, $streamName['stream_name_length']);
$offset += $streamName['stream_name_length'];
$thisObject['stream_names'][$i] = $streamName;
......@@ -1845,7 +1868,7 @@ class getid3_asf extends getid3_handler
$payloadExtensionSystem['extension_system_info_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4));
$offset += 4;
$payloadExtensionSystem['extension_system_info_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, $payloadExtensionSystem['extension_system_info_length']));
$payloadExtensionSystem['extension_system_info'] = substr($asf_header_extension_object_data, $offset, $payloadExtensionSystem['extension_system_info_length']);
$offset += $payloadExtensionSystem['extension_system_info_length'];
$thisObject['payload_extension_systems'][$i] = $payloadExtensionSystem;
......@@ -1853,6 +1876,40 @@ class getid3_asf extends getid3_handler
break;
case GETID3_ASF_Advanced_Mutual_Exclusion_Object:
$thisObject['exclusion_type'] = substr($asf_header_extension_object_data, $offset, 16);
$offset += 16;
$thisObject['exclusion_type_text'] = $this->BytestringToGUID($thisObject['exclusion_type']);
$thisObject['stream_numbers_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
$offset += 2;
for ($i = 0; $i < $thisObject['stream_numbers_count']; $i++) {
$thisObject['stream_numbers'][$i] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
$offset += 2;
}
break;
case GETID3_ASF_Stream_Prioritization_Object:
$thisObject['priority_records_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
$offset += 2;
for ($i = 0; $i < $thisObject['priority_records_count']; $i++) {
$priorityRecord = array();
$priorityRecord['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
$offset += 2;
$priorityRecord['flags_raw'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
$offset += 2;
$priorityRecord['flags']['mandatory'] = (bool) $priorityRecord['flags_raw'] & 0x00000001;
$thisObject['priority_records'][$i] = $priorityRecord;
}
break;
case GETID3_ASF_Padding_Object:
// padding, skip it
break;
......@@ -1970,6 +2027,103 @@ class getid3_asf extends getid3_handler
}
break;
case GETID3_ASF_Index_Parameters_Object:
$thisObject['index_entry_time_interval'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4));
$offset += 4;
$thisObject['index_specifiers_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
$offset += 2;
for ($i = 0; $i < $thisObject['index_specifiers_count']; $i++) {
$indexSpecifier = array();
$indexSpecifier['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
$offset += 2;
$indexSpecifier['index_type'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
$offset += 2;
$indexSpecifier['index_type_text'] = isset(static::$ASFIndexParametersObjectIndexSpecifiersIndexTypes[$indexSpecifier['index_type']])
? static::$ASFIndexParametersObjectIndexSpecifiersIndexTypes[$indexSpecifier['index_type']]
: 'invalid'
;
$thisObject['index_specifiers'][$i] = $indexSpecifier;
}
break;
case GETID3_ASF_Media_Object_Index_Parameters_Object:
$thisObject['index_entry_count_interval'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4));
$offset += 4;
$thisObject['index_specifiers_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
$offset += 2;
for ($i = 0; $i < $thisObject['index_specifiers_count']; $i++) {
$indexSpecifier = array();
$indexSpecifier['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
$offset += 2;
$indexSpecifier['index_type'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
$offset += 2;
$indexSpecifier['index_type_text'] = isset(static::$ASFMediaObjectIndexParametersObjectIndexSpecifiersIndexTypes[$indexSpecifier['index_type']])
? static::$ASFMediaObjectIndexParametersObjectIndexSpecifiersIndexTypes[$indexSpecifier['index_type']]
: 'invalid'
;
$thisObject['index_specifiers'][$i] = $indexSpecifier;
}
break;
case GETID3_ASF_Timecode_Index_Parameters_Object:
// 4.11 Timecode Index Parameters Object (mandatory only if TIMECODE index is present in file, 0 or 1)
// Field name Field type Size (bits)
// Object ID GUID 128 // GUID for the Timecode Index Parameters Object - ASF_Timecode_Index_Parameters_Object
// Object Size QWORD 64 // Specifies the size, in bytes, of the Timecode Index Parameters Object. Valid values are at least 34 bytes.
// Index Entry Count Interval DWORD 32 // This value is ignored for the Timecode Index Parameters Object.
// Index Specifiers Count WORD 16 // Specifies the number of entries in the Index Specifiers list. Valid values are 1 and greater.
// Index Specifiers array of: varies //
// * Stream Number WORD 16 // Specifies the stream number that the Index Specifiers refer to. Valid values are between 1 and 127.
// * Index Type WORD 16 // Specifies the type of index. Values are defined as follows (1 is not a valid value):
// 2 = Nearest Past Media Object - indexes point to the closest data packet containing an entire video frame or the first fragment of a video frame
// 3 = Nearest Past Cleanpoint - indexes point to the closest data packet containing an entire video frame (or first fragment of a video frame) that is a key frame.
// Nearest Past Media Object is the most common value
$thisObject['index_entry_count_interval'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4));
$offset += 4;
$thisObject['index_specifiers_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
$offset += 2;
for ($i = 0; $i < $thisObject['index_specifiers_count']; $i++) {
$indexSpecifier = array();
$indexSpecifier['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
$offset += 2;
$indexSpecifier['index_type'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2));
$offset += 2;
$indexSpecifier['index_type_text'] = isset(static::$ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes[$indexSpecifier['index_type']])
? static::$ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes[$indexSpecifier['index_type']]
: 'invalid'
;
$thisObject['index_specifiers'][$i] = $indexSpecifier;
}
break;
case GETID3_ASF_Compatibility_Object:
$thisObject['profile'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 1));
$offset += 1;
$thisObject['mode'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 1));
$offset += 1;
break;
default:
$unhandled_sections++;
if ($this->GUIDname($thisObject['guid_text'])) {
......
......@@ -615,7 +615,7 @@ echo 'average_File_bitrate = '.number_format(array_sum($vbr_bitrates) / count($v
2 => array(0, 1, 1.3333, 1.7778, 2.2100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
);
$ratio = (float) (isset($lookup[$mpeg_version][$rawaspectratio]) ? $lookup[$mpeg_version][$rawaspectratio] : 0);
if ($mpeg_version == 2 && $ratio != 1) {
if ($mpeg_version == 2 && $ratio != 1 && $width != 0) {
// Calculate pixel aspect ratio from MPEG-2 display aspect ratio
$ratio = $ratio * $height / $width;
}
......
......@@ -61,12 +61,16 @@ class getid3_quicktime extends getid3_handler
$this->fseek($offset);
$AtomHeader = $this->fread(8);
// https://github.com/JamesHeinrich/getID3/issues/382
// Atom sizes are stored as 32-bit number in most cases, but sometimes (notably for "mdat")
// a 64-bit value is required, in which case the normal 32-bit size field is set to 0x00000001
// and the 64-bit "real" size value is the next 8 bytes.
$atom_size_extended_bytes = 0;
$atomsize = getid3_lib::BigEndian2Int(substr($AtomHeader, 0, 4));
$atomname = substr($AtomHeader, 4, 4);
// 64-bit MOV patch by jlegateØktnc*com
if ($atomsize == 1) {
$atomsize = getid3_lib::BigEndian2Int($this->fread(8));
$atom_size_extended_bytes = 8;
$atomsize = getid3_lib::BigEndian2Int($this->fread($atom_size_extended_bytes));
}
if (($offset + $atomsize) > $info['avdataend']) {
......@@ -85,12 +89,14 @@ class getid3_quicktime extends getid3_handler
$info['quicktime'][$atomname]['offset'] = $offset;
break;
}
$atomHierarchy = array();
$parsedAtomData = $this->QuicktimeParseAtom($atomname, $atomsize, $this->fread(min($atomsize, $atom_data_read_buffer_size)), $offset, $atomHierarchy, $this->ParseAllPossibleAtoms);
$parsedAtomData = $this->QuicktimeParseAtom($atomname, $atomsize, $this->fread(min($atomsize - $atom_size_extended_bytes, $atom_data_read_buffer_size)), $offset, $atomHierarchy, $this->ParseAllPossibleAtoms);
$parsedAtomData['name'] = $atomname;
$parsedAtomData['size'] = $atomsize;
$parsedAtomData['offset'] = $offset;
if ($atom_size_extended_bytes) {
$parsedAtomData['xsize_bytes'] = $atom_size_extended_bytes;
}
if (in_array($atomname, array('uuid'))) {
@$info['quicktime'][$atomname][] = $parsedAtomData;
} else {
......@@ -108,7 +114,7 @@ class getid3_quicktime extends getid3_handler
unset($info['avdataend_tmp']);
}
if (!empty($info['quicktime']['comments']['chapters']) && is_array($info['quicktime']['comments']['chapters']) && (count($info['quicktime']['comments']['chapters']) > 0)) {
if (isset($info['quicktime']['comments']['chapters']) && is_array($info['quicktime']['comments']['chapters']) && (count($info['quicktime']['comments']['chapters']) > 0)) {
$durations = $this->quicktime_time_to_sample_table($info);
for ($i = 0; $i < count($info['quicktime']['comments']['chapters']); $i++) {
$bookmark = array();
......@@ -258,7 +264,9 @@ class getid3_quicktime extends getid3_handler
} else {
switch ($atomname) {
case 'moov': // MOVie container atom
case 'moof': // MOvie Fragment box
case 'trak': // TRAcK container atom
case 'traf': // TRAck Fragment box
case 'clip': // CLIPping container atom
case 'matt': // track MATTe container atom
case 'edts': // EDiTS container atom
......@@ -842,6 +850,7 @@ $this->warning('incomplete/incorrect handling of "stsd" with Parrot metadata in
case 'dvcp':
case 'gif ':
case 'h263':
case 'hvc1':
case 'jpeg':
case 'kpcd':
case 'mjpa':
......@@ -1540,6 +1549,21 @@ $this->warning('incomplete/incorrect handling of "stsd" with Parrot metadata in
unset($mdat_offset, $chapter_string_length, $chapter_matches);
break;
case 'ID32': // ID3v2
getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true);
$getid3_temp = new getID3();
$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
$getid3_id3v2 = new getid3_id3v2($getid3_temp);
$getid3_id3v2->StartingOffset = $atom_structure['offset'] + 14; // framelength(4)+framename(4)+flags(4)+??(2)
if ($atom_structure['valid'] = $getid3_id3v2->Analyze()) {
$atom_structure['id3v2'] = $getid3_temp->info['id3v2'];
} else {
$this->warning('ID32 frame at offset '.$atom_structure['offset'].' did not parse');
}
unset($getid3_temp, $getid3_id3v2);
break;
case 'free': // FREE space atom
case 'skip': // SKIP atom
case 'wide': // 64-bit expansion placeholder atom
......@@ -1699,7 +1723,8 @@ $this->warning('incomplete/incorrect handling of "stsd" with Parrot metadata in
$atom_structure['language'] = substr($atom_data, 4 + 0, 2);
$atom_structure['unknown'] = getid3_lib::BigEndian2Int(substr($atom_data, 4 + 2, 2));
$atom_structure['data'] = substr($atom_data, 4 + 4);
$atom_structure['key_name'] = @$info['quicktime']['temp_meta_key_names'][$metaDATAkey++];
$atom_structure['key_name'] = (isset($info['quicktime']['temp_meta_key_names'][$metaDATAkey]) ? $info['quicktime']['temp_meta_key_names'][$metaDATAkey] : '');
$metaDATAkey++;
if ($atom_structure['key_name'] && $atom_structure['data']) {
@$info['quicktime']['comments'][str_replace('com.apple.quicktime.', '', $atom_structure['key_name'])][] = $atom_structure['data'];
......@@ -2074,6 +2099,28 @@ $this->warning('incomplete/incorrect handling of "stsd" with Parrot metadata in
$atom_structure['track_number'] = getid3_lib::BigEndian2Int($atom_data);
break;
// AVIF-related - https://docs.rs/avif-parse/0.13.2/src/avif_parse/boxes.rs.html
case 'pitm': // Primary ITeM
case 'iloc': // Item LOCation
case 'iinf': // Item INFo
case 'iref': // Image REFerence
case 'iprp': // Image PRoPerties
$this->error('AVIF files not currently supported');
$atom_structure['data'] = $atom_data;
break;
case 'tfdt': // Track Fragment base media Decode Time box
case 'tfhd': // Track Fragment HeaDer box
case 'mfhd': // Movie Fragment HeaDer box
case 'trun': // Track fragment RUN box
$this->error('fragmented mp4 files not currently supported');
$atom_structure['data'] = $atom_data;
break;
case 'mvex': // MoVie EXtends box
case 'pssh': // Protection System Specific Header box
case 'sidx': // Segment InDeX box
default:
$this->warning('Unknown QuickTime atom type: "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $atomname).'" ('.trim(getid3_lib::PrintHexBytes($atomname)).'), '.$atomsize.' bytes at offset '.$baseoffset);
$atom_structure['data'] = $atom_data;
......@@ -2322,6 +2369,7 @@ $this->warning('incomplete/incorrect handling of "stsd" with Parrot metadata in
$QuicktimeVideoCodecLookup['gif '] = 'GIF';
$QuicktimeVideoCodecLookup['h261'] = 'H261';
$QuicktimeVideoCodecLookup['h263'] = 'H263';
$QuicktimeVideoCodecLookup['hvc1'] = 'H.265/HEVC';
$QuicktimeVideoCodecLookup['IV41'] = 'Indeo4';
$QuicktimeVideoCodecLookup['jpeg'] = 'JPEG';
$QuicktimeVideoCodecLookup['kpcd'] = 'PhotoCD';
......
......@@ -219,7 +219,8 @@ class getid3_real extends getid3_handler
case 'audio/x-pn-realaudio':
case 'audio/x-pn-multirate-realaudio':
$this->ParseOldRAheader($thisfile_real_chunks_currentchunk_typespecificdata, $thisfile_real_chunks_currentchunk['parsed_audio_data']);
$this->ParseOldRAheader($thisfile_real_chunks_currentchunk_typespecificdata, $parsedAudioData);
$thisfile_real_chunks_currentchunk['parsed_audio_data'] = &$parsedAudioData;
$info['audio']['sample_rate'] = $thisfile_real_chunks_currentchunk['parsed_audio_data']['sample_rate'];
$info['audio']['bits_per_sample'] = $thisfile_real_chunks_currentchunk['parsed_audio_data']['bits_per_sample'];
......
......@@ -808,6 +808,9 @@ class getid3_riff extends getid3_handler
if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strf'][$i]['data'])) {
$strfData = $thisfile_riff['AVI ']['hdrl']['strl']['strf'][$i]['data'];
if (!isset($thisfile_riff_raw['strf'][$strhfccType][$streamindex])) {
$thisfile_riff_raw['strf'][$strhfccType][$streamindex] = null;
}
// shortcut
$thisfile_riff_raw_strf_strhfccType_streamindex = &$thisfile_riff_raw['strf'][$strhfccType][$streamindex];
......@@ -1353,10 +1356,10 @@ class getid3_riff extends getid3_handler
if (!isset($info['playtime_seconds'])) {
$info['playtime_seconds'] = 0;
}
if (isset($thisfile_riff_raw['strh'][0]['dwLength']) && isset($thisfile_riff_raw['avih']['dwMicroSecPerFrame'])) {
if (isset($thisfile_riff_raw['strh'][0]['dwLength']) && isset($thisfile_riff_raw['avih']['dwMicroSecPerFrame'])) { // @phpstan-ignore-line
// needed for >2GB AVIs where 'avih' chunk only lists number of frames in that chunk, not entire movie
$info['playtime_seconds'] = $thisfile_riff_raw['strh'][0]['dwLength'] * ($thisfile_riff_raw['avih']['dwMicroSecPerFrame'] / 1000000);
} elseif (isset($thisfile_riff_raw['avih']['dwTotalFrames']) && isset($thisfile_riff_raw['avih']['dwMicroSecPerFrame'])) {
} elseif (isset($thisfile_riff_raw['avih']['dwTotalFrames']) && isset($thisfile_riff_raw['avih']['dwMicroSecPerFrame'])) { // @phpstan-ignore-line
$info['playtime_seconds'] = $thisfile_riff_raw['avih']['dwTotalFrames'] * ($thisfile_riff_raw['avih']['dwMicroSecPerFrame'] / 1000000);
}
......@@ -1579,7 +1582,7 @@ class getid3_riff extends getid3_handler
public function ParseRIFF($startoffset, $maxoffset) {
$info = &$this->getid3->info;
$RIFFchunk = false;
$RIFFchunk = array();
$FoundAllChunksWeNeed = false;
$LISTchunkParent = null;
$LISTchunkMaxOffset = null;
......@@ -1934,7 +1937,7 @@ class getid3_riff extends getid3_handler
}
}
return $RIFFchunk;
return !empty($RIFFchunk) ? $RIFFchunk : false;
}
/**
......