sunder 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'sunder'
4
+
5
+ SunderCLI.start(ARGV)
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
@@ -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
@@ -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: []