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 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: []