Comunidad de diseño web y desarrollo en internet

Clase para renombrar varios archivos mediante 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:
  • El nombre de la serie en cuestión.
  • El separador que queremos usar, por defecto está el guión "-".
  • La extensión de los archivos, por defecto toma la de los archivos.
  • Un listado con los capítulos actuales, y el nuevo nombre que le queremos dar. Este nombre deberá ser el nombre del capítulo.
  • Luego veremos un checkbox que es para darle un formato; esto viene a cuento de que a veces conseguimos una lista con los nombres de capítulos y por ejemplo, un nombre puede ser "La Vaca Que Cruzó la Calle", esto estimados, está MAL ortográficamente hablando (sí, así de obsesivo soy), si el check esta tildado (opción por defecto) convierte esa cadena a "La vaca que cruzó la calle". Si desactivamos el check, el nombre del capitulo será tal cual lo escribimos en el input.

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:

  • setSep: Automáticamente agrega un espacio antes y después del separador.
  • setExt: Automáticamente agrega el punto antes de la extensión.
  • setName: Crea un vector con los nuevos nombres, si está el check activado, formatea el nombre del capítulo. Una validación que tiene, es si no ingresamos nada como nombre, le asignara el mismo nombre que tiene actualmente.
  • setCapitulo: Formatea el numero del capítulo, si es menor a 9, le agrega un cero (se verá 09).


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.

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate