diff --git a/Readme.org b/Readme.org new file mode 100644 index 0000000..d8d69fb --- /dev/null +++ b/Readme.org @@ -0,0 +1,99 @@ +#+title: Dvd Rip + +* How it works +This project is divided in two separate parts, +the =ripper= and the =transcoder=. + +The idea is to run the =ripper= manually, which just copies the inserted dvd, +then you =transfer= the files to the =transcoder=. +This can just be the one on your local machine, or you can have this project cloned onto a server, which then does the transcoding automatically 24/7. + +** Ripping +To do the ripping, enter the =ripper= directory and run ~./rip_dvd.py ~. +The most important argument is the type of the dvd, either =movie= or =series=, and the name of the movie or series you are ripping. + +*** Directory structure +#+begin_example +. +├── bell.oga # The sound to be played when ripping has finished +├── rip_dvd.py # The ripper script +├── rip.log # Logs all ripping attempts +├── ripped +│ ├── movie # The ripped movies +│ └── series # The ripped series +├── tmp # The ripped files while ripping has not yet finished. +│ # If the script has been terminated, this might not get deleted. +│ # In this case just remove it yourselves. +└── transfer_ripped.py # The transfer script +#+end_example + +** Transfer +To transfer the ripped files to the =transcoder=, enter the =ripper= directory and run ~./transfer_ripped.py~. +This will rsync all the ripped files to the ~$TRANSFER_DESTINATION_FOLDER~ (see [[*Configuration][Configuration]]) which may be on an external server which then will =transcode= them into video files. + +Note while the transfer is in progress, the script will create =movie_title.lock= files in source and destination folder to indicate the transfer is yet incomplete. +The transcoder will not try to transcode data for which the =.lock= file exists. + +** Transcoding +To transcode the ripped files, enter the =transcoder= directory, then run ~./transcode_dvd.py~. +This will try to transcode all the files in the =raw= folder and put the results in the =transcoded= folder. +While transcoding is in progress you can see the live log produced by handbrake by running ~tail -f raw/movie_title.log~. + +You can also run this in a systemd service. For this see the =video_transcoder.service.sample= file. + +*** Directory structure +#+begin_example +. +├── transcode_dvd.py # The transcode script +├── transcode.log # Logs all transcoding attempts +├── raw # The transfer_ripped.py script should transfer all ripped files here +│ ├── movie +│ └── series +├── transcoded +│ ├── movie # The transcoded movies +│ └── series # The transcoded series +├── tmp # The transcoded files while transcoding has not yet finished. +│ # In case of an error during transcoding, this might not get deleted. +│ # In this case just remove it yourselves. +└── video_transcoder.service.sample # The sample systemd service file +#+end_example + +*** Fixing transcoding errors +When there was an error transcoding you will see an =movie_title.err.log= file in the =raw= folder. +This will include the handbrake logs telling you what has gone wrong. +After you have fixed the error, delete the =movie_title.err.log= file and the =transcoder= will re-attempt transcoding of the movie on the next run. + +**** Series errors +When transcoding series, a common error is that there are more video tracks on the dvd than you specified there are episodes on the dvd. +Whether this is the case, you can see at the bottom of the =series_title.err.log= file. + +To fix this, find out which tracks correspond to the episodes on the dvd, then create a =series_title.titles= file in the =raw= folder. +In this file specify the track numbers one per line. + +For example your series file is called =Lost_S01_E01-04=, but the dvd has 5 tracks. +Assuming track 1 is just a bonus scene you do not want ripped, create =Lost_S01_E01-04.titles=: + +#+begin_example +2 +3 +4 +5 +#+end_example + +Then delete the =Lost_S01_E01-04.err.log= file and the transcoder will retry the transcoding using just titles 2-5 on its next run. + +* Configuration + Configuration is done via an =.env= file. For this, just do ~cp .env.sample .env~ and edit the =.env= file to your liking. + When using an server for transcoding, edit the =TRANSFER_DESTINATION_FOLDER= value. + Its default is to transfer the files to the =transcoder/raw= folder of the current project. + +* Dependencies +- dvdbackup (=ripper=) +- rsync (=ripper=) +- libnotify (=ripper=) +- handbrake (=transcoder=) +- python3 with dependencies listed in =requirements.txt= (both) + +** Nix dev-shell +If you use nix you can use the =flake.nix= via ~nix develop~. +In case you also use direnv, just run ~direnv allow .~. diff --git a/requirements.txt b/requirements.txt index 1953c75..3fea9d0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -# playsound +playsound # pygobject # dependency of playsound python-dotenv diff --git a/ripper/rip_dvd.py b/ripper/rip_dvd.py index 29a31cb..eddbfe6 100755 --- a/ripper/rip_dvd.py +++ b/ripper/rip_dvd.py @@ -63,7 +63,7 @@ def parse_args(): ) parser.add_argument( "title", - help='The title of the movie. Series must end with "Sx Ex-x". E.g.: "Lost S01 E1-04"', + help='The title of the movie. Series must end with "Sx Ex-x". E.g.: "Lost S01 E1-04" or "Lost_S2_E2"', ) parser.add_argument( "--dev",