~mhysterio/sintel-media/trunk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
.\" Copyright (C) Julio Serrano, 2017, 2019
.\"
.\" %%%LICENSE_START(GPLv2+_DOC_FULL)
.\" This is free documentation; you can redistribute it and/or
.\" modify it under the terms of the GNU General Public License as
.\" published by the Free Software Foundation; either version 2 of
.\" the License, or (at your option) any later version.
.\"
.\" The GNU General Public License's references to "object code"
.\" and "executables" are to be interpreted as the output of any
.\" document formatting or typesetting system, including
.\" intermediate and printed output.
.\"
.\" This manual is distributed in the hope that it will be useful,
.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
.\" GNU General Public License for more details.
.\"
.\" You should have received a copy of the GNU General Public
.\" License along with this manual; if not, see
.\" <http://www.gnu.org/licenses/>.
.\" %%%LICENSE_END
.\"
.\" 2019-07-20  Julio Serrano <mhysterio@gmail.com>
.\"      First version written
.\" xxxx-xx-xx  Julio Serrano <mhysterio@gmail.com>
.\"      Update
.\"
.\" sintel -  Inteligencia de series
.\" Contacta mhysterio@gmail.com para corregir errores
.TH SINTEL 1 20/07/2019 "Julio Serrano" "Manual de sintel"
.SH NAME
sintel \- Inteligencia de series, películas y medios en general
.SH SYNOPSIS
.SY sintel
.OP \-h
.OP \-d dir
.OP \-f funcion
.OP \-s fichero
.OP \-l
.OP \-i id-episodio
.OP \-n funcion
.OP \-x [modulo]
.OP \-m
.OP \-\-help
.OP \-\-list\-all
.OP \-\-list\-series
.OP \-\-list\-peliculas
.OP \-\-find\-series cadena
.OP \-\-find\-peliculas cadena
.OP \-\-add\-pelicula registro-pelicula
.OP \-\-list\-episodios idmedio
.OP \-\-detectar dir 
.OP \-\-function\-call funcion
.OP \-\-function\-call2 funcion
.OP \-\-list\-functions
.OP \-\-determine\-series cadena
.OP \-\-mods
.YS
.SH DESCRIPTION
\fBSintel\fP es un programa escrito en bash que dispone de módulos con
funciones dedicadas a gestionar una base de datos de medios locales
principalmente. Es decir, series y películas. Aunque tiene módulos
para realizar otras tareas relacionadas, como por ejemplo el que
permite comunicarse con el gestor de torrents transmission. Además
cuenta con dos módulos que permiten realizar el seguimiento de
series que visionamos online en distintas webs de enlaces. Uno está
dedicado a las series y otro al anime.
.PP
Se creó por la necesidad de controlar los medios descargados,
pensando que sería mucho más sencillo y rápido buscar en una base de datos
que hacer búsquedas entre la plétora de ficheros de nuestros discos fijos.
De esta manera el programa
ofrece la posibilidad de añadir los medios de una carpeta (incluidos
los subdirectorios) a la base de datos, para después listarlos o buscarlos.
Esto puede hacerse tantas veces como se quiera y no importa si se
añade varias veces la misma carpeta, ya que sintel reconoce los medios
que ya están en la base de datos y no crea duplicados.
.PP
En el caso de las series, siempre es un problema saber por qué episodio
nos llegamos, así que \fBsintel\fP
ofrece una especie de puntero que puede
moverse adelante y atrás por los episodios de una serie y así localizar
con facilidad cuál era el siguiente episodio que teníamos pendiente
de tal o cual serie. O por ejemplo se puede marcar una temporada entera
como vista, de forma que no importa si habíamos empezado a ver la serie
antes de conocer \fBsintel\fP,
puesto que el puntero se puede mover rápidamente
a donde necesitemos.
.PP
\fBSintel\fP es modular y extensible. Algunas de las funciones internas 
están
asociadas a opciones, pero puesto que son muchas y habría que añadir
muchísimas opciones se ha considerado mejor opción el poder invocar 
cualquier función interna directamente desde la línea de comandos.
.SH OPTIONS
.SS "Opciones generales"
.PP
\-h | \-\-help
.RS
Muestra la ayuda de
.B "sintel."

