Compare commits

..

No commits in common. "master" and "1.0.0" have entirely different histories.

6 changed files with 21 additions and 69 deletions

1
.gitignore vendored
View File

@ -11,4 +11,3 @@ pom.xml.asc
.hgignore .hgignore
.hg/ .hg/
videos/ videos/
.DS_Store

View File

@ -1,67 +1,32 @@
# Auto video thumbnail # Usage
Watch and resize all the videos you deposit in one folder. 1) Create `config.yaml`.
<img width="100%" src="demo.gif">
# Install
1) Install Java.
Debian/Ubuntu
``` bash
sudo apt install default-jdk ffmpeg
```
Mac OS
``` bash
brew install openjdk
```
2) Create `config.yaml`.
``` bash ``` bash
extension_thumbnail: "_thumbnail.mp4" extension_thumbnail: "_thumbnail.mp4"
width_thumbnail: 600 width_thumbnail: 600
path_videos: "videos" path_videos: "videos"
audio_quality_thumbnail: 128
``` ```
3) Make folder `path_videos`. 2) Make folder `path_videos`.
``` bash ``` bash
mkdir videos mkdir videos
``` ```
4) Install `ffmpeg`. 3) Install `ffmpeg`.
5) Download the latest version (`video-optimize-{version}-SNAPSHOT-standalone.jar`). 4) Download the latest version (`video-optimize-{version}-standalone.jar`).
https://github.com/tanrax/auto-video-thumbnail/releases https://github.com/tanrax/auto-video-thumbnail/releases
6) Now you can execute. 5) Now you can execute.
``` bash ``` bash
java -jar video-optimize-{version}-SNAPSHOT-standalone.jar java $JVM_OPTS -cp video-optimize-{version}-standalone.jar clojure.main -m video-optimize.core
``` ```
or 6) Leave videos.
``` bash
java $JVM_OPTS -cp video-optimize-{version}-SNAPSHOT-standalone.jar clojure.main -m video-optimize.core
```
7) Leave videos in folder `videos`.
Everything you leave in the videos folder will be optimized for web with the specified resolution (600 px in this example). Everything you leave in the videos folder will be optimized for web with the specified resolution (600 px in this example).
example.mp4 -> example_thumbnail.mp4
# Tricks
## I just want to optimise, without resizing
Delete from your settings `width_thumbnail`.

View File

@ -1,4 +1,3 @@
extension_thumbnail: "_thumbnail.mp4" extension_thumbnail: "_thumbnail.mp4"
width_thumbnail: 600 width_thumbnail: 600
path_videos: "videos" path_videos: "videos"
audio_quality_thumbnail: 128

BIN
demo.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

View File

@ -1,4 +1,4 @@
(defproject video-optimize "1.0.4" (defproject video-optimize "1.0.0-SNAPSHOT"
:description "Watcher and optimize videos" :description "Watcher and optimize videos"
:url "http://example.com/FIXME" :url "http://example.com/FIXME"
:license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0" :license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"

View File

@ -1,5 +1,4 @@
(ns video-optimize.core (ns video-optimize.core
(:gen-class)
(:require (:require
[clojure.java.io :as io] [clojure.java.io :as io]
[clojure.string :as str] [clojure.string :as str]
@ -11,31 +10,21 @@
(def config (yaml/parse-string (slurp "config.yaml"))) (def config (yaml/parse-string (slurp "config.yaml")))
(def extension_thumbnail (:extension_thumbnail config)) (def extension_thumbnail (:extension_thumbnail config))
(def width_thumbnail (:width_thumbnail config)) (def width_thumbnail (:width_thumbnail config))
(def audio_quality_thumbnail (:audio_quality_thumbnail config))
(def path_videos (:path_videos config)) (def path_videos (:path_videos config))
(defn convertVideo
;; Optimize video
[e]
(let [path_raw (.getAbsolutePath (:file e))
is_thumbnail (doall (re-find (re-pattern extension_thumbnail) path_raw))
path_thumbnail (str (str/join "." ( drop-last (str/split path_raw #"\."))) extension_thumbnail)
path_thumbnail_temp (str "/tmp/" (last (str/split path_thumbnail #"\/")))]
(if (and (.exists (io/file path_raw)) (not is_thumbnail) (not (.exists (io/file path_thumbnail))))
(do
(prn (str "Optimizing: " path_raw))
(if (nil? width_thumbnail)
;; Not width, not scale
(shell/sh "ffmpeg" "-y" "-i" path_raw "-c:v" "libx264" "-c:a" "aac" "-ab" (str audio_quality_thumbnail) "-strict" "-2" path_thumbnail_temp)
;; With width, scale
(shell/sh "ffmpeg" "-y" "-i" path_raw "-vf" (str "scale=" width_thumbnail ":-2") "-c:v" "libx264" "-crf" "23" "-profile:v" "high" "-pix_fmt" "yuv420p" "-color_primaries" "1" "-color_trc" "1" "-colorspace" "1" "-movflags" "+faststart" "-an" "-c:a" "aac" "-ab" (str audio_quality_thumbnail) path_thumbnail_temp))
(shell/sh "mv" path_thumbnail_temp path_thumbnail)
(prn (str "Finish: " path_thumbnail))))))
(defn -main [& args] (defn -main [& args]
;; Watch ;; Watch
(hawk/watch! [{:paths [path_videos] (hawk/watch! [{:paths [path_videos]
:handler (fn [ctx e] :handler (fn [ctx e]
(convertVideo e))}]) (let [path_raw (.getAbsolutePath (:file e))
is_thumbnail (doall (re-find (re-pattern extension_thumbnail) path_raw))
path_thumbnail (str/join (concat (drop-last (str/split path_raw #"\.")) extension_thumbnail))]
(if (and (.exists (io/file path_raw)) (not is_thumbnail) (not (.exists (io/file path_thumbnail))))
(do
(prn (str "Optimizing: " path_raw))
;; Optimizing with ffmpeg
(shell/sh "ffmpeg" "-y" "-i" path_raw "-vf" (str "scale=" width_thumbnail ":-2") "-c:v" "libx264" "-crf" "23" "-profile:v" "high" "-pix_fmt" "yuv420p" "-color_primaries" "1" "-color_trc" "1" "-colorspace" "1" "-movflags" "+faststart" "-an" "-acodec" "aac" "-ab" "128kb" path_thumbnail)
(prn (str "Finish: " path_thumbnail))))
)
)}])
(println "Running: Feed me!")) (println "Running: Feed me!"))