peasy-audio 0.1.1

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: dda227c3f5c86de87fd28d19ab4994daf307f5a122289a1ae7e71e492d03c4d3
4
+ data.tar.gz: 717339562104d1709cdafb297e225128e107dfe99e54b8bf18ef93c09972df52
5
+ SHA512:
6
+ metadata.gz: f0fcba0fc6e3e77c55589e5ba7225e50db877ba087be13dfc81484944ae6651c73544b564e2086446736eaf6b19455a7ef0a84b2b1dc3abf895c6b50912fb744
7
+ data.tar.gz: d423a84b6ace061734634d3920b5ddf9dd432b8dc5dac1d5bed4d87dd03fc93e8cdd7307faeec4c5d348e1dbe829016fddae446539428e623d7f6810c3c8e612
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open3"
4
+ require "json"
5
+ require "tempfile"
6
+
7
+ module PeasyAudio
8
+ FORMATS = %w[mp3 wav ogg flac aac m4a].freeze
9
+
10
+ module_function
11
+
12
+ def info(path)
13
+ cmd = %W[ffprobe -v quiet -print_format json -show_format -show_streams #{path}]
14
+ out, err, st = Open3.capture3(*cmd)
15
+ raise Error, "ffprobe failed: #{err}" unless st.success?
16
+ data = JSON.parse(out)
17
+ fmt = data["format"] || {}
18
+ stream = (data["streams"] || []).find { |s| s["codec_type"] == "audio" } || {}
19
+ {
20
+ duration: fmt["duration"]&.to_f,
21
+ format: fmt["format_name"],
22
+ sample_rate: stream["sample_rate"]&.to_i,
23
+ channels: stream["channels"]&.to_i,
24
+ bitrate: fmt["bit_rate"]&.to_i,
25
+ size: fmt["size"]&.to_i,
26
+ }
27
+ end
28
+
29
+ def convert(input, format:, output: nil)
30
+ raise Error, "unsupported format: #{format}" unless FORMATS.include?(format.to_s)
31
+ output ||= input.to_s.sub(/\.\w+$/, ".#{format}")
32
+ _o, err, st = Open3.capture3("ffmpeg", "-y", "-i", input.to_s, output)
33
+ raise Error, "convert failed: #{err}" unless st.success?
34
+ output
35
+ end
36
+
37
+ def trim(input, start: 0, duration: nil, output: nil)
38
+ output ||= input.to_s.sub(/(\.\w+)$/, "_trimmed\\1")
39
+ args = ["ffmpeg", "-y", "-i", input.to_s, "-ss", start.to_s]
40
+ args += ["-t", duration.to_s] if duration
41
+ args << output
42
+ _o, err, st = Open3.capture3(*args)
43
+ raise Error, "trim failed: #{err}" unless st.success?
44
+ output
45
+ end
46
+
47
+ def merge(inputs, output: nil)
48
+ output ||= "merged_#{Time.now.to_i}.mp3"
49
+ list = Tempfile.new(["concat", ".txt"])
50
+ inputs.each { |f| list.puts("file '#{File.expand_path(f)}'") }
51
+ list.close
52
+ _o, err, st = Open3.capture3("ffmpeg", "-y", "-f", "concat", "-safe", "0", "-i", list.path, "-c", "copy", output)
53
+ raise Error, "merge failed: #{err}" unless st.success?
54
+ output
55
+ ensure
56
+ list&.unlink
57
+ end
58
+
59
+ def normalize(input, output: nil)
60
+ output ||= input.to_s.sub(/(\.\w+)$/, "_normalized\\1")
61
+ _o, err, st = Open3.capture3("ffmpeg", "-y", "-i", input.to_s, "-af", "loudnorm", output)
62
+ raise Error, "normalize failed: #{err}" unless st.success?
63
+ output
64
+ end
65
+
66
+ class Error < StandardError; end
67
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PeasyAudio
4
+ VERSION = "0.1.1"
5
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "peasy_audio/version"
4
+ require_relative "peasy_audio/engine"
metadata ADDED
@@ -0,0 +1,50 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: peasy-audio
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - PeasyTools
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies: []
12
+ description: Audio processing library for Ruby — convert between formats (MP3, WAV,
13
+ OGG, FLAC, AAC), trim, merge, normalize volume. FFmpeg-powered with a clean Ruby
14
+ API.
15
+ email:
16
+ - hello@peasytools.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/peasy_audio.rb
22
+ - lib/peasy_audio/engine.rb
23
+ - lib/peasy_audio/version.rb
24
+ homepage: https://peasyaudio.com
25
+ licenses:
26
+ - MIT
27
+ metadata:
28
+ homepage_uri: https://peasyaudio.com
29
+ source_code_uri: https://github.com/peasytools/peasy-audio-rb
30
+ changelog_uri: https://github.com/peasytools/peasy-audio-rb/blob/main/CHANGELOG.md
31
+ documentation_uri: https://peasyaudio.com
32
+ bug_tracker_uri: https://github.com/peasytools/peasy-audio-rb/issues
33
+ rdoc_options: []
34
+ require_paths:
35
+ - lib
36
+ required_ruby_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ required_rubygems_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ requirements: []
47
+ rubygems_version: 4.0.3
48
+ specification_version: 4
49
+ summary: Audio processing — convert, trim, merge, normalize
50
+ test_files: []