.RE
.PP
\-f | \-\-function\-call función:[argumentos]
.RS
Invoca una función interna de \fBsintel\fP.

.PP
El formato del comando es el siguiente:
.RS

sintel -f función

o

sintel -f función:"argumentos"

.RE
En la mayoría de los módulos se interpone un prefijo
al nombre de sus funciones. Si hay más de un argumento debe
entrecomillarse la cadena de argumentos entera, y si uno de los
argumentos requiere espacios para separación de palabras tiene
que entrecomillarse aparte. Esto puede hacerse mediante comillas 
simples o escapando el signo de dobles comillas (\\").
.RE
.PP
\-n | \-\-function\-call2 function:[argumentos]
.RS
Invoca una función interna de \fBsintel\fP.


Esta opción es igual a la anterior excepto por que los argumentos,
si hay más de uno, se separan con el símbolo de cañería (|). El
formato de esta opción queda de la siguiente forma:
.RS

sintel -n funcion

o

sintel -n función:"argumento1|argumento2|etc"

.RE
Si solo se requiere un argumento o no se requiere ninguno, esta opción
es exactamente igual a la anterior.
.RE
.PP
\-l | \-\-list\-functions
.RS
Lista todas las funciones de \fBsintel\fP.
.RE
.PP
\-x módulo
.RS
Lista sólo las funciones que pertenecen al módulo indicado.
.RE
.PP
\-\-info función | módulo
.RS
Muestra la documentación de la función o el módulo indicado.
.RE
.PP
\-m | \-\-mods
.RS
Lista los módulos cargados en
.B "sintel."

.RE
.SS "Medios"
.PP
\-\-list\-all
.RS
Invoca a la función 'medios.listAll' que muestra todos las películas
y series de la base de datos.
.RE
.PP
\-\-list\-peliculas
.RS
Invoca la función 'medios.listPeliculas' que muestra solo las
películas de la base de datos.
.RE
.PP
\-\-find\-peliculas cadena-búsqueda
.RS
Invoca la función 'medios.findPeliculas' que lista las películas
cuyo título contenga la cadena de búsqueda indicada.
.RE
.PP
\-\-add\-pelicula registro-pelicula
.RS
Invoca la función 'film.add2' que añade el registro indicado
a la base de datos como una película nueva. El registro comprende
tres campos: título, fichero y torrent  que deben escribirse de la
siguiente forma:
.RS

"título|fichero|torrent"

.RE
El título es el título de la película y el fichero es la ruta
completa al archivo de medios de la película, mientras que el
torrent es el número que le asigna el cliente de BitTorrent
Transmission al torrent de la película. Si no queremos indicar
el torrent, deberemos poner -1 en su lugar.
.RE
.PP
\-\-list\-series
.RS
Invoca la función 'medios.listSeries' que lista todas las series
que contiene la base de datos. 
.RE
.PP
\-\-find\-series cadena-búsqueda
.RS
Invoca la función 'medios.findSeries' que lista solo las series
cuyos títulos contengan la cadena de búsqueda dada.
.RE
.PP
\-\-list\-episodios id-medio
.RS
Invoca a la función 'medios.listEpisodios' que lista los episodios
de la serie indicada con id-medio de la base de datos.
.RE
.PP
\-d | \-\-detectar directorio
.RS
Recorre el directorio indicado de forma recursiva y añade los medios
que encuentra siempre que no se encuentren ya en la base de datos. Es
una forma rápida de añadir películas y series. El algoritmo intentará
diferenciar si el medio es el episodio de una serie o una película
por la notación de la tupla temporada y episodio, aunque no siempre
lo detecta bien, porque solo tiene programados unos pocos formatos
y puede que agrege episodios de serie como películas independientes.
A veces ocurre que los títulos de los archivos no contienen de forma
clara el nombre de la serie. En ese caso es posible que se cree una
serie nueva con ese nombre, lo cual es algo molesto. Debe tenerse
en cuenta.
.RE
.PP
\-i | \-\-is\-downloaded id-medio temporada'x'episodio
.RS
Invoca la función 'medios.isDownloaded' que trata de determinar
si el episodio de la serie indicada está descargado. La serie
viene determinada por id-medio que es el identificador numérico
de la serie en la base de datos (aparece como primer campo en
los resultados de \-\-list-all y \-\-list-series), mientras
que la temporada y el episodio debe ser una cadena con dos
números (temporada y episodio) separados por el caracter 'x'.
.RE
.PP
.B "Sintel"
contiene modulos variados con muchísimas funciones. Se han
creado opciones para las más usadas hasta ahora. El resto pueden ser
llamadas con las opciones \-f y \-n. Cada función dispone de una
sencilla documentación a la que puede accederse con la opción
\-\-info. En el presente manual daremos una idea de qué tipo de
funciones tiene cada módulo, los distintos registros usados para
compartir información de los objetos de la base de datos; 
y todo aquello que sea
preciso para proporcionar una base sólida para usar sintel con
confianza.
.SH BASE DE DATOS
En esta sección vamos a hablar de lo que necesita saber sobre como
se almacenan los medios en \fBsintel\fP.
.PP
Las \fBpelículas\fP se almacenan en la tabla \fB'medio'\fP.
De cada película se guardan los siguientes datos:
.RS
.PP
id - identificador de medio.
.RS
Se trata un número único que identifica a un solo medio en toda la base
de datos. En la documentación a este campo se le llama a veces 'idmedio'.
.RE
.PP
titulo - título del medio.
.RS
Contiene el título de la película completo.
.RE
.PP
fichero - ruta completa del archivo del medio.
.RS
Se trata de una ruta de un sistema de archivos que puede ser local o remota, 
dependiendo del uso que hagamos. En caso de tratarse de una ruta remota
es posible que requira de una adaptación para su uso en local, por ejemplo,
a la hora de reproducir el medio. Hablaremos de esto en el módulo 'rutas'.
.RE
.PP
torrent - id del torrent en el cliente de BitTorrent Transmission.
.RS
Se trata de un número entero que sirve, en caso de que estemos utilizando
el módulo 'torrents' para obtener información del cliente de torrents
Transmission. Este cliente asigna a cada nuevo torrent un número 
identificativo
único. Con este número se puede saber si un medio ha terminado de 
descargarse o su ubicación.
.RE
.PP
esserie - identifica si un medio es o no es una serie.
.RS
Este campo será 0 cuando el medio sea una película y 1 cuando se trate
de una serie. Esto es así porque se utiliza también la tabla medio
para almacenar algunos datos de series.
.RE
.PP
esvisto - indica si el usuario ha visto el medio o no.
.RS
Contiene 0 cuando no se ha visto y 1 cuando ya se ha visto.
.RE
.PP
esdescargado - indica si el medio ha sido descargado por completo.
.RS
Contiene 0 cuando aún no se ha terminado de descargaro y 1 cuando si. Este
campo solo se usa en algunas aplicaciones de \fBsintel\fP.
.RE
.RE
.PP
Las \fBseries\fP requieren de dos tablas para almacenarse. Por un lado 
el id y el título se guardan en la tabla 'medio' que acabamos de 
describir arriba. En esa misma tabla, cuando se trate de una serie, 
el campo 'esserie' contendrá el valor 1. Además necesitamos
una tabla más donde guardar los episodios de la serie. Esta tabla se
llama 'episodio' en singular. La tabla 'episodio' almacena los
siguientes datos:
.RS
.PP
id - identificador único de episodio.
.RS
Contiene un número que representa un único episodio en la base de datos, sin
importar a qué serie pertenezca. Este número es independiente y no se
corresponde con el número de episodio dentro de la serie. Cuando la base
de datos acaba de crearse, el primer episodio añadido tendrá el número 1.
A partir de entonces, cada nuevo episodio tendrá el siguiente número,
a no ser que borremos episodios, en cuyo caso se podrán reutilizar números
ya utilizados. Este número solo afecta como medio de identificar un solo
episodio en toda la base de datos.
.RE
.PP
idmedio - id de la serie a la que pertenece.
.RS
Hace referencia al registro de la serie a la que pertenece el episodio
en la tabla 'medio'. Todos los episodios de una misma serie tendrán el
mismo valor en este campo.
.RE
.PP
temporada - número de la temporada a la que pertenece.
.RS
Temporada a la que pertenece el episodio. Se trata de un número que va de 1 
en adelante.
.RE
.PP
episodio - número de episodio.
.RS
Este es el número de episodio o de orden dentro de la serie. Cada nueva
temporada empieza de nuevo en 1.
.RE
.PP
fichero - ruta completa al archivo del episodio.
.RS
Se trata de la ruta completa al archivo que contiene el episodio. Se deben
utilizar rutas absolutas.
.RE
.PP
torrent - id del torrent en el cliente de torrents Transmission.
.RS
Este dato generado por el propio Transmission, permite recabar información
del torrent. 
.RE
.PP
esvisto - indica si el usuario ha visto el episodio o no.
.RS
Cuando no se ha visto aún contendrá 0, y 1 cuando ya se ha visto.
.RE
.PP
esdescargado - indica si el episodio ha terminado de descargarse.
.RS
Será 0 cuando no haya terminado la descarga y 1 cuando haya concluido.
.RE
.RE
.PP
Es importante conocer las tablas 'medio' y 'episodio' ya que varias
de las funciones que permiten gestionar películas y series devuelven
o reciben como argumento registros que se corresponderán
con el orden de los campos ya explicado. Más adelante veremos ejemplos
que dejarán bastante claro este punto.
.SH MODULOS
.SS "Modularidad y extensibilidad de sintel"
En este apartado vamos a ver ciertos aspectos de la programación de
.B "sintel"
por lo que si no está versado en la programación en
.B "bash"
puede saltar directamente a la parte de descripción del módulo 'help'.
.PP
Mantener un siempre creciente script de bash se va complicando
conforme se va convirtiendo en un archivo grande. Una comilla ausente
o mal puesta puede hacer que gran parte del script deje de funcionar.
Precisamente el proceso de creación de
.B "sintel"
ya desde el principio
apuntaba a que podía convertirse en algo problemático. La idea de hacerlo
modular surgió enseguida. Y es que revisar un archivo solo con funciones
relacionadas es mucho más sencillo y rápido. Por eso
.B "sintel"
es modular.
.PP
Una de las características de
.B "sintel"
es que siempre es
un trabajo en progreso. Por esta razón tuve que pensar
en una manera sencilla y rápida de añadir funciones y
código que se pudieran utilizar inmediatamente con el
mínimo número de modificaciones al programa principal.
Eso dió lugar a una primera versión de 'modularity', que
con alguna mejora pasó a ser el módulo responsable de
cargar el resto de módulos de \fBsintel\fP.
.PP
Su funcionamiento es muy sencillo. En primer lugar se
define una lista llamada MODS que va a almacenar los
nombres de los ficheros que contienen el código en sí.
Entonces se importa mediante la palabra clave 'source'
modularity, que se encarga de leer la lista y de cargar
los módulos en el orden en que están escritos en MODS.
.PP
Este sencillo mecanismo permite escribir nuevos archivos
o módulos con funcionalidades nuevas, cuyas funciones
pueden empezar a utilizarse simplemente añadiendo el
nombre del archivo nuevo a la lista MODS.
.PP
Lo mejor de todo es que los nuevos módulos pueden llamar
a cualquier función de los módulos previamente existentes
, con lo que se pueden crear varias capas de lógica o
niveles, que pueden dar lugar a un programa grande, pero
sin las complicaciones de tener que mantener un script de
bash grande.
.SS "Descripción de los módulos"
.B "help"
.RS
Módulo de ayuda principal.
.PP
Nota: Por ahora solo tiene la función del mismo nombre
que aún no está terminada.
.RE
.PP
.B "generic"
.RS
Funciones de propósito general. Pueden utilizarse tanto a nivel
interno como externo, desde fuera de \fBsintel\fP.
.RE
.PP
.B "doc"
.RS
Funciones que soportan la documentación interna de \fBsintel\fP.
.RE
.PP
.B "init"
.RS
Módulo de inicialización. También es el responsable
de actualizar la base de datos a la última versión, añadiendo
las tablas necesarias.
.RE
.PP
.B "database"
.RS
Módulo responsable de la base de datos. En realidad se trata de
un módulo genérico con las funciones 'db.executeQuery' y
 'db.executeUpdate' que permiten ejecutar consultas y modificar
tablas en la base de datos. Este módulo al cargarse comprueba
si existe el fichero de la base de datos y si no existe llama
a init.
.RE
.PP
.B "peliculas"
.RS
Conjunto de funciones de gestión de películas. Permite añadir
películas a la base de datos, consultarlas, buscarlas,
modificarlas y borrarlas. Aunque el módulo se llama películas,
las funciones tienen el prefijo film, por lo que para listarlas
se ha de usar 'sintel -x film'.
.RE
.PP
.B "series"
.RS
Funciones de gestión de series. Dar de alta series, consultarlas,
buscarlas, actualizarlas, añadir episodios, etc. Es uno de los
módulos con mayor número de funciones.
.RE
.PP
.B "medios"
.RS
Funciones para gestión de medios en general. Este módulo contiene
funciones de propósito general para medios. En concreto todas las
funciones que permiten listar medios están en él.
.RE
.PP
.B "torrents"
.RS
Funciones para gestionar la comunicación con el gestor
de torrents Transmission. Realiza funciones desde obtener
el id del último torrent añadido, hasta recopilar datos
de un torrent. Funciona gracias al programa
transmission-remote, y por supuesto requiere una instancia
de Transmission funcionando con el modo remoto activado.
Edite el fichero de este módulo para modificar las credenciales
de acceso a su servicio de Transmission.
.RE
.PP
.B "rutas"
.RS
Gestión de rutas alternativas (correspondencias entre rutas
remotas y locales). Este módulo solo es necesario si se
utiliza un servicio de Transmission remoto. En caso de
usar un cliente local no es necesario puesto que no habrá
duplicidad de rutas remotas y locales. Para entender su
funcionamiento veremos un ejemplo.
.PP
Imaginemos que tenemos el servicio de Transmission en un
NAS o servidor, cuya carpeta de descargas es la siguiente:
.PP
/share/HDB_DATA/Download/transmission/completed
.PP
Dentro de ella tenemos nuestros medios, y además tenemos
acceso en un PC de escritorio mediante NFS a la 
carpeta '/share/HDB_DATA/Download' que tenemos montada
en la siguiente ruta:
.PP
/mnt/Download
.PP
A la hora de tratar nuestros medios con \fBsintel\fP se nos
presenta un problema. Si hemos estado usando algo como 'mt'
para descargar los torrents, todos los medios tendrán rutas
remotas, es decir, que solo funcionarán desde el NAS. Más
a la hora de reproducirlos necesitaremos rutas que empiecen
por '/mnt/Download' que es la única manera de que el PC de
escritorio acceda a los archivos. Por ejemplo pongamos este
medio:
.PP
/share/HDB_DATA/Download/transmission/completed
/series/Elementary/Elementary1x01.mp4
.PP
Si usamos directamente esa ruta para reproducir el medio en el PC
de escritorio, dará un error. Necesitamos esta otra ruta:
.PP
/mnt/Download/transmission/completed
/series/Elementary/Elementary1x01.mp4
.PP
Es decir, necesitamos que cualquier ruta remota sea convertida
en una ruta local. Eso es precisamente lo que hace este módulo.
Permite agregar pares de rutas, obtener unas a partir de las otras
y convertir rutas de un tipo en el otro.
.RE
.PP
.B "head"
.RS
Funciones de movimiento del puntero de series. Permite avanzar o
retroceder el puntero de una serie, es decir, modificar cual es
el siguiente episodio que tenemos que ver; de varias maneras.
Por ejemplo se puede mover ese puntero de uno en uno o de 'n'
en 'n', siendo 'n' el número de posiciones que queremos moverlo.
También permite marcar como vista una temporada entera y
desmarcarla. En definitiva una serie de herramientas muy sencillas
y últiles para facilitarnos la vida a la hora de llevar la cuenta
de por qué episodio nos llegamos de tal serie. Funciona ajustando
en 0 o en 1 el campo 'esvisto' (mencionado en la sección de la
base de datos) de los episodios. Para poder invocar cualquiera
de estas funciones necesitaremos el 'id' de la serie.
.RE
.PP
.B "ver"
.RS
Funciones de visionado. Este módulo es algo básico pero esencial.
Principalmente cuenta con dos funciones: 'ver.pelicula'
y 'ver.serie'. La primera requiere una cadena de búsqueda y
si encuentra una película que coincida la reproducirá. En caso de
encontrar varias, nos da a elegir. La segunda es un sistema
interactivo mediante el cual se puede seleccionar qué episodio
queremos ver. Una vez que hemos conseguido llenar la base de datos
con medios, ya solo nos queda disfrutar con este módulo.
.RE
.PP
.B "test"
.RS
Módulo donde añadir funciones de prueba. No tiene ninguna
utilidad especial más allá de escribir funciones para probar
cosas.
.RE
.PP
.B "anime"
.RS
Gestión del anime que vemos online, en páginas de enlaces. Este
módulo funciona con una tabla aparte ('anime') que mantiene una
lista del anime que vemos online. Hay disponible un frontend
de este módulo que hace más fácil su uso.
.RE
.PP
.B "veronline"
.RS
Gestión de las series que vemos online, en webs de enlaces.
Es una copia del módulo anterior que se utiliza de la misma
forma, pero para series online en lugar del anime. El mismo
frontend mencionado en el módulo anterior incluye un script
similar que facilita el uso de este módulo.
.RE
.SH EJEMPLOS
\fB1. Popular la base de datos\fP
.PP
Una vez instalado, tendremos la base de datos vacía. Lo primero
que tenemos que hacer es cargarla con datos. Esto se puede
hacer de tres maneras distintas: 
.PP
\fB1.1. Con la opción detectar.\fP
.PP
Esta opción recorre un directorio y sus subdirectorios y agrega
todos los ficheros de medios que encuentra a la base de datos.
En algunos casos puede no ser la opción ideal, aunque es la más
rápida. Como ya se dijo, puede pasarse esta opción por el mismo
directorio tantas veces como se quiera, ya que no añade dos
veces el mismo fichero.
.PP
sintel -d /mnt/medios

sintel -d /mnt/datos/peliculas
.PP
\fB1.2. Añadiendo una película manualmente.\fP
.PP
Debe hacerse una por una teniendo en todo momento el control de
qué título le ponemos y donde se encuentra el fichero. Se
recomienda utilizar la opción \-n y utilizar el formato de
registro con la función 'film.add2'.
.PP
sintel -n film.add2:"El Resplandor|/mnt/medios/elresplandor.mp4|-1"
.PP
\fB1.3. Añadiendo un episodio de una serie manualmente.\fP
.PP
Al igual que la opción anterior, es manual. Si es la primera
vez que agrega episodios de esa serie, tendrá que dar de alta
la serie. Entonces ya podrá añadir los episodios utilizando el
idmedio de devuelve la función 'series.add'. En el ejemplo, la
serie "Dead Zone" se ha añadido con el id 1412, que se usará
en adelante para dar de alta todos los episodios de esa serie.
En todos los ejemplos el torrent se ajusta a -1 dado que no
vamos a usar el módulo 'torrents'.
.PP
sintel -f series.add:"Dead zone"


sintel -n series.addEpisodio:"1412|1|1|/mnt/medios/series/dz/1x01.mp4|-1"

sintel -n series.addEpisodio:"1412|1|2|/mnt/medios/series/dz/1x02.mp4|-1"
.RE
.PP
\fB2. Mantenimiento\fP
.PP
Una vez que ya tenemos datos en la base de datos vamos a ver como
podemos realizar el mantenimiento.
.PP
\fB2.1. Borrar una película o serie\fP
.PP
Primero buscamos la película con find:
.PP
sintel -f film.find:resplandor
.PP
La función 'film.find' devuelve un listado de todas las películas cuyo
título coincida con nuestra cadena de búsqueda. De cada película nos
mostrará el registro completo tal y como está definido en la sección
de arriba sobre la base de datos. Los campos aparecen separados con
el caracter tubería '|'. El primer campo es el id de la película. Ese
es el dato que tendremos que utilizar en la siguiente llamada para
borrar la película:
.PP
sintel -f film.remove:1
.PP
En el caso de las series es exactamente igual, salvo por que se deben
utilizar las funciones 'series.find' y 'series.remove'.
.PP
También se puede borrar un episodio con la función 'series.removeEpisodio'.
Para ello se precisa el id del episodio. Este id no es el de la serie
sino que representa únicamente a un episodio en toda la base de datos.
.PP
Buscamos el episodio que queremos borrar. Para ello llamamos
a la función 'series.getEpisodioId'. Requiere tres argumentos en el
siguiente orden: idmedio, temporada y episodio. Como ya se ha dicho,
el idmedio es el id de la serie en la tabla medios (se obtiene al
agregar una serie o con la función 'series.find:titulo'. En este
ejemplo vamos a obtener el id del episodio 1x01:
.PP
sintel -n series.getEpisodioId:"2|1|1"
.PP
También puede buscarse el id de episodio de otra forma, con la
funcición 'series.getEpisodioByFichero'. Como su nombre indica permite
obtener un episodio por la ruta de su fichero:
.PP
sintel -n series.getEpisodioByFichero:"/mnt/medios/series/dz/1x01.mp4"
.PP
Esta función no devuelve solo el id, sino todo el registro. El id del
episodio aparecerá en el primer campo. Ahora ya solo nos queda borrarlo:
.PP
sintel -f series.removeEpisodio:2
.PP
\fB2.2. Actualización\fP
.PP
\fB2.2.1. Películas\fP
.PP
El módulo 'películas' ofrece las siguientes funciones para temas de
actualización. Todas ellas requieren que se les indique el id de la
película como primer argumento. Las dos últimas funciones requieren
de un argumento adicional:
.RS
film.setDescargada - Marcar como descargada.

film.setNoDescargada - Marcar como no descargada.

film.setNoVista - Marcar como no vista.

film.setVista - Marcar como vista.

film.updateFichero - Actualizar ruta al medio.

film.updateTorrent - Actualizar id de torrent.
.RE
.PP
Veamos cómo se marca nuestra película como vista:
.PP
sintel -f film.setVista:1
.PP
Ahora imaginemos que hemos movido el fichero de nuestra película
a otro disco. Nótese que empleamos la opción -n para poder usar
el separador tubería '|' en los argumentos.
.PP
sintel -n film.updateFichero:"1|/mnt/datos/peliculas/resplandor.mp4"
.PP
\fB2.2.2. Series\fP
.PP
El módulo 'series' ofrece las siguientes funciones de
actualización:
.RS
series.setEpisodioDescargado - Marca como descargado.

series.setEpisodioNoDescargado - Marca como no descargado.

series.setEpisodioNoVista - Marca como no visto.

series.setEpisodioVista - Marca como visto.

series.updateEpisodioFichero - Actualiza fichero.

series.updateEpisodioTorrent - Actualiza torrent.
.RE
.PP
Todas ellas tienen que ver con los campos de la tabla episodio
descrita en la sección de la base de datos, más arriba. Como se
puede ver, ni el título de las películas ni el de las series se
puede modificar. Tampoco se pueden modificar la temporada y el
número de episodio. Las funciones listadas permiten modificar
los campos restantes. En este caso se precisa al menos un
argumento, que será el id de episodio. A continuación, dependiendo
de la función que sea, podrá ir otro argumento que será el nuevo
valor que queremos asignar.
.PP
sintel -n series.updateEpisodioFichero:"2|/mnt/medios/series/dz/1x02.mp4"
.PP
\fB3. Consultas\fP
.PP
La razón última para usar \fBSintel\fP es sin duda su capacidad para
consultar la base de datos. Sin ello nadie se tomaría la molestia
de popular la base de datos. Aunque los módulos 'películas' y 'series'
tienen también muchas funciones de consulta, en este documento
vamos a ver las de 'medios':
.RS
medios.findPeliculas - Buscar películas por título.

medios.findSeries - Buscar series por título

medios.listAll - Listar todos los medios.

medios.listEpisodios - Listar episodios por idmedio.

medios.listPeliculas - Listar todas las películas.

medios.listSeries - Listar todas las series.
.RE
.PP
Las dos primeras funciones de la lista tienen sus alternativas en
sus módulos respectivos: 'film.find' y 'series.find'. Estas ofrecen
sus resultados en formato registro (con el separador '|') por lo que
quizá se vean con más claridad. Ambas requieren una cadena de búsqueda
entrecomillada como argumento.
.PP
La función 'medios.listEpisodios' requiere el idmedio como argumento,
mientras que el resto de las funciones 'list' no precisan ningún
argumento.
.PP
\fB4. Reproducción\fP
.PP
El módulo 'ver' nos ofrece varias funciones para reproducir medios
con nuestro reproductor favorito. Para seleccionarlo se debe editar
el archivo /usr/share/sintel/var (con sudo) y modificar la variable
PLAYER. Por defecto reproduce con vlc si está instalado. Las funciones
más importantes son:
.RS
ver.pelicula - Ver una película.

ver.serie - Ver una serie.
.RE
.PP
Ambas funciones presentan un menú de selección en caso de que dos o
más medios coincidan con la cadena de búsqueda. Una vez seleccionado
el medio, este se reproducirá.
.PP
La función 'ver.serie' muestra una pantalla interactiva en la que
el usuario puede realizar varias acciones con el puntero de la
serie. Para reproducir el episodio marcado pulse 'p' e 'intro'.
Puede echar un vistazo a las demás opciones.
.SH VEA TAMBIÉN
Consulte también la documentación interna. La mejor forma de 
hacerlo es listar primero los módulos:
.PP
.RS
sintel \-\-mods
.RE
.PP
Tiene disponible una pequeña descripción de cada módulo que
puede consultar mediante:
.PP
.RS
sintel --info ver
.RE
.PP
Después consulte módulo por módulo para ver la lista de funciones
que tiene cada uno de ellos:
.PP
.RS
sintel \-x ver
.RE
.PP
Una vez que ya conoce el nombre de una función concreta, se puede
consultar la documentación interna de esa función con el
siguiente comando:
.PP
.RS
sintel \-\-info ver.series
.RE
.PP
De esta manera es fácil navegar por la documentación interna. Si
después de leer toda la documentación hay algo que no entiende,
no dude en escribirme.
.SH AUTHOR
Julio Serrano (mhysterio@gmail.com)