Cristalab

                 ¿Quieres registrarte?

Clase para renombrar varios archivos mediante PHP

Por: Dientuki
16 de Septiembre del 2008
1515 de clabLevel
Otros artículos de Dientuki
2,684 visitas
php

Me gusta que los nombres de los archivos que descargo sean correctos y sea fácil, buscarlos. Esto significa que los nombres deben tener el numero de capitulo, la serie/anime en cuestión y el nombre del capítulo.

El problema, es que a veces se consiguen con nombres de archivos que parecen el resultado de alguna función random, por lo que tenemos una ardua labor de renombrar cada uno de los archivos a mano.

Así que hice un pequeño script en PHP para facilitarme la vida:

Código :

<?php
class files
{
   private $total;
   private $archivos;
   private $serie;
   private $nombre;
   private $ext;
   private $report;
   private $sep;
   
   function __construct() {
      $directorio = getcwd();
      $me = $_SERVER['SCRIPT_NAME'];
      $me = basename($me);

      $this->report = '';
      
      $dire = opendir($directorio);
      
      if ($dire)
      {
         while($nombre_archivo = readdir($dire))
         {
            if ((is_file($nombre_archivo)) && ($nombre_archivo != $me))
            {
               $this->archivos[] = $nombre_archivo;
            }
         }
      }
      sort($this->archivos);
      $this->total = count($this->archivos);
      $this->ext = substr($this->archivos[0], -3, 3);
   }
   
   public function getTotal()
   {
      return $this->total;
   }
   
   public function getName($value)
   {
      return $this->archivos[$value];
   }

   public function getReport()
   {
      return $this->report;
   }

   public function setSerie($value)
   {
      $this->serie = $value;
   }

   public function setSep($value)
   {
      $this->sep = ' ' . $value . ' ';
   }
   
   public function setExt($value)
   {
      $this->ext = '.' . $value;
   }   

   public function getExt()
   {
      return $this->ext;
   }
   
   public function setName($i, $value, $uppercase)
   {
      if ($value != '') {
         if ($uppercase) {
            $value = ucfirst(strtolower($value));
         }
         $this->nombre[$i] = $this->setCapitulo($i + 1) . $this->sep . $this->serie . $this->sep . $value . $this->ext;
      } else {
         $this->nombre[$i] = $this->archivos[$i];
      }
   }
   
   private function setCapitulo($value)
   {
      if ($value <= 9) {
         return '0' . $value;
      } else {
         return $value;
      }
   }
   
   public function renombrar()
   {
      for ($x=0; $x < $this->total; $x++) {
         rename($this->archivos[$x], $this->nombre[$x]);
         $this->report .= 'Cambie: "' . $this->archivos[$x] . '" por "' . $this->nombre[$x] . '" <br />';   
      }
   }
}

$archi = new files();

if ($_POST)
{
   $caps = $_POST['cap'];
   $formats = $_POST['format'];
   $archi->setSerie($_POST['serie']);
   $archi->setSep($_POST['sep']);
   $archi->setExt($_POST['ext']);
   for ($i=0; $i < $archi->getTotal(); $i++) {
      $archi->setName($i, $caps[$i], $formats[$i]);
   }
   $archi->renombrar();
   echo $archi->getReport();
}
else
{

?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Renombrando archivos</title>
    </head>
    <body>
    </body>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" />
    Serie: <input type="text" name="serie" /><br />
    Separador: <input type="text" name="sep" value="-" /><br />
    Extension: <input type="text" name="ext" value="<?php echo $archi->getExt(); ?>" /><br />
    <?php for ($i=0; $i < $archi->getTotal(); $i++) { ?>
    Capitulo <?php echo $i + 1; ?>: <?php echo $archi->getName($i); ?> -> Nombre nuevo: <input type="text" name="cap[<?php echo $i; ?>]" /> Formatear texto <input type="checkbox" value="true" checked="checked" name="format[<?php echo $i; ?>]" /><br />
    <?php } ?>
    <input type="submit" value="Renombrar" />
    </form>
    </html>
<?php
}
?>


A explicar un poco todo ahora.

Para que este script funcione, como mínimo, los archivos deben estar ordenados. No importa cómo, pero por lo general, si los bajamos de Internet, vienen ordenados. Y el script debe estar en la misma carpeta que los archivos a renombrar.
Aclaración: NO hace validación de caracteres, así que si ponen cosas como ¿\: lo más probable es que no realice el cambio de nombre de ese archivo.

El formulario



Cuando ejecutamos por primera vez el script vamos a ver el formulario con los siguientes inputs:

Luego de que escribamos todos los nombres, viene la magia.

Voy a dar un ejemplo del script:

Serie: "Burst angel"
Separador: "-"
Extensión: "avi"
Capitulo 1: "La Batalla del Ángel Caído" Format: true
Capitulo 2: "Joe asesina a Meg" Format: false

El resultado será:
01 - Burst angel - La batalla del ángel caído.avi
02 - Burst angel - Joe asesina a Meg.avi

La clase



El constructor: Lo que hace el constructor es hacer el listado que vimos antes en el formulario, ordena los archivos, los cuenta, y setea algunas variables.
Luego tenemos los setters y getters:


Luego, viene el que hace la otra parte de la magia; renombrar.
Esta función recorre los 2 vectores (uno que contiene el nombre de archivo, y el otro que contiene el nuevo nombre), renombrando los archivos, y generando un reporte diciendo a qué archivo le puse qué nombres.

Uso de la clase.



Luego de que se instancia la case, viene un if. Con ese if sabremos si estamos o no recibiendo variables desde el formulario. Si no las recibimos, veremos el formulario con todo lo explicado anteriormente.
Cuando enviamos todo por el formulario, vamos a setear el nombre de la serie, el separador, la extensión de los archivos y tendremos 2 vectores, uno con el nombre de los capítulos y otro con un true/false para saber si debemos darle un formato. Luego de eso, viene un for para setear el nombre de los archivos, a continuación le decimos que renombre y nos muestre el reporte.

Espero que les sea útil.


Artículos Relacionados


Etiquetas php

Comentarios | Enviar un comentario
Excelente tip ^^

Yo tengo esa costumbre, la de renombrar todo porque sino, luego no se ni que tengo xD
Por: daz_angie
Muchísimas gracias, al fin tendré organizada toda mi música..!
Por: torrealbaruben
Muy buen tip (y) yo estaba por hacer uno parecido xD
Por: psycho-vnz
Excelente aporte, servirá bastante para mi música. (y)
Por: glsmaster
WTF? ¿Lo van a utilizar para musica? El itunes organiza solo la musica, las pone en carpetas y todo... pero igual me pone contento que les sirva el script.
Por: Dientuki
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.