sunder 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/bin/sunder +5 -0
- data/lib/sunder.rb +14 -0
- data/lib/sunder/apart.rb +86 -0
- data/lib/sunder/utils.rb +17 -0
- metadata +63 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: d784174fb17cd1017038a1fd68f0bdf4b8348c6bbe7ee0fcdb659088a11d03e3
|
4
|
+
data.tar.gz: cd6239eee07939783163e73ced852f4e2ebe0c786dba9b04c04ef7224d0a0768
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f70920beb9b6e3d41efdce273288b9930ed305e34b24b2c79bba21be5a08275f60e725b41e39fd549e63676455abd55b8f5e34729752ac0ae4d93ecb2787f9c6
|
7
|
+
data.tar.gz: 39ae71c37911da9017584530040ffd8b0fa0fb1e858e60686f06ef1b0f6ea10a3f534e5391332ab036de45706c5556244b2f03da2146bbf5370ede023b0605fd
|
data/bin/sunder
ADDED
data/lib/sunder.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen string literal: true
|
3
|
+
|
4
|
+
require 'thor'
|
5
|
+
|
6
|
+
Dir[File.join(__dir__, 'sunder', '*.rb')].each { |file| require file }
|
7
|
+
|
8
|
+
class SunderCLI < Thor
|
9
|
+
desc 'apart CONFIG SOURCE', 'Sunder the SOURCE based on the CONFIG file'
|
10
|
+
def apart(config_file, input_source)
|
11
|
+
exit unless Sunder::Utils.verify_config_file(config_file)
|
12
|
+
Sunder::Apart.new(config_file, input_source)
|
13
|
+
end
|
14
|
+
end
|
data/lib/sunder/apart.rb
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen string literal: true
|
3
|
+
|
4
|
+
require 'fileutils'
|
5
|
+
require 'thor'
|
6
|
+
require 'yaml'
|
7
|
+
|
8
|
+
module Sunder
|
9
|
+
class Apart
|
10
|
+
def initialize(config_file, input_source)
|
11
|
+
@input_file = input_source
|
12
|
+
@metadata = load_yaml_file(config_file)
|
13
|
+
@album_title = return_formatted_title('My Album',
|
14
|
+
'year',
|
15
|
+
'album_artist',
|
16
|
+
'title')
|
17
|
+
format = get_field("format")
|
18
|
+
@output_format = format.empty? ? "mp3" : get_field("format").empty?
|
19
|
+
|
20
|
+
make_album_directory
|
21
|
+
parse_track_info
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_field(name)
|
25
|
+
@metadata[name.to_s] || ""
|
26
|
+
end
|
27
|
+
|
28
|
+
def load_yaml_file(filename)
|
29
|
+
File.open(filename) { |f| YAML::load(f) }
|
30
|
+
rescue
|
31
|
+
'Cannot parse configuration file.'
|
32
|
+
end
|
33
|
+
|
34
|
+
def make_album_directory
|
35
|
+
puts "Making directory #{@album_title}"
|
36
|
+
FileUtils.mkdir_p(@album_title)
|
37
|
+
end
|
38
|
+
|
39
|
+
def make_track(skip_time,track_length,track_end,track_name)
|
40
|
+
puts "Making track #{track_name} of length #{track_length} seconds."
|
41
|
+
|
42
|
+
ffmpeg_command = "ffmpeg -loglevel 8 " \
|
43
|
+
"-i #{@input_file} " \
|
44
|
+
"-ss #{skip_time} -to #{track_end} " \
|
45
|
+
"\"#{@album_title}/#{track_name}.#{@output_format}\""
|
46
|
+
|
47
|
+
system(ffmpeg_command)
|
48
|
+
end
|
49
|
+
|
50
|
+
def parse_track_info
|
51
|
+
tracks = get_field("tracks")
|
52
|
+
track_num = 1
|
53
|
+
skip_time = 0.0
|
54
|
+
return "Nothing to do" if tracks.empty?
|
55
|
+
|
56
|
+
tracks.each do |k,v|
|
57
|
+
track_end = timestamp_to_seconds(k)
|
58
|
+
track_length = track_end - skip_time
|
59
|
+
track_name = "#{"%02d" % track_num}. #{v}"
|
60
|
+
|
61
|
+
make_track(skip_time, track_length, track_end, track_name)
|
62
|
+
|
63
|
+
track_num += 1
|
64
|
+
skip_time += track_length
|
65
|
+
end
|
66
|
+
|
67
|
+
puts "Total Album Length: #{skip_time}"
|
68
|
+
end
|
69
|
+
|
70
|
+
def return_formatted_title(default, *fields)
|
71
|
+
title = fields.map { |f| get_field(f).to_s }
|
72
|
+
|
73
|
+
title = title.reject { |f| f.empty? }.join(' - ')
|
74
|
+
|
75
|
+
title.empty? ? default : title
|
76
|
+
end
|
77
|
+
|
78
|
+
def timestamp_to_seconds(timestamp)
|
79
|
+
parsed_timestamp = timestamp.to_s.split(':')
|
80
|
+
|
81
|
+
parsed_timestamp.reverse.map.with_index { |n,i|
|
82
|
+
n.to_f * (60**i)
|
83
|
+
}.sum
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/lib/sunder/utils.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen string literal: true
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
module Sunder
|
6
|
+
class Utils
|
7
|
+
def self.verify_config_file(config_file)
|
8
|
+
metadata = File.open(config_file) { |f| YAML::load(f) }
|
9
|
+
return false unless metadata.keys.include?("tracks")
|
10
|
+
rescue
|
11
|
+
puts 'Cannot load configuration file'
|
12
|
+
return false
|
13
|
+
else
|
14
|
+
return true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sunder
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Bill Niblock
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-08-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: thor
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description:
|
28
|
+
email:
|
29
|
+
- bill@theinternetvagabond.com
|
30
|
+
executables:
|
31
|
+
- sunder
|
32
|
+
extensions: []
|
33
|
+
extra_rdoc_files: []
|
34
|
+
files:
|
35
|
+
- bin/sunder
|
36
|
+
- lib/sunder.rb
|
37
|
+
- lib/sunder/apart.rb
|
38
|
+
- lib/sunder/utils.rb
|
39
|
+
homepage: https://www.github.com/vagabondazulien/sunder
|
40
|
+
licenses:
|
41
|
+
- WTFPL
|
42
|
+
metadata:
|
43
|
+
allowed_push_host: https://rubygems.org
|
44
|
+
post_install_message:
|
45
|
+
rdoc_options: []
|
46
|
+
require_paths:
|
47
|
+
- lib
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
requirements: []
|
59
|
+
rubygems_version: 3.2.21
|
60
|
+
signing_key:
|
61
|
+
specification_version: 4
|
62
|
+
summary: Sunder a single audio file into smaller tracks.
|
63
|
+
test_files: []
|