Replaced byte way with timecode way. Added notify-send call.
This commit is contained in:
parent
91c60ab028
commit
1dc6dedb58
22 changed files with 668 additions and 82 deletions
|
@ -1,7 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<classpath>
|
<classpath>
|
||||||
<classpathentry kind="src" path="src"/>
|
<classpathentry kind="src" path="src"/>
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
|
|
||||||
<classpathentry kind="lib" path="lib/devinsy-utils-0.3.1-sources.zip"/>
|
<classpathentry kind="lib" path="lib/devinsy-utils-0.3.1-sources.zip"/>
|
||||||
<classpathentry kind="lib" path="lib/devinsy-utils-0.3.1.jar" sourcepath="lib/devinsy-utils-0.3.1-sources.zip"/>
|
<classpathentry kind="lib" path="lib/devinsy-utils-0.3.1.jar" sourcepath="lib/devinsy-utils-0.3.1-sources.zip"/>
|
||||||
<classpathentry kind="lib" path="lib/log4j-1.2.17-source.zip"/>
|
<classpathentry kind="lib" path="lib/log4j-1.2.17-source.zip"/>
|
||||||
|
@ -12,5 +11,11 @@
|
||||||
<classpathentry kind="lib" path="lib/slf4j-log4j12-1.7.5.jar"/>
|
<classpathentry kind="lib" path="lib/slf4j-log4j12-1.7.5.jar"/>
|
||||||
<classpathentry kind="lib" path="lib/forms-1.3.0.jar"/>
|
<classpathentry kind="lib" path="lib/forms-1.3.0.jar"/>
|
||||||
<classpathentry kind="lib" path="lib/miglayout15-swing.jar"/>
|
<classpathentry kind="lib" path="lib/miglayout15-swing.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/commons-lang3-3.7.jar" sourcepath="lib/commons-lang3-3.7-sources.jar"/>
|
||||||
|
<classpathentry kind="src" path="test"/>
|
||||||
|
<classpathentry kind="lib" path="lib/UnitTesting/jcommander-1.48.jar" sourcepath="lib/UnitTesting/jcommander-1.48-sources.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/UnitTesting/testng-6.9.10.jar" sourcepath="lib/UnitTesting/testng-6.9.10-sources.jar"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
|
||||||
|
<classpathentry kind="lib" path="lib/commons-io-2.5.jar" sourcepath="lib/commons-io-2.5-src.jar"/>
|
||||||
<classpathentry kind="output" path="bin"/>
|
<classpathentry kind="output" path="bin"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
|
|
6
.project
6
.project
|
@ -5,6 +5,11 @@
|
||||||
<projects>
|
<projects>
|
||||||
</projects>
|
</projects>
|
||||||
<buildSpec>
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.wst.common.project.facet.core.builder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
<buildCommand>
|
<buildCommand>
|
||||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
<arguments>
|
<arguments>
|
||||||
|
@ -13,5 +18,6 @@
|
||||||
</buildSpec>
|
</buildSpec>
|
||||||
<natures>
|
<natures>
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
|
||||||
</natures>
|
</natures>
|
||||||
</projectDescription>
|
</projectDescription>
|
||||||
|
|
|
@ -10,15 +10,16 @@ org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
|
||||||
org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
|
org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
|
||||||
org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
|
org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
|
||||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
|
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||||
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
||||||
org.eclipse.jdt.core.compiler.compliance=1.6
|
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||||
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
||||||
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
||||||
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
||||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
org.eclipse.jdt.core.compiler.source=1.6
|
org.eclipse.jdt.core.compiler.source=1.8
|
||||||
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
|
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
|
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
|
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
|
||||||
|
|
4
.settings/org.eclipse.wst.common.project.facet.core.xml
Normal file
4
.settings/org.eclipse.wst.common.project.facet.core.xml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<faceted-project>
|
||||||
|
<installed facet="java" version="1.8"/>
|
||||||
|
</faceted-project>
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
# Videocut
|
# Videocut
|
||||||
|
|
||||||
Videocut is a hugly hashing cutter for video files.
|
Videocut is a hashing cutter for video files.
|
||||||
|
|
||||||
## Author
|
## Author
|
||||||
Christian Pierre MOMON <christian.momon@devinsy.fr>
|
Christian Pierre MOMON <christian.momon@devinsy.fr>
|
||||||
|
@ -12,7 +12,7 @@ Videocut is released under the GNU AGPL license.
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
Videocut requires:
|
Videocut requires:
|
||||||
- Java 1.6
|
- Java 1.8
|
||||||
|
|
||||||
## Logo
|
## Logo
|
||||||
|
|
||||||
|
@ -22,4 +22,3 @@ Logo origin:
|
||||||
|
|
||||||
## Conclusion
|
## Conclusion
|
||||||
Enjoy and use FlatDB4GeoNames. For questions, improvement, issues: christian.momon@devinsy.fr
|
Enjoy and use FlatDB4GeoNames. For questions, improvement, issues: christian.momon@devinsy.fr
|
||||||
|
|
|
@ -9,13 +9,11 @@
|
||||||
<attribute name="Class-Path" value="."/>
|
<attribute name="Class-Path" value="."/>
|
||||||
</manifest>
|
</manifest>
|
||||||
<fileset dir="${basedir}/bin"/>
|
<fileset dir="${basedir}/bin"/>
|
||||||
<zipfileset excludes="META-INF/*.SF" src="${basedir}/lib/devinsy-utils-0.3.1-sources.zip"/>
|
<zipfileset excludes="META-INF/*.SF" src="${basedir}/lib/commons-io-2.5.jar"/>
|
||||||
|
<zipfileset excludes="META-INF/*.SF" src="${basedir}/lib/commons-lang3-3.7.jar"/>
|
||||||
<zipfileset excludes="META-INF/*.SF" src="${basedir}/lib/devinsy-utils-0.3.1.jar"/>
|
<zipfileset excludes="META-INF/*.SF" src="${basedir}/lib/devinsy-utils-0.3.1.jar"/>
|
||||||
<zipfileset excludes="META-INF/*.SF" src="${basedir}/lib/log4j-1.2.17-source.zip"/>
|
|
||||||
<zipfileset excludes="META-INF/*.SF" src="${basedir}/lib/log4j-1.2.17.jar"/>
|
<zipfileset excludes="META-INF/*.SF" src="${basedir}/lib/log4j-1.2.17.jar"/>
|
||||||
<zipfileset excludes="META-INF/*.SF" src="${basedir}/lib/slf4j-api-1.7.5-sources.jar"/>
|
|
||||||
<zipfileset excludes="META-INF/*.SF" src="${basedir}/lib/slf4j-api-1.7.5.jar"/>
|
<zipfileset excludes="META-INF/*.SF" src="${basedir}/lib/slf4j-api-1.7.5.jar"/>
|
||||||
<zipfileset excludes="META-INF/*.SF" src="${basedir}/lib/slf4j-log4j12-1.7.5-sources.jar"/>
|
|
||||||
<zipfileset excludes="META-INF/*.SF" src="${basedir}/lib/slf4j-log4j12-1.7.5.jar"/>
|
<zipfileset excludes="META-INF/*.SF" src="${basedir}/lib/slf4j-log4j12-1.7.5.jar"/>
|
||||||
<zipfileset excludes="META-INF/*.SF" src="${basedir}/lib/forms-1.3.0.jar"/>
|
<zipfileset excludes="META-INF/*.SF" src="${basedir}/lib/forms-1.3.0.jar"/>
|
||||||
<zipfileset excludes="META-INF/*.SF" src="${basedir}/lib/miglayout15-swing.jar"/>
|
<zipfileset excludes="META-INF/*.SF" src="${basedir}/lib/miglayout15-swing.jar"/>
|
||||||
|
|
BIN
dist/videocut.jar
vendored
BIN
dist/videocut.jar
vendored
Binary file not shown.
BIN
lib/UnitTesting/jcommander-1.48-sources.jar
Normal file
BIN
lib/UnitTesting/jcommander-1.48-sources.jar
Normal file
Binary file not shown.
BIN
lib/UnitTesting/jcommander-1.48.jar
Normal file
BIN
lib/UnitTesting/jcommander-1.48.jar
Normal file
Binary file not shown.
283
lib/UnitTesting/jcommander-1.48.pom
Normal file
283
lib/UnitTesting/jcommander-1.48.pom
Normal file
|
@ -0,0 +1,283 @@
|
||||||
|
<!--
|
||||||
|
|
||||||
|
Copyright (C) 2010 the original author or authors.
|
||||||
|
See the notice.md file distributed with this work for additional
|
||||||
|
information regarding copyright ownership.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>com.beust</groupId>
|
||||||
|
<artifactId>jcommander</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<name>JCommander</name>
|
||||||
|
<version>1.48</version>
|
||||||
|
<description>A Java framework to parse command line options with annotations.</description>
|
||||||
|
<url>http://beust.com/jcommander</url>
|
||||||
|
<licenses>
|
||||||
|
<license>
|
||||||
|
<name>The Apache Software License, Version 2.0</name>
|
||||||
|
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
|
||||||
|
<distribution>repo</distribution>
|
||||||
|
</license>
|
||||||
|
</licenses>
|
||||||
|
<scm>
|
||||||
|
<connection>scm:git:git@github.com:cbeust/jcommander.git</connection>
|
||||||
|
<developerConnection>scm:git:git@github.com:cbeust/jcommander.git</developerConnection>
|
||||||
|
<url>git@github.com:cbeust/jcommander.git</url>
|
||||||
|
</scm>
|
||||||
|
|
||||||
|
<distributionManagement>
|
||||||
|
<repository>
|
||||||
|
<id>sonatype-nexus-staging</id>
|
||||||
|
<name>Nexus Staging Repository</name>
|
||||||
|
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
|
||||||
|
</repository>
|
||||||
|
</distributionManagement>
|
||||||
|
|
||||||
|
<developers>
|
||||||
|
<developer>
|
||||||
|
<name>Cedric Beust</name>
|
||||||
|
</developer>
|
||||||
|
</developers>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>org.sonatype.oss</groupId>
|
||||||
|
<artifactId>oss-parent</artifactId>
|
||||||
|
<version>3</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
|
||||||
|
<!-- Bundle sources -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-source-plugin</artifactId>
|
||||||
|
<version>2.1.1</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-sources</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- Compilation -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>2.3.1</version>
|
||||||
|
<configuration>
|
||||||
|
<source>1.5</source>
|
||||||
|
<target>1.5</target>
|
||||||
|
<encoding>UTF-8</encoding>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- Resource handling -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
|
<version>2.4.1</version>
|
||||||
|
<configuration>
|
||||||
|
<encoding>UTF-8</encoding>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- OSGi manifest creation -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.felix</groupId>
|
||||||
|
<artifactId>maven-bundle-plugin</artifactId>
|
||||||
|
<version>2.1.0</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>bundle-manifest</id>
|
||||||
|
<phase>process-classes</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>manifest</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<instructions>
|
||||||
|
<_versionpolicy>$(@)</_versionpolicy>
|
||||||
|
</instructions>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- Add OSGi manifest in JAR -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
|
<version>2.3.1</version>
|
||||||
|
<configuration>
|
||||||
|
<archive>
|
||||||
|
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
|
||||||
|
</archive>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- Tests -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>2.10</version>
|
||||||
|
<configuration>
|
||||||
|
<skipTests>true</skipTests>
|
||||||
|
</configuration>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.beust</groupId>
|
||||||
|
<artifactId>jcommander</artifactId>
|
||||||
|
<version>1.30</version>
|
||||||
|
<!--
|
||||||
|
<version>${project.version}</version>
|
||||||
|
-->
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- Generating Javadoc -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<version>2.7</version>
|
||||||
|
<configuration>
|
||||||
|
<excludePackageNames>*.internal</excludePackageNames>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
<pluginManagement>
|
||||||
|
<plugins>
|
||||||
|
<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.eclipse.m2e</groupId>
|
||||||
|
<artifactId>lifecycle-mapping</artifactId>
|
||||||
|
<version>1.0.0</version>
|
||||||
|
<configuration>
|
||||||
|
<lifecycleMappingMetadata>
|
||||||
|
<pluginExecutions>
|
||||||
|
<pluginExecution>
|
||||||
|
<pluginExecutionFilter>
|
||||||
|
<groupId>org.apache.felix</groupId>
|
||||||
|
<artifactId>
|
||||||
|
maven-bundle-plugin
|
||||||
|
</artifactId>
|
||||||
|
<versionRange>
|
||||||
|
[2.1.0,)
|
||||||
|
</versionRange>
|
||||||
|
<goals>
|
||||||
|
<goal>manifest</goal>
|
||||||
|
</goals>
|
||||||
|
</pluginExecutionFilter>
|
||||||
|
<action>
|
||||||
|
<ignore />
|
||||||
|
</action>
|
||||||
|
</pluginExecution>
|
||||||
|
</pluginExecutions>
|
||||||
|
</lifecycleMappingMetadata>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</pluginManagement>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.testng</groupId>
|
||||||
|
<artifactId>testng</artifactId>
|
||||||
|
<version>6.1.1</version>
|
||||||
|
<type>jar</type>
|
||||||
|
<scope>test</scope>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>jcommander</artifactId>
|
||||||
|
<groupId>com.beust</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<profiles>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Do a license check by running : mvn -P license license:check
|
||||||
|
UPdate the license check by running : mvn -P license license:format
|
||||||
|
-->
|
||||||
|
<profile>
|
||||||
|
<id>license</id>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>com.mycila.maven-license-plugin</groupId>
|
||||||
|
<artifactId>maven-license-plugin</artifactId>
|
||||||
|
<version>1.7.0</version>
|
||||||
|
<configuration>
|
||||||
|
<quiet>false</quiet>
|
||||||
|
<header>src/main/license/license-header.txt</header>
|
||||||
|
<includes>
|
||||||
|
<include>src/**</include>
|
||||||
|
<include>pom.xml</include>
|
||||||
|
</includes>
|
||||||
|
<excludes>
|
||||||
|
<exclude>**/.git/**</exclude>
|
||||||
|
<!-- ignore files produced during a build -->
|
||||||
|
<exclude>**/target/**</exclude>
|
||||||
|
</excludes>
|
||||||
|
<useDefaultExcludes>false</useDefaultExcludes>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>check</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
<!-- Signing with gpg -->
|
||||||
|
<!--
|
||||||
|
Sign the artifacts by calling
|
||||||
|
mvn -P sign [..]
|
||||||
|
-->
|
||||||
|
<profile>
|
||||||
|
<id>sign</id>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-gpg-plugin</artifactId>
|
||||||
|
<version>1.4</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>sign-artifacts</id>
|
||||||
|
<phase>verify</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>sign</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
|
||||||
|
</project>
|
BIN
lib/UnitTesting/testng-6.9.10-sources.jar
Normal file
BIN
lib/UnitTesting/testng-6.9.10-sources.jar
Normal file
Binary file not shown.
BIN
lib/UnitTesting/testng-6.9.10.jar
Normal file
BIN
lib/UnitTesting/testng-6.9.10.jar
Normal file
Binary file not shown.
49
lib/UnitTesting/testng-6.9.10.pom
Normal file
49
lib/UnitTesting/testng-6.9.10.pom
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>org.testng</groupId>
|
||||||
|
<artifactId>testng</artifactId>
|
||||||
|
<version>6.9.10</version>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.beanshell</groupId>
|
||||||
|
<artifactId>bsh</artifactId>
|
||||||
|
<version>2.0b4</version>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.beust</groupId>
|
||||||
|
<artifactId>jcommander</artifactId>
|
||||||
|
<version>1.48</version>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.ant</groupId>
|
||||||
|
<artifactId>ant</artifactId>
|
||||||
|
<version>1.7.0</version>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.10</version>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.yaml</groupId>
|
||||||
|
<artifactId>snakeyaml</artifactId>
|
||||||
|
<version>1.15</version>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.inject</groupId>
|
||||||
|
<artifactId>guice</artifactId>
|
||||||
|
<version>4.0</version>
|
||||||
|
<classifier>no_aop</classifier>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
BIN
lib/commons-io-2.5-src.jar
Normal file
BIN
lib/commons-io-2.5-src.jar
Normal file
Binary file not shown.
BIN
lib/commons-io-2.5.jar
Normal file
BIN
lib/commons-io-2.5.jar
Normal file
Binary file not shown.
BIN
lib/commons-lang3-3.7-sources.jar
Normal file
BIN
lib/commons-lang3-3.7-sources.jar
Normal file
Binary file not shown.
BIN
lib/commons-lang3-3.7.jar
Normal file
BIN
lib/commons-lang3-3.7.jar
Normal file
Binary file not shown.
|
@ -60,54 +60,54 @@ public class VideoCutCLI
|
||||||
|
|
||||||
switch (c)
|
switch (c)
|
||||||
{
|
{
|
||||||
// Start keys.
|
// Start keys.
|
||||||
case 'a':
|
case 'a':
|
||||||
data.incStart(-VideoData.HUNDRED_MEGA);
|
data.incStart(-VideoData.TWO_MINUTES);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'z':
|
case 'z':
|
||||||
data.incStart(VideoData.HUNDRED_MEGA);
|
data.incStart(VideoData.TWO_MINUTES);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'e':
|
case 'e':
|
||||||
data.incStart(-VideoData.TEN_MEGA);
|
data.incStart(-VideoData.TEN_SECONDS);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'r':
|
case 'r':
|
||||||
data.incStart(VideoData.TEN_MEGA);
|
data.incStart(VideoData.TEN_SECONDS);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 't':
|
case 't':
|
||||||
data.incStart(-VideoData.ONE_MEGA);
|
data.incStart(-VideoData.ONE_SECOND);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'y':
|
case 'y':
|
||||||
data.incStart(VideoData.ONE_MEGA);
|
data.incStart(VideoData.ONE_SECOND);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// End keys.
|
// End keys.
|
||||||
case 'q':
|
case 'q':
|
||||||
data.incEnd(-VideoData.HUNDRED_MEGA);
|
data.incEnd(-VideoData.TWO_MINUTES);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 's':
|
case 's':
|
||||||
data.incEnd(VideoData.HUNDRED_MEGA);
|
data.incEnd(VideoData.TWO_MINUTES);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'd':
|
case 'd':
|
||||||
data.incEnd(-VideoData.TEN_MEGA);
|
data.incEnd(-VideoData.TEN_SECONDS);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'f':
|
case 'f':
|
||||||
data.incEnd(VideoData.TEN_MEGA);
|
data.incEnd(VideoData.TEN_SECONDS);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'g':
|
case 'g':
|
||||||
data.incEnd(-VideoData.ONE_MEGA);
|
data.incEnd(-VideoData.ONE_SECOND);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'h':
|
case 'h':
|
||||||
data.incEnd(VideoData.ONE_MEGA);
|
data.incEnd(VideoData.ONE_SECOND);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Control keys.
|
// Control keys.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/**
|
/**
|
||||||
* Copyright (C) 2016-2018 Christian Pierre MOMON <christian.momon@devinsy.fr>
|
* Copyright (C) 2016-2019 Christian Pierre MOMON <christian.momon@devinsy.fr>
|
||||||
*
|
*
|
||||||
* This file is part of Videocut.
|
* This file is part of Videocut.
|
||||||
*
|
*
|
||||||
|
@ -84,87 +84,91 @@ public class VideoCutGUI extends JFrame
|
||||||
//
|
//
|
||||||
switch (event.getKeyChar())
|
switch (event.getKeyChar())
|
||||||
{
|
{
|
||||||
// Start keys.
|
// Start keys.
|
||||||
case 'a':
|
case 'a':
|
||||||
VideoCutGUI.this.data.incStart(-VideoData.HUNDRED_MEGA);
|
VideoCutGUI.this.data.incStart(-VideoData.TWO_MINUTES);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'z':
|
case 'z':
|
||||||
VideoCutGUI.this.data.incStart(VideoData.HUNDRED_MEGA);
|
VideoCutGUI.this.data.incStart(VideoData.TWO_MINUTES);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'e':
|
case 'e':
|
||||||
VideoCutGUI.this.data.incStart(-VideoData.TEN_MEGA);
|
VideoCutGUI.this.data.incStart(-VideoData.TEN_SECONDS);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'r':
|
case 'r':
|
||||||
VideoCutGUI.this.data.incStart(VideoData.TEN_MEGA);
|
VideoCutGUI.this.data.incStart(VideoData.TEN_SECONDS);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 't':
|
case 't':
|
||||||
VideoCutGUI.this.data.incStart(-VideoData.ONE_MEGA);
|
VideoCutGUI.this.data.incStart(-VideoData.ONE_SECOND);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'y':
|
case 'y':
|
||||||
VideoCutGUI.this.data.incStart(VideoData.ONE_MEGA);
|
VideoCutGUI.this.data.incStart(VideoData.ONE_SECOND);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'u':
|
||||||
|
VideoCutGUI.this.data.incStart(-VideoData.ONE_TENTH);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'i':
|
||||||
|
VideoCutGUI.this.data.incStart(VideoData.ONE_TENTH);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// End keys.
|
// End keys.
|
||||||
case 'q':
|
case 'q':
|
||||||
VideoCutGUI.this.data.incEnd(-VideoData.HUNDRED_MEGA);
|
VideoCutGUI.this.data.incEnd(-VideoData.TWO_MINUTES);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 's':
|
case 's':
|
||||||
VideoCutGUI.this.data.incEnd(VideoData.HUNDRED_MEGA);
|
VideoCutGUI.this.data.incEnd(VideoData.TWO_MINUTES);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'd':
|
case 'd':
|
||||||
VideoCutGUI.this.data.incEnd(-VideoData.TEN_MEGA);
|
VideoCutGUI.this.data.incEnd(-VideoData.TEN_SECONDS);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'f':
|
case 'f':
|
||||||
VideoCutGUI.this.data.incEnd(VideoData.TEN_MEGA);
|
VideoCutGUI.this.data.incEnd(VideoData.TEN_SECONDS);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'g':
|
case 'g':
|
||||||
VideoCutGUI.this.data.incEnd(-VideoData.ONE_MEGA);
|
VideoCutGUI.this.data.incEnd(-VideoData.ONE_SECOND);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'h':
|
case 'h':
|
||||||
VideoCutGUI.this.data.incEnd(VideoData.ONE_MEGA);
|
VideoCutGUI.this.data.incEnd(VideoData.ONE_SECOND);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'j':
|
||||||
|
VideoCutGUI.this.data.incEnd(-VideoData.ONE_TENTH);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'k':
|
||||||
|
VideoCutGUI.this.data.incEnd(VideoData.ONE_TENTH);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Control keys.
|
// Control keys.
|
||||||
case 'o':
|
case 'o':
|
||||||
{
|
{
|
||||||
String command = String.format("tail -c +%d %s | mplayer -geometry 1024x768 -", VideoCutGUI.this.data.getStart(), VideoCutGUI.this.data.getEscapedFileName());
|
VideoCutUtils.playVideo(VideoCutGUI.this.data.getEscapedFileName(), VideoCutGUI.this.data.getStart());
|
||||||
System.out.println("command=[" + command + "@]");
|
|
||||||
String log;
|
|
||||||
|
|
||||||
log = CmdExec.run("bash", "-c", command);
|
|
||||||
|
|
||||||
System.out.println("log=[" + log + "]");
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'p':
|
case 'p':
|
||||||
{
|
{
|
||||||
String command = String.format("tail -c +%d %s | mplayer -geometry 1024x768 -", VideoCutGUI.this.data.getEnd(), VideoCutGUI.this.data.getEscapedFileName());
|
VideoCutUtils.playVideo(VideoCutGUI.this.data.getEscapedFileName(), VideoCutGUI.this.data.getEnd());
|
||||||
String log = CmdExec.run("bash", "-c", command);
|
|
||||||
|
|
||||||
System.out.println("log=[" + log + "]");
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'm':
|
case 'm':
|
||||||
{
|
{
|
||||||
VideoCutGUI.this.txtfldStatus.setText("Making");
|
VideoCutGUI.this.txtfldStatus.setText("Making");
|
||||||
String command = String.format("head -c %d %s | tail -c +%d > t", VideoCutGUI.this.data.getEnd(), VideoCutGUI.this.data.getEscapedFileName(),
|
VideoCutUtils.cut(VideoCutGUI.this.data.getEscapedFileName(), VideoCutGUI.this.data.getStart(), VideoCutGUI.this.data.getEnd());
|
||||||
VideoCutGUI.this.data.getStart());
|
VideoCutUtils.notify("Cut done.");
|
||||||
String log = CmdExec.run("bash", "-c", command);
|
|
||||||
|
|
||||||
VideoCutGUI.this.txtfldStatus.setText("Made");
|
VideoCutGUI.this.txtfldStatus.setText("Made");
|
||||||
System.out.println("log=[" + log + "]");
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -202,7 +206,7 @@ public class VideoCutGUI extends JFrame
|
||||||
});
|
});
|
||||||
|
|
||||||
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||||
setBounds(100, 100, 700, 400);
|
setBounds(100, 100, 720, 400);
|
||||||
|
|
||||||
JMenuBar menuBar = new JMenuBar();
|
JMenuBar menuBar = new JMenuBar();
|
||||||
setJMenuBar(menuBar);
|
setJMenuBar(menuBar);
|
||||||
|
@ -229,12 +233,13 @@ public class VideoCutGUI extends JFrame
|
||||||
this.contentPane = new JPanel();
|
this.contentPane = new JPanel();
|
||||||
this.contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
|
this.contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
|
||||||
setContentPane(this.contentPane);
|
setContentPane(this.contentPane);
|
||||||
this.contentPane.setLayout(new FormLayout(new ColumnSpec[] { FormFactory.RELATED_GAP_COLSPEC, FormFactory.DEFAULT_COLSPEC, FormFactory.RELATED_GAP_COLSPEC, ColumnSpec.decode("default:grow"),
|
this.contentPane.setLayout(new FormLayout(
|
||||||
FormFactory.RELATED_GAP_COLSPEC, }, new RowSpec[] { FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
|
new ColumnSpec[] { FormFactory.RELATED_GAP_COLSPEC, FormFactory.DEFAULT_COLSPEC, FormFactory.RELATED_GAP_COLSPEC, ColumnSpec.decode("default:grow"), FormFactory.RELATED_GAP_COLSPEC, },
|
||||||
FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC,
|
new RowSpec[] { FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC,
|
||||||
FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
|
FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
|
||||||
FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC,
|
FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC,
|
||||||
FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, }));
|
FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
|
||||||
|
FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, }));
|
||||||
|
|
||||||
JLabel lblFile = new JLabel("File:");
|
JLabel lblFile = new JLabel("File:");
|
||||||
lblFile.setFocusable(false);
|
lblFile.setFocusable(false);
|
||||||
|
@ -272,10 +277,10 @@ public class VideoCutGUI extends JFrame
|
||||||
JLabel lblCommands = new JLabel("Keyboard actions:");
|
JLabel lblCommands = new JLabel("Keyboard actions:");
|
||||||
this.contentPane.add(lblCommands, "4, 10");
|
this.contentPane.add(lblCommands, "4, 10");
|
||||||
|
|
||||||
JLabel lblStartPointA = new JLabel(" start point: a z (-/+ 100 MB), e r (-/+ 10 MB), t y (-/+ 1 MB)");
|
JLabel lblStartPointA = new JLabel(" start point: a z (-/+ 2 min), e r (-/+ 10 s), t y (-/+ 1 s), u i (-/+ 0,1 s)");
|
||||||
this.contentPane.add(lblStartPointA, "4, 12");
|
this.contentPane.add(lblStartPointA, "4, 12");
|
||||||
|
|
||||||
JLabel lblEndPointQ = new JLabel(" end point: q s (-/+ 100 MB), d f (-/+ 10 MB), g h (-/+ 1 MB)");
|
JLabel lblEndPointQ = new JLabel(" end point: q s (-/+ 2 min), d f (-/+ 10 s), g h (-/+ 1 s), j k (-/+ 0,1 s)");
|
||||||
this.contentPane.add(lblEndPointQ, "4, 14");
|
this.contentPane.add(lblEndPointQ, "4, 14");
|
||||||
|
|
||||||
JLabel lblH = new JLabel(" show from start point: o");
|
JLabel lblH = new JLabel(" show from start point: o");
|
||||||
|
|
166
src/fr/devinsy/videocut/VideoCutUtils.java
Normal file
166
src/fr/devinsy/videocut/VideoCutUtils.java
Normal file
|
@ -0,0 +1,166 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2019 Christian Pierre MOMON <christian.momon@devinsy.fr>
|
||||||
|
*
|
||||||
|
* This file is part of Videocut.
|
||||||
|
*
|
||||||
|
* Videocut is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Videocut 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 Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with Videocut. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.videocut;
|
||||||
|
|
||||||
|
import org.apache.commons.io.FilenameUtils;
|
||||||
|
|
||||||
|
import fr.devinsy.util.cmdexec.CmdExec;
|
||||||
|
import fr.devinsy.util.cmdexec.CmdExecException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Class VideoCut.
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class VideoCutUtils
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param videoFileName
|
||||||
|
* @param startTime
|
||||||
|
* @param endTime
|
||||||
|
* @throws CmdExecException
|
||||||
|
*/
|
||||||
|
public static void cut(final String videoFileName, final double startTime, final double endTime) throws CmdExecException
|
||||||
|
{
|
||||||
|
String targetFileName = "t." + FilenameUtils.getExtension(videoFileName);
|
||||||
|
|
||||||
|
String command = String.format("ffmpeg -v quiet -y -i %s -ss %S -t %s -codec copy -map 0 %s ", videoFileName, startTime, endTime - startTime, targetFileName);
|
||||||
|
String log = CmdExec.run("bash", "-c", command);
|
||||||
|
|
||||||
|
System.out.println("log=[" + log + "]");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param videoFileName
|
||||||
|
* @param start
|
||||||
|
* @param end
|
||||||
|
* @throws CmdExecException
|
||||||
|
*/
|
||||||
|
public static void cutByByte(final String videoFileName, final long start, final long end) throws CmdExecException
|
||||||
|
{
|
||||||
|
String command = String.format("head -c %d %s | tail -c +%d > t", end, videoFileName, start);
|
||||||
|
String log = CmdExec.run("bash", "-c", command);
|
||||||
|
|
||||||
|
System.out.println("log=[" + log + "]");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Human time.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* the source
|
||||||
|
* @return the string
|
||||||
|
*/
|
||||||
|
public static String humanTimeCode(final double value)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
double hours = Math.floor(value / (60 * 60));
|
||||||
|
double minutes = Math.floor((value - hours * 60 * 60) / 60);
|
||||||
|
double seconds = Math.floor(value - hours * 60 * 60 - minutes * 60);
|
||||||
|
double micros = (value - Math.floor(value)) * 1000000;
|
||||||
|
|
||||||
|
result = String.format("%02.0f:%02.0f:%02.0f.%06.0f", hours, minutes, seconds, micros);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param text
|
||||||
|
* @throws CmdExecException
|
||||||
|
*/
|
||||||
|
public static void notify(final String text) throws CmdExecException
|
||||||
|
{
|
||||||
|
String command = String.format("notify-send -i '/usr/share/icons/gnome/32x32/actions/editcut.png' 'VideoCut' '%s'", text);
|
||||||
|
System.out.println("command=[" + command + "]");
|
||||||
|
String log;
|
||||||
|
|
||||||
|
log = CmdExec.run("bash", "-c", command);
|
||||||
|
|
||||||
|
System.out.println("log=[" + log + "]");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param videoFileName
|
||||||
|
* @param startByte
|
||||||
|
* @throws CmdExecException
|
||||||
|
*/
|
||||||
|
public static void playVideo(final String videoFileName, final double startByte) throws CmdExecException
|
||||||
|
{
|
||||||
|
String command = String.format("ffmpeg -v quiet -i %s -ss %s -vcodec copy -acodec copy -f avi - | mplayer -geometry 1024x768 -", videoFileName, VideoCutUtils.humanTimeCode(startByte));
|
||||||
|
System.out.println("command=[" + command + "@]");
|
||||||
|
String log;
|
||||||
|
|
||||||
|
log = CmdExec.run("bash", "-c", command);
|
||||||
|
|
||||||
|
System.out.println("log=[" + log + "]");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Play at byte.
|
||||||
|
*
|
||||||
|
* @param videoFileName
|
||||||
|
* the video file name
|
||||||
|
* @param startByte
|
||||||
|
* the start byte
|
||||||
|
* @throws CmdExecException
|
||||||
|
* the cmd exec exception
|
||||||
|
*/
|
||||||
|
public static void playVideoAtByte(final String videoFileName, final double startByte) throws CmdExecException
|
||||||
|
{
|
||||||
|
String command = String.format("tail -c +%d %s | mplayer -geometry 1024x768 -", startByte, videoFileName);
|
||||||
|
System.out.println("command=[" + command + "@]");
|
||||||
|
String log;
|
||||||
|
|
||||||
|
log = CmdExec.run("bash", "-c", command);
|
||||||
|
|
||||||
|
System.out.println("log=[" + log + "]");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Video duration.
|
||||||
|
*
|
||||||
|
* ffprobe -i foo.m2ts -show_format -v quiet | grep duration | sed s/[^0-9\.]//g
|
||||||
|
*
|
||||||
|
* @param videoFile
|
||||||
|
* the video file
|
||||||
|
* @return the double
|
||||||
|
* @throws CmdExecException
|
||||||
|
* the cmd exec exception
|
||||||
|
*/
|
||||||
|
public static double videoDuration(final String videoFileName) throws CmdExecException
|
||||||
|
{
|
||||||
|
double result;
|
||||||
|
|
||||||
|
String command = String.format("ffprobe -i %s -show_format -v quiet | grep duration | sed s/[^0-9\\.]//g", videoFileName);
|
||||||
|
System.out.println("command=[" + command + "]");
|
||||||
|
String log;
|
||||||
|
|
||||||
|
log = CmdExec.run("bash", "-c", command);
|
||||||
|
|
||||||
|
System.out.println("log=[" + log + "]");
|
||||||
|
|
||||||
|
result = Double.parseDouble(log);
|
||||||
|
System.out.println("ret=[" + result + "]");
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,6 +20,8 @@ package fr.devinsy.videocut;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
|
import fr.devinsy.util.cmdexec.CmdExecException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class VideoData.
|
* The Class VideoData.
|
||||||
*
|
*
|
||||||
|
@ -27,27 +29,39 @@ import java.io.File;
|
||||||
*/
|
*/
|
||||||
public class VideoData
|
public class VideoData
|
||||||
{
|
{
|
||||||
public static final long ONE_MEGA = 1024 * 1024;
|
public static final double ONE_TENTH = 0.1;
|
||||||
public static final long TEN_MEGA = 10 * 1024 * 1024;
|
public static final double ONE_SECOND = 1;
|
||||||
public static final long HUNDRED_MEGA = 100 * 1024 * 1024;
|
public static final double TEN_SECONDS = 10;
|
||||||
|
public static final double TWO_MINUTES = 120;
|
||||||
|
|
||||||
private String escapedFileName;
|
private String escapedFileName;
|
||||||
private File source;
|
private File source;
|
||||||
private long start;
|
private double sourceEnd;
|
||||||
private long end;
|
private double start;
|
||||||
|
private double end;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new video data.
|
* Instantiates a new video data.
|
||||||
*
|
*
|
||||||
* @param source
|
* @param source
|
||||||
* the source
|
* the source
|
||||||
|
* @throws CmdExecException
|
||||||
*/
|
*/
|
||||||
public VideoData(final File source)
|
public VideoData(final File source)
|
||||||
{
|
{
|
||||||
this.source = source;
|
this.source = source;
|
||||||
this.escapedFileName = escape(source.getAbsolutePath());
|
this.escapedFileName = escape(source.getAbsolutePath());
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.sourceEnd = VideoCutUtils.videoDuration(this.escapedFileName);
|
||||||
|
}
|
||||||
|
catch (CmdExecException exception)
|
||||||
|
{
|
||||||
|
exception.printStackTrace();
|
||||||
|
this.sourceEnd = 0;
|
||||||
|
}
|
||||||
this.start = 0;
|
this.start = 0;
|
||||||
this.end = source.length();
|
this.end = this.sourceEnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -55,7 +69,7 @@ public class VideoData
|
||||||
*
|
*
|
||||||
* @return the end
|
* @return the end
|
||||||
*/
|
*/
|
||||||
public long getEnd()
|
public double getEnd()
|
||||||
{
|
{
|
||||||
return this.end;
|
return this.end;
|
||||||
}
|
}
|
||||||
|
@ -85,7 +99,7 @@ public class VideoData
|
||||||
*
|
*
|
||||||
* @return the start
|
* @return the start
|
||||||
*/
|
*/
|
||||||
public long getStart()
|
public double getStart()
|
||||||
{
|
{
|
||||||
return this.start;
|
return this.start;
|
||||||
}
|
}
|
||||||
|
@ -96,22 +110,22 @@ public class VideoData
|
||||||
* @param value
|
* @param value
|
||||||
* the value
|
* the value
|
||||||
*/
|
*/
|
||||||
public void incEnd(final long value)
|
public void incEnd(final double value)
|
||||||
{
|
{
|
||||||
this.end += value;
|
this.end += value;
|
||||||
|
|
||||||
if (this.end < this.start)
|
if (this.end < this.start)
|
||||||
{
|
{
|
||||||
this.end = this.start + ONE_MEGA;
|
this.end = this.start + ONE_SECOND;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.end < 0)
|
if (this.end < 0)
|
||||||
{
|
{
|
||||||
this.end = ONE_MEGA;
|
this.end = ONE_SECOND;
|
||||||
}
|
}
|
||||||
else if (this.end > this.source.length())
|
else if (this.end > this.sourceEnd)
|
||||||
{
|
{
|
||||||
this.end = this.source.length();
|
this.end = this.sourceEnd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,13 +135,13 @@ public class VideoData
|
||||||
* @param value
|
* @param value
|
||||||
* the value
|
* the value
|
||||||
*/
|
*/
|
||||||
public void incStart(final long value)
|
public void incStart(final double value)
|
||||||
{
|
{
|
||||||
this.start += value;
|
this.start += value;
|
||||||
|
|
||||||
if (this.start > this.end)
|
if (this.start > this.end)
|
||||||
{
|
{
|
||||||
this.start = this.end - ONE_MEGA;
|
this.start = this.end - ONE_SECOND;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.start < 0)
|
if (this.start < 0)
|
||||||
|
@ -136,7 +150,7 @@ public class VideoData
|
||||||
}
|
}
|
||||||
else if (this.start > this.source.length())
|
else if (this.start > this.source.length())
|
||||||
{
|
{
|
||||||
this.start = this.source.length() - ONE_MEGA;
|
this.start = this.source.length() - ONE_SECOND;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,7 +160,7 @@ public class VideoData
|
||||||
* @param end
|
* @param end
|
||||||
* the new end
|
* the new end
|
||||||
*/
|
*/
|
||||||
public void setEnd(final long end)
|
public void setEnd(final double end)
|
||||||
{
|
{
|
||||||
this.end = end;
|
this.end = end;
|
||||||
}
|
}
|
||||||
|
@ -168,7 +182,7 @@ public class VideoData
|
||||||
* @param start
|
* @param start
|
||||||
* the new start
|
* the new start
|
||||||
*/
|
*/
|
||||||
public void setStart(final long start)
|
public void setStart(final double start)
|
||||||
{
|
{
|
||||||
this.start = start;
|
this.start = start;
|
||||||
}
|
}
|
||||||
|
@ -181,7 +195,8 @@ public class VideoData
|
||||||
{
|
{
|
||||||
String result;
|
String result;
|
||||||
|
|
||||||
result = String.format("[%,dMB ; %,dMB ] %,dMB / %,dMB", this.start / 1024, this.end / 1024, (this.end - this.start) / 1024, this.source.length() / 1024);
|
result = String.format("[%s ; %s ] %s / %s (-%s)", VideoCutUtils.humanTimeCode(this.start), VideoCutUtils.humanTimeCode(this.end), VideoCutUtils.humanTimeCode(this.end - this.start),
|
||||||
|
VideoCutUtils.humanTimeCode(this.sourceEnd), VideoCutUtils.humanTimeCode(this.sourceEnd - (this.end - this.start)));
|
||||||
|
|
||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
|
|
55
test/fr/devinsy/videocut/utils/VideoCutUtilsTest.java
Normal file
55
test/fr/devinsy/videocut/utils/VideoCutUtilsTest.java
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
package fr.devinsy.videocut.utils;
|
||||||
|
|
||||||
|
import org.testng.Assert;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import fr.devinsy.videocut.VideoCutUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author cpm
|
||||||
|
*/
|
||||||
|
public class VideoCutUtilsTest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void aFooTest()
|
||||||
|
{
|
||||||
|
Assert.assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Human time code test.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void humanTimeCodeTest()
|
||||||
|
{
|
||||||
|
double value = 0.178;
|
||||||
|
System.out.println(String.format("%10s", value) + " -> " + VideoCutUtils.humanTimeCode(value));
|
||||||
|
|
||||||
|
value = 5.178;
|
||||||
|
System.out.println(String.format("%10s", value) + " -> " + VideoCutUtils.humanTimeCode(value));
|
||||||
|
|
||||||
|
value = 59.178;
|
||||||
|
System.out.println(String.format("%10s", value) + " -> " + VideoCutUtils.humanTimeCode(value));
|
||||||
|
|
||||||
|
value = 65.178;
|
||||||
|
System.out.println(String.format("%10s", value) + " -> " + VideoCutUtils.humanTimeCode(value));
|
||||||
|
|
||||||
|
value = 3500.178;
|
||||||
|
System.out.println(String.format("%10s", value) + " -> " + VideoCutUtils.humanTimeCode(value));
|
||||||
|
|
||||||
|
value = 3700.178;
|
||||||
|
System.out.println(String.format("%10s", value) + " -> " + VideoCutUtils.humanTimeCode(value));
|
||||||
|
|
||||||
|
value = 37000.178;
|
||||||
|
System.out.println(String.format("%10s", value) + " -> " + VideoCutUtils.humanTimeCode(value));
|
||||||
|
|
||||||
|
value = 4167.3041;
|
||||||
|
System.out.println(String.format("%10s", value) + " -> " + VideoCutUtils.humanTimeCode(value));
|
||||||
|
|
||||||
|
Assert.assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue