Giter Club home page Giter Club logo

sandreas / tone Goto Github PK

View Code? Open in Web Editor NEW
392.0 7.0 17.0 559 KB

tone is a cross platform audio tagger and metadata editor to dump and modify metadata for a wide variety of formats, including mp3, m4b, flac and more. It has no dependencies and can be downloaded as single binary for Windows, macOS, Linux and other common platforms.

Home Page: https://pilabor.com

License: Apache License 2.0

C# 99.35% Dockerfile 0.40% Shell 0.25%
audio id3 m4b metadata mp3 tagger

tone's People

Contributors

sandreas avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

tone's Issues

a feature request for batch tagging

I wish to have this workflow

  1. dump a folder(optionally recursively) of audios into a json file and
  2. edit the json file with an editor or script
  3. import the json to update the original files

Is this already possible?

Think about a security issue best practise

If there is a security issue or vulnerability, there has to be a process how to handle that...

  • Responsible disclosure email
  • Warning that there is a vulnerability
  • Short time to fix stuff

Parts that need special care:

  • metadata parsers
  • json parsers
  • JavaScriptApi

Add Support for FreeBSD

The Linux executables are not compatible with the BSD (specifically FreeBSD in my case) architecture. I believe DotNet has support for compiling to FreeBSD now, but I am not familiar enough to do it myself (I couldn't find compiling instructions for Tone to follow).

Scripting issue with very large files / very many chapters

The following script runs into an error:

// reindexChapters.js 
function reindexChapters(metadata, parameters) {
  var count = metadata.Chapters.Count;
  var newChapters = [];
  console.log("found " + count + " chapters to reindex");
  for(var i=0;i<count;i++) {
    metadata.Chapters[i].Title = "Chapter " + (i+1);
  }
}

tone.RegisterTagger("reindexChapters");
tone tag "my-audiobook.m4b" --taggers="reindexChapters" --script="reindexChapters.js" --dry-run

Original report: sandreas/m4b-tool#216 (comment)

I'm running into an issue which large audiobooks (do know if its the file size (all are bigger than 1GB) or the chapter number).

found 563 chapters to reindex
Error: Object reference not set to an instance of an object.

Any ideas?

Best regards,

Stefan

error running tone in docker alpine arm64

Trying to run tone in an alpine arm64 container.

~ # tone --version
sh: tone: not found

Using readelf I get:
~ # readelf -l /usr/local/bin/tone

Elf file type is DYN (Shared object file)
Entry point 0x280000
There are 12 program headers, starting at offset 64

Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000000040 0x0000000000000040
0x00000000000002a0 0x00000000000002a0 R 0x8
INTERP 0x00000000000002e0 0x00000000000002e0 0x00000000000002e0
0x000000000000001b 0x000000000000001b R 0x1
[Requesting program interpreter: /lib/ld-linux-aarch64.so.1]
LOAD 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x000000000027ffcc 0x000000000027ffcc R 0x10000
LOAD 0x0000000000280000 0x0000000000280000 0x0000000000280000
0x0000000000687ee0 0x0000000000687ee0 R E 0x10000
LOAD 0x0000000000910000 0x0000000000910000 0x0000000000910000
0x0000000000033fa8 0x0000000000033fa8 RW 0x10000
LOAD 0x0000000000950000 0x0000000000950000 0x0000000000950000
0x000000000001c368 0x00000000000685c0 RW 0x10000
TLS 0x0000000000907ee0 0x0000000000907ee0 0x0000000000907ee0
0x0000000000000000 0x00000000000000e0 R 0x10
DYNAMIC 0x0000000000940050 0x0000000000940050 0x0000000000940050
0x0000000000000260 0x0000000000000260 RW 0x8
GNU_RELRO 0x0000000000910000 0x0000000000910000 0x0000000000910000
0x0000000000034000 0x0000000000034000 R 0x1
GNU_EH_FRAME 0x00000000001af070 0x00000000001af070 0x00000000001af070
0x0000000000027924 0x0000000000027924 R 0x4
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 0x0
NOTE 0x00000000000002fc 0x00000000000002fc 0x00000000000002fc
0x0000000000000044 0x0000000000000044 R 0x4

Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp .note.ABI-tag .note.gnu.build-id .dynsym .gnu.version .gnu.version_d .gnu.version_r .gnu.hash .dynstr .rela.dyn .rela.plt .rodata .gcc_except_table __tracepoints_strings .eh_frame_hdr .eh_frame
03 .text .init .fini .plt
04 .jcr .fini_array .init_array .data.rel.ro .dynamic .got .got.plt
05 .data .tm_clone_table __tracepoints __tracepoints_ptrs .bss
06 .tbss
07 .dynamic
08 .jcr .fini_array .init_array .data.rel.ro .dynamic .got .got.plt .bss.rel.ro
09 .eh_frame_hdr
10
11 .note.ABI-tag .note.gnu.build-id
~ # ldd /usr/local/bin/tone
/lib/ld-linux-aarch64.so.1 (0x7f93fc0000)
libpthread.so.0 => /lib/ld-linux-aarch64.so.1 (0x7f93fc0000)
libdl.so.2 => /lib/ld-linux-aarch64.so.1 (0x7f93fc0000)
libz.so.1 => /lib/libz.so.1 (0x7f935e0000)
librt.so.1 => /lib/ld-linux-aarch64.so.1 (0x7f93fc0000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7f935bb000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7f933cb000)
libm.so.6 => /lib/ld-linux-aarch64.so.1 (0x7f93fc0000)
libc.so.6 => /lib/ld-linux-aarch64.so.1 (0x7f93fc0000)
Error loading shared library ld-linux-aarch64.so.1: No such file or directory (needed by /usr/local/bin/tone)
Error relocating /usr/local/bin/tone: __strdup: symbol not found
Error relocating /usr/local/bin/tone: __isnan: symbol not found
Error relocating /usr/local/bin/tone: __isnanf: symbol not found

Did some research and all I could find was something about having to install glibc.

Don't really know if this is an issue or if I'm doing something wrong,

Thank you for your work.

renaming chapters doesn't rename all chapters

I have a mb4 file that has chapters title 1-67. I created a chapters.txt with the correct names and used the same times from tone dump. however the last for chapters are not renamed. here is --dry-run preview.

using this command tone tag file.m4b --auto-import=chapters --dry-run

image

this is the relevant section in the chapters.txt file

image

is this a bug or am I missing something?

`watch` command to run a script on filesystem changes

I would like to have a watch command to watch a directory for filesystem changes and run shell commands, so that it is possible to watch a directory with audio books and start a conversion tool, as soon as new files are put in.

Important Note:
Maybe this exceeds the scope of tone as an audio tagger and has to be extracted in an extra tool (like fswatch, fswatcher, fsmon or baywatch - last name is to prevent name conflicts with existing more popular tools like https://github.com/emcrisostomo/fswatch)

Tasks:

  • implement watch command with a --directory parameter to specify the directory
  • add --debounce-milliseconds=<timespan> parameter to prevent running immediately on a change (e.g. when still copying files) to prevent too early execution
  • add --event-type parameter (multiple usage) to watch for specific events (changed, renamed, created, deleted)

Optional tasks / ideas:

  • implement --ignore-errors parameter for e.g. directory is not existing (retry to register the filesystem watcher
  • implement --retry-on-error-milliseconds for --ignore-errors

Example:

tone watch --directory="/tmp/dir/" --debounce-milliseconds="300000" ls /tmp/dir

Format specification to represent ALL possible metadata fields

Think over a metadata format (JSON?) that contains all possible metadata fields (JsonMeta) and a container, to wrap this format to contain even more information (file, options, etc.). Additionaly, a parameter --json-path should be implemented, where this output can be queried in dump command (see here), e.g.:

Meta:

{
    "artist": "My Artist",
    "lyrics": {
          
     }
    "chapters": [ 
        [0, 10000, "chapter title"]
    ],
    "pictures": [{
           "id" : "..",

     }]
}

Container:

{
 "options": {
    "meta-album": "My Album"
  },  
 "file": {
     "size": 800001,
     "path": "/audiobooks",
     "name": "my-audiobook.m4b"
     "created": "2020-08-20T12:34:56Z"
  }
  "meta": {"meta from above"}
}

References:

Chapters - for now start, length and title would be enough

// start
// end / length
// title
// uniqueID (id3 only)
// subtitle (id3 only)
// url (id3 only)
// picture (id3 only)

Pictures - for now data, picType and tagType are enough (position can be calculated automatically?)

public static PictureInfo fromBinaryData(byte[] data, PIC_TYPE picType = PIC_TYPE.Generic, TagType tagType = TagType.ANY, object nativePicCode = null, int position = 1) {
}

tone tag exit gracefully after Control-C is pressed

I had tone writing tags to a collection of .m4b files and I needed to interrupt it so I could get something else done.

When I pressed Control-C tone exited immediately and left the file it was writing to corrupted so that it was unrecognisable and unplayable.

Tone should either write a new file and rename into place, and/or install a signal handler to exit gracefully once it's finished writing the current file. Ideally, it should do both

Dump is writing errors to stdout

This is how I was writing custom metadata to m4b files using ffmpeg, which I found out was NOT a good idea.
I will outline it here to show how tone dumps the file, I am not expecting tone to correctly parse this.

First writing a custom tag to the sample m4b here

ffmpeg -i .\samples\test_m4b.m4b -metadata ASIN="1337" -movflags use_metadata_tags .\samples\output_m4b.m4b

Ffprobe format output:

ffprobe -i .\samples\output_m4b.m4b -show_format -print_format json
    "format": {
        "filename": ".\\samples\\output_m4b.m4b",
        "nb_streams": 2,
        "nb_programs": 0,
        "format_name": "mov,mp4,m4a,3gp,3g2,mj2",
        "format_long_name": "QuickTime / MOV",
        "start_time": "0.000000",
        "duration": "211.302000",
        "size": "1934997",
        "bit_rate": "73259",
        "probe_score": 100,
        "tags": {
            "minor_version": "0",
            "major_brand": "mp42",
            "compatible_brands": "mp42isomndia",
            "gapless_playback": "1",
            "track": "5",
            "genre": "abs",
            "artist": "advplyr",
            "title": "Test 5",
            "album": "node-tone",
            "comment": "testing out tone metadata",
            "album_artist": "advplyr",
            "composer": "Composer 5",
            "date": "2022-09-10",
            "ASIN": "1337",
            "compilation": "0",
            "media_type": "2",
            "encoder": "Lavf58.73.100"
        }
    }

Now tone dump

tone dump .\samples\output_m4b.m4b --format json

Output:

Unrecognized metadata format
   at ATL.AudioData.IO.MP4.readTag(BinaryReader source, ReadTagParams readTagParams)
   at ATL.AudioData.IO.MP4.readUserData(BinaryReader source, ReadTagParams readTagParams, Int64 moovPosition, UInt32 moovSize)
   at ATL.AudioData.IO.MP4.readMP4(BinaryReader source, ReadTagParams readTagParams)
   at ATL.AudioData.IO.MP4.read(BinaryReader source, ReadTagParams readTagParams)
   at ATL.AudioData.IO.MP4.Read(BinaryReader source, SizeInfo sizeInfo, ReadTagParams readTagParams)
   at ATL.AudioData.AudioDataManager.read(BinaryReader source, ReadTagParams readTagParams)
   at ATL.AudioData.AudioDataManager.read(BinaryReader source, Boolean readEmbeddedPictures, Boolean readAllMetaFrames, Boolean prepareForWriting)
   at ATL.AudioData.AudioDataManager.ReadFromFile(Boolean readEmbeddedPictures, Boolean readAllMetaFrames)
Unrecognized metadata format
   at ATL.AudioData.IO.MP4.readTag(BinaryReader source, ReadTagParams readTagParams)
   at ATL.AudioData.IO.MP4.readUserData(BinaryReader source, ReadTagParams readTagParams, Int64 moovPosition, UInt32 moovSize)
   at ATL.AudioData.IO.MP4.readMP4(BinaryReader source, ReadTagParams readTagParams)
   at ATL.AudioData.IO.MP4.read(BinaryReader source, ReadTagParams readTagParams)
   at ATL.AudioData.IO.MP4.Read(BinaryReader source, SizeInfo sizeInfo, ReadTagParams readTagParams)
   at ATL.AudioData.AudioDataManager.read(BinaryReader source, ReadTagParams readTagParams)
   at ATL.AudioData.AudioDataManager.read(BinaryReader source, Boolean readEmbeddedPictures, Boolean readAllMetaFrames, Boolean prepareForWriting)
   at ATL.AudioData.AudioDataManager.ReadFromFile(Boolean readEmbeddedPictures, Boolean readAllMetaFrames)
{
  "audio": {
    "format": "Unknown",
    "formatShort": "Unknown",
    "channels": {
      "description": "Unknown"
    },
    "frames": {},
    "metaFormat": []
  },
  "meta": {
    "title": "output_m4b"
  },
  "file": {
    "size": 1934997,
    "created": "2022-09-18T16:20:03.2173223-05:00",
    "modified": "2022-09-18T16:21:28.9052672-05:00",
    "accessed": "2022-09-18T16:26:33.0977549-05:00",
    "path": "\\NodeProjects\\node-tone\\samples",
    "name": "output_m4b.m4b"
  }
}

The issue is that tone is outputting all of this to stdout so node-tone is unable parse the JSON of the metadata that was found. It is okay that tone didn't pull the ASIN tag, but I still want to get the rest of the output.

Change `--auto-import` to enum instead of having `--auto-import-chapters`, etc.

An enum[] parameter with Chapters, Cover and other formats would be more flexible than having bool parameters for each purpose.

Maybe it would be even better to have an IMetadataImporter interface like this:

public interface IMetadataImporter {
     public string Identifier = "chapters";
     public Task<Status> ImportAsync(string path);
}

Something fails in the file iterator

Somethings the following exception occurs (the filewalker lib):

System.IndexOutOfRangeException: Index was outside the bounds of the array.
       at System.Collections.Generic.Stack`1.PushWithResize(T )                 
       at System.Collections.Generic.Stack`1.Push(T )                           
       at System.Linq.Parallel.ForAllOperator`1.ForAllEnumerator`1.MoveNext(    
          TInput& , Int32& )                                                    
       at System.Linq.Parallel.ForAllSpoolingTask`2.SpoolingWork()              
       at System.Linq.Parallel.SpoolingTaskBase.Work()                          
       at System.Linq.Parallel.QueryTask.BaseWork(Object )                      
       at System.Linq.Parallel.QueryTask.<>c.<.cctor>b__10_0(Object )           
       at System.Threading.Tasks.Task.InnerInvoke()                             
       at System.Threading.Tasks.Task.<>c.<.cctor>b__272_0(Object )             
       at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread
          , ExecutionContext , ContextCallback , Object )                       
       at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread
          , ExecutionContext , ContextCallback , Object )                       
       at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& , Thread )   
  at System.Linq.Parallel.QueryTaskGroupState.QueryEnd(Boolean )                
  at System.Linq.Parallel.SpoolingTask.SpoolForAll[TInputOutput,TIgnoreKey](    
     QueryTaskGroupState , PartitionedStream`2 , TaskScheduler )                
  at System.Linq.Parallel.DefaultMergeHelper`2.System.Linq.Parallel.IMergeHelper
     <TInputOutput>.Execute()                                                   
  at System.Linq.Parallel.MergeExecutor`1.Execute()                             
  at System.Linq.Parallel.MergeExecutor`1.Execute[TKey](PartitionedStream`2 ,   
     Boolean , ParallelMergeOptions , TaskScheduler , Boolean ,                 
     CancellationState , Int32 )                                                
  at System.Linq.Parallel.PartitionedStreamMerger`1.Receive[TKey](              
     PartitionedStream`2 )                                                      
  at System.Linq.Parallel.ForAllOperator`1.WrapPartitionedStream[TKey](         
     PartitionedStream`2 , IPartitionedStreamRecipient`1 , Boolean ,            
     QuerySettings )                                                            
  at System.Linq.Parallel.UnaryQueryOperator`2.UnaryQueryOperatorResults.ChildRe
     sultsRecipient.Receive[TKey](PartitionedStream`2 )                         
  at System.Linq.Parallel.ListQueryResults`1.GivePartitionedStream(             
     IPartitionedStreamRecipient`1 )                                            
  at System.Linq.Parallel.UnaryQueryOperator`2.UnaryQueryOperatorResults.       
     GivePartitionedStream(IPartitionedStreamRecipient`1 )                      
  at System.Linq.Parallel.QueryOperator`1.GetOpenedEnumerator(Nullable`1 ,      
     Boolean , Boolean , QuerySettings )                                        
  at System.Linq.Parallel.ForAllOperator`1.RunSynchronously()                   
  at System.Linq.ParallelEnumerable.ForAll[TSource](ParallelQuery`1 , Action`1 )
  at Sandreas.Files.FileWalker.GetEnumerator()+MoveNext()                       
  at Sandreas.Files.FileWalker.System.Collections.Generic.IEnumerable<System.Str
     ing>.GetEnumerator()+MoveNext()                                            
  at System.Linq.Enumerable.SelectEnumerableIterator`2.MoveNext()               
  at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()                
  at tone.Services.DirectoryLoaderService.FindFilesByExtension(IEnumerable`1    
     inputPaths, IEnumerable`1 includeExtensions, FileWalker                    
     fileWalker)+MoveNext()                                                     
  at System.Collections.Generic.LargeArrayBuilder`1.AddRange(IEnumerable`1 )    
  at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 )    
  at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 )                    
  at tone.Commands.TagCommand.ExecuteAsync(CommandContext context,              
     TagCommandSettings settings)                                               
  at Spectre.Console.Cli.CommandExecutor.Execute(IConfiguration configuration,  
     IEnumerable`1 args) in /_/src/Spectre.Console/Cli/Internal/                
     CommandExecutor.cs:84                                                      
  at Spectre.Console.Cli.CommandApp.RunAsync(IEnumerable`1 args) in             
     /_/src/Spectre.Console/Cli/CommandApp.cs:87                                
  at Program.<Main>$(String[] args)     

tone quit unexpectedly - m1 Mac

Hey! this projects seems like it could definitely be useful but I wanted to let you know that it's not running on my m1 Mac. I installed following the instructions in the readme, and when I try to run tone --help I get this:

zsh: bus error  tone --help

There is also a full error log from the OS, which I'm not sure will be any help, but I figure I might as well add that too:

-------------------------------------
Translated Report (Full Report Below)
-------------------------------------

Process:               tone [7311]
Path:                  /usr/local/bin/tone
Identifier:            tone
Version:               ???
Code Type:             ARM-64 (Native)
Parent Process:        zsh [2290]
Responsible:           iTerm2 [2240]
User ID:               501

Date/Time:             2022-05-25 22:55:54.5793 -0400
OS Version:            macOS 12.3 (21E230)
Report Version:        12
Anonymous UUID:        944DF720-1207-90C0-C191-F086EC41CE95


Time Awake Since Boot: 7200 seconds

System Integrity Protection: enabled

Crashed Thread:        0  Dispatch queue: com.apple.main-thread

Exception Type:        EXC_BAD_ACCESS (SIGBUS)
Exception Codes:       KERN_PROTECTION_FAILURE at 0x000000012566393c
Exception Codes:       0x0000000000000002, 0x000000012566393c
Exception Note:        EXC_CORPSE_NOTIFY

Termination Reason:    Namespace SIGNAL, Code 10 Bus error: 10
Terminating Process:   exc handler [7311]

VM Region Info: 0x12566393c is in 0x125308000-0x125830000;  bytes after start: 3520828  bytes before end: 1885891
      REGION TYPE                    START - END         [ VSIZE] PRT/MAX SHRMOD  REGION DETAIL
      VM_ALLOCATE                 1252fc000-125308000    [   48K] rw-/rwx SM=ZER  
--->  VM_ALLOCATE                 125308000-125830000    [ 5280K] r-x/rwx SM=ZER  
      VM_ALLOCATE                 125830000-12596c000    [ 1264K] rw-/rwx SM=ZER  

Thread 0 Crashed::  Dispatch queue: com.apple.main-thread
0   tone                          	       0x1033ed298 PEImageLayout::ApplyBaseRelocations() + 496
1   tone                          	       0x1033ed21c PEImageLayout::ApplyBaseRelocations() + 372
2   tone                          	       0x1033ed894 ConvertedImageLayout::ConvertedImageLayout(PEImageLayout*, int) + 708
3   tone                          	       0x1033ece24 PEImageLayout::LoadConverted(PEImage*, int) + 80
4   tone                          	       0x1033ecef8 PEImageLayout::Map(PEImage*) + 36
5   tone                          	       0x102f8df9c PEImage::CreateLayoutMapped() + 116
6   tone                          	       0x102f8de08 PEImage::GetLayoutInternal(unsigned int, unsigned int) + 116
7   tone                          	       0x102f8c6e4 PEImage::GetLayout(unsigned int, unsigned int) + 236
8   tone                          	       0x103017174 BinderAcquireImport + 164
9   tone                          	       0x1031ee098 BINDER_SPACE::AssemblyBinder::GetAssembly(SString&, int, int, BINDER_SPACE::Assembly**, char16_t const*, BundleFileLocation) + 436
10  tone                          	       0x1031ed944 BINDER_SPACE::AssemblyBinder::BindToSystem(SString&, BINDER_SPACE::Assembly**, bool) + 432
11  tone                          	       0x1031f6488 CCoreCLRBinderHelper::BindToSystem(ICLRPrivAssembly**, bool) + 292
12  tone                          	       0x102f8b438 PEAssembly::DoOpenSystem(IUnknown*) + 64
13  tone                          	       0x102f8b1d4 PEAssembly::OpenSystem(IUnknown*) + 132
14  tone                          	       0x102ed7d48 SystemDomain::LoadBaseSystemClasses() + 28
15  tone                          	       0x102ed7a94 SystemDomain::Init() + 580
16  tone                          	       0x1033ead40 EEStartupHelper() + 1696
17  tone                          	       0x1033ea0a0 EEStartup() + 196
18  tone                          	       0x1033e9fc0 EnsureEEStarted() + 356
19  tone                          	       0x102f189d4 CorHost2::Start() + 124
20  tone                          	       0x1033eea04 coreclr_initialize + 724
21  tone                          	       0x102ea87b8 coreclr_t::create(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const*, char const*, coreclr_property_bag_t const&, std::__1::unique_ptr<coreclr_t, std::__1::default_delete<coreclr_t> >&) + 412
22  tone                          	       0x102eb5af0 (anonymous namespace)::create_coreclr() + 432
23  tone                          	       0x102eb55b4 corehost_main + 160
24  tone                          	       0x102e963a0 fx_muxer_t::handle_exec_host_command(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, host_startup_info_t const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::unordered_map<known_options, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >, known_options_hash, std::__1::equal_to<known_options>, std::__1::allocator<std::__1::pair<known_options const, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > > > const&, int, char const**, int, host_mode_t, bool, char*, int, int*) + 1320
25  tone                          	       0x102e9548c fx_muxer_t::execute(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, char const**, host_startup_info_t const&, char*, int, int*) + 856
26  tone                          	       0x102e91f6c hostfxr_main_bundle_startupinfo + 196
27  tone                          	       0x102ed53e8 exe_start(int, char const**) + 1124
28  tone                          	       0x102ed56d8 main + 152
29  dyld                          	       0x1044e5088 start + 516

Thread 1:
0   libsystem_kernel.dylib        	       0x19db248d0 mach_msg_trap + 8
1   libsystem_kernel.dylib        	       0x19db24d40 mach_msg + 76
2   tone                          	       0x10349405c MachMessage::Receive(unsigned int) + 80
3   tone                          	       0x1034933f8 SEHExceptionThread(void*) + 148
4   libsystem_pthread.dylib       	       0x19db6226c _pthread_start + 148
5   libsystem_pthread.dylib       	       0x19db5d08c thread_start + 8

Thread 2:
0   libsystem_kernel.dylib        	       0x19db2ac40 kevent + 8
1   tone                          	       0x103487998 CorUnix::CPalSynchronizationManager::ReadBytesFromProcessPipe(int, unsigned char*, int) + 464
2   tone                          	       0x103487098 CorUnix::CPalSynchronizationManager::WorkerThread(void*) + 116
3   tone                          	       0x103490f7c CorUnix::CPalThread::ThreadEntry(void*) + 380
4   libsystem_pthread.dylib       	       0x19db6226c _pthread_start + 148
5   libsystem_pthread.dylib       	       0x19db5d08c thread_start + 8

Thread 3:
0   libsystem_kernel.dylib        	       0x19db2ced0 poll + 8
1   tone                          	       0x1031e7980 ds_ipc_poll(_DiagnosticsIpcPollHandle*, unsigned long, unsigned int, void (*)(char const*, unsigned int)) + 180
2   tone                          	       0x10329d10c ds_ipc_stream_factory_get_next_available_stream(void (*)(char const*, unsigned int)) + 884
3   tone                          	       0x10329b1c8 server_thread(void*) + 324
4   tone                          	       0x103490f7c CorUnix::CPalThread::ThreadEntry(void*) + 380
5   libsystem_pthread.dylib       	       0x19db6226c _pthread_start + 148
6   libsystem_pthread.dylib       	       0x19db5d08c thread_start + 8

Thread 4:
0   libsystem_kernel.dylib        	       0x19db254f0 __open + 8
1   libsystem_kernel.dylib        	       0x19db30018 open + 64
2   tone                          	       0x1031e84c4 TwoWayPipe::WaitForConnection() + 40
3   tone                          	       0x1031e242c DbgTransportSession::TransportWorker() + 196
4   tone                          	       0x1031e14fc DbgTransportSession::TransportWorkerStatic(void*) + 12
5   tone                          	       0x103490f7c CorUnix::CPalThread::ThreadEntry(void*) + 380
6   libsystem_pthread.dylib       	       0x19db6226c _pthread_start + 148
7   libsystem_pthread.dylib       	       0x19db5d08c thread_start + 8

Thread 5:
0   libsystem_kernel.dylib        	       0x19db28290 __psynch_cvwait + 8
1   libsystem_pthread.dylib       	       0x19db6283c _pthread_cond_wait + 1236
2   tone                          	       0x103485688 CorUnix::CPalSynchronizationManager::ThreadNativeWait(CorUnix::_ThreadNativeWaitData*, unsigned int, CorUnix::ThreadWakeupReason*, unsigned int*) + 340
3   tone                          	       0x103485340 CorUnix::CPalSynchronizationManager::BlockThread(CorUnix::CPalThread*, unsigned int, bool, bool, CorUnix::ThreadWakeupReason*, unsigned int*) + 444
4   tone                          	       0x1034895b0 CorUnix::InternalWaitForMultipleObjectsEx(CorUnix::CPalThread*, unsigned int, void* const*, int, unsigned int, int, int) + 1676
5   tone                          	       0x1031dfcfc DebuggerRCThread::MainLoop() + 208
6   tone                          	       0x1031dfbc0 DebuggerRCThread::ThreadProc() + 248
7   tone                          	       0x1031df988 DebuggerRCThread::ThreadProcStatic(void*) + 32
8   tone                          	       0x103490f7c CorUnix::CPalThread::ThreadEntry(void*) + 380
9   libsystem_pthread.dylib       	       0x19db6226c _pthread_start + 148
10  libsystem_pthread.dylib       	       0x19db5d08c thread_start + 8

Thread 6:
0   libsystem_kernel.dylib        	       0x19db28290 __psynch_cvwait + 8
1   libsystem_pthread.dylib       	       0x19db6283c _pthread_cond_wait + 1236
2   tone                          	       0x103485654 CorUnix::CPalSynchronizationManager::ThreadNativeWait(CorUnix::_ThreadNativeWaitData*, unsigned int, CorUnix::ThreadWakeupReason*, unsigned int*) + 288
3   tone                          	       0x103485340 CorUnix::CPalSynchronizationManager::BlockThread(CorUnix::CPalThread*, unsigned int, bool, bool, CorUnix::ThreadWakeupReason*, unsigned int*) + 444
4   tone                          	       0x1034895b0 CorUnix::InternalWaitForMultipleObjectsEx(CorUnix::CPalThread*, unsigned int, void* const*, int, unsigned int, int, int) + 1676
5   tone                          	       0x10348976c WaitForSingleObjectEx + 80
6   tone                          	       0x1030c1978 CLREventBase::WaitEx(unsigned int, WaitMode, PendingSync*) + 196
7   tone                          	       0x103032dd4 FinalizerThread::WaitForFinalizerEvent(CLREvent*) + 48
8   tone                          	       0x103032fec FinalizerThread::FinalizerThreadWorker(void*) + 252
9   tone                          	       0x102fbd820 ManagedThreadBase_DispatchOuter(ManagedThreadCallState*) + 260
10  tone                          	       0x102fbddf4 ManagedThreadBase::FinalizerBase(void (*)(void*)) + 36
11  tone                          	       0x103033124 FinalizerThread::FinalizerThreadStart(void*) + 88
12  tone                          	       0x103490f7c CorUnix::CPalThread::ThreadEntry(void*) + 380
13  libsystem_pthread.dylib       	       0x19db6226c _pthread_start + 148
14  libsystem_pthread.dylib       	       0x19db5d08c thread_start + 8


Thread 0 crashed with ARM Thread State (64-bit):
    x0: 0x000000012596f400   x1: 0x0000000fffffc110   x2: 0x0000000000000000   x3: 0x000000016cf7595c
    x4: 0xffffffffff984000   x5: 0x0000000000000020   x6: 0x000000016cf75938   x7: 0x000000016cf75958
    x8: 0x000000000000000e   x9: 0x000000012566393c  x10: 0x000000012583f238  x11: 0x0000000000000000
   x12: 0x0000000000000020  x13: 0x0000000125308200  x14: 0x0000000000525400  x15: 0x00000001252f81b0
   x16: 0x000000019db62f5c  x17: 0x0000000126704080  x18: 0x0000000000000000  x19: 0x00000000000045d8
   x20: 0x000000020000001c  x21: 0x0000000125663000  x22: 0x0000000000000024  x23: 0x0000000125308200
   x24: 0x0000000000000020  x25: 0xffffffffa52f8000  x26: 0x000000012596f408  x27: 0x0000000000000000
   x28: 0x0000000000000000   fp: 0x000000016cf75990   lr: 0xa9590001033ed21c
    sp: 0x000000016cf75910   pc: 0x00000001033ed298 cpsr: 0x60001000
   far: 0x000000012566393c  esr: 0x9200004f (Data Abort) byte write Permission fault

Binary Images:
       0x102e88000 -        0x1035ebfff tone (*) <3ddf2c6d-8b74-3ae6-af41-29399701b1f5> /usr/local/bin/tone
       0x1044e0000 -        0x10453ffff dyld (*) <fbb89662-e6f2-3434-b542-f75185ac5e74> /usr/lib/dyld
       0x19db23000 -        0x19db5afff libsystem_kernel.dylib (*) <1d7b3b8e-75a1-34ea-aa52-9f7c23155c55> /usr/lib/system/libsystem_kernel.dylib
       0x19db5b000 -        0x19db67fff libsystem_pthread.dylib (*) <cee8bc77-6923-34d9-89a3-6f8f7279605e> /usr/lib/system/libsystem_pthread.dylib
               0x0 - 0xffffffffffffffff ??? (*) <00000000-0000-0000-0000-000000000000> ???

External Modification Summary:
  Calls made by other processes targeting this process:
    task_for_pid: 0
    thread_create: 0
    thread_set_state: 0
  Calls made by this process:
    task_for_pid: 0
    thread_create: 0
    thread_set_state: 0
  Calls made by all processes on this machine:
    task_for_pid: 0
    thread_create: 0
    thread_set_state: 0

VM Region Summary:
ReadOnly portion of Libraries: Total=684.0M resident=0K(0%) swapped_out_or_unallocated=684.0M(100%)
Writable regions: Total=805.8M written=0K(0%) resident=0K(0%) swapped_out=0K(0%) unallocated=805.8M(100%)

                                VIRTUAL   REGION 
REGION TYPE                        SIZE    COUNT (non-coalesced) 
===========                     =======  ======= 
Kernel Alloc Once                   32K        1 
MALLOC                           162.2M       15 
MALLOC guard page                   96K        5 
MALLOC_MEDIUM (reserved)         240.0M        2         reserved VM address space (unallocated)
MALLOC_NANO (reserved)           384.0M        1         reserved VM address space (unallocated)
STACK GUARD                       56.1M        7 
Stack                             11.2M        7 
VM_ALLOCATE                        2.5G       20 
__AUTH                             241K       50 
__AUTH_CONST                      2960K      129 
__DATA                            1162K      123 
__DATA_CONST                      3917K      130 
__DATA_DIRTY                       234K       51 
__LINKEDIT                       596.4M        3 
__OBJC_CONST                       279K       31 
__OBJC_RO                         82.9M        1 
__OBJC_RW                         3152K        1 
__TEXT                            87.7M      137 
__UNICODE                          592K        1 
dyld private memory               1024K        1 
shared memory                       16K        1 
===========                     =======  ======= 
TOTAL                              4.1G      717 
TOTAL, minus reserved VM space     3.5G      717 



-----------
Full Report
-----------

{"app_name":"tone","timestamp":"2022-05-25 22:55:54.00 -0400","app_version":"","slice_uuid":"3ddf2c6d-8b74-3ae6-af41-29399701b1f5","build_version":"","platform":1,"share_with_app_devs":0,"is_first_party":1,"bug_type":"309","os_version":"macOS 12.3 (21E230)","incident_id":"557236BB-9373-4317-94E2-2BC2749FD62E","name":"tone"}
{
  "uptime" : 7200,
  "procLaunch" : "2022-05-25 22:55:54.4866 -0400",
  "procRole" : "Unspecified",
  "version" : 2,
  "userID" : 501,
  "deployVersion" : 210,
  "modelCode" : "MacBookAir10,1",
  "procStartAbsTime" : 175005232415,
  "coalitionID" : 1311,
  "osVersion" : {
    "train" : "macOS 12.3",
    "build" : "21E230",
    "releaseType" : "User"
  },
  "captureTime" : "2022-05-25 22:55:54.5793 -0400",
  "incident" : "557236BB-9373-4317-94E2-2BC2749FD62E",
  "bug_type" : "309",
  "pid" : 7311,
  "procExitAbsTime" : 175007355565,
  "translated" : false,
  "cpuType" : "ARM-64",
  "procName" : "tone",
  "procPath" : "\/usr\/local\/bin\/tone",
  "parentProc" : "zsh",
  "parentPid" : 2290,
  "coalitionName" : "com.googlecode.iterm2",
  "crashReporterKey" : "944DF720-1207-90C0-C191-F086EC41CE95",
  "responsiblePid" : 2240,
  "responsibleProc" : "iTerm2",
  "sip" : "enabled",
  "vmRegionInfo" : "0x12566393c is in 0x125308000-0x125830000;  bytes after start: 3520828  bytes before end: 1885891\n      REGION TYPE                    START - END         [ VSIZE] PRT\/MAX SHRMOD  REGION DETAIL\n      VM_ALLOCATE                 1252fc000-125308000    [   48K] rw-\/rwx SM=ZER  \n--->  VM_ALLOCATE                 125308000-125830000    [ 5280K] r-x\/rwx SM=ZER  \n      VM_ALLOCATE                 125830000-12596c000    [ 1264K] rw-\/rwx SM=ZER  ",
  "isCorpse" : 1,
  "exception" : {"codes":"0x0000000000000002, 0x000000012566393c","rawCodes":[2,4922423612],"type":"EXC_BAD_ACCESS","signal":"SIGBUS","subtype":"KERN_PROTECTION_FAILURE at 0x000000012566393c"},
  "termination" : {"flags":0,"code":10,"namespace":"SIGNAL","indicator":"Bus error: 10","byProc":"exc handler","byPid":7311},
  "vmregioninfo" : "0x12566393c is in 0x125308000-0x125830000;  bytes after start: 3520828  bytes before end: 1885891\n      REGION TYPE                    START - END         [ VSIZE] PRT\/MAX SHRMOD  REGION DETAIL\n      VM_ALLOCATE                 1252fc000-125308000    [   48K] rw-\/rwx SM=ZER  \n--->  VM_ALLOCATE                 125308000-125830000    [ 5280K] r-x\/rwx SM=ZER  \n      VM_ALLOCATE                 125830000-12596c000    [ 1264K] rw-\/rwx SM=ZER  ",
  "extMods" : {"caller":{"thread_create":0,"thread_set_state":0,"task_for_pid":0},"system":{"thread_create":0,"thread_set_state":0,"task_for_pid":0},"targeted":{"thread_create":0,"thread_set_state":0,"task_for_pid":0},"warnings":0},
  "faultingThread" : 0,
  "threads" : [{"triggered":true,"id":104249,"threadState":{"x":[{"value":4925617152},{"value":68719460624},{"value":0},{"value":6123116892},{"value":18446744073702752256},{"value":32},{"value":6123116856},{"value":6123116888},{"value":14},{"value":4922423612},{"value":4924371512},{"value":0},{"value":32},{"value":4918903296},{"value":5395456},{"value":4918837680},{"value":6940929884,"symbolLocation":0,"symbol":"pthread_jit_write_protect_np"},{"value":4939858048},{"value":0},{"value":17880},{"value":8589934620},{"value":4922421248},{"value":36},{"value":4918903296},{"value":32},{"value":18446744072185937920},{"value":4925617160},{"value":0},{"value":0}],"flavor":"ARM_THREAD_STATE64","lr":{"value":12202784669686485532},"cpsr":{"value":1610616832},"fp":{"value":6123116944},"sp":{"value":6123116816},"esr":{"value":2449473615,"description":"(Data Abort) byte write Permission fault"},"pc":{"value":4349416088,"matchesCrashFrame":1},"far":{"value":4922423612}},"queue":"com.apple.main-thread","frames":[{"imageOffset":5657240,"symbol":"PEImageLayout::ApplyBaseRelocations()","symbolLocation":496,"imageIndex":0},{"imageOffset":5657116,"symbol":"PEImageLayout::ApplyBaseRelocations()","symbolLocation":372,"imageIndex":0},{"imageOffset":5658772,"symbol":"ConvertedImageLayout::ConvertedImageLayout(PEImageLayout*, int)","symbolLocation":708,"imageIndex":0},{"imageOffset":5656100,"symbol":"PEImageLayout::LoadConverted(PEImage*, int)","symbolLocation":80,"imageIndex":0},{"imageOffset":5656312,"symbol":"PEImageLayout::Map(PEImage*)","symbolLocation":36,"imageIndex":0},{"imageOffset":1073052,"symbol":"PEImage::CreateLayoutMapped()","symbolLocation":116,"imageIndex":0},{"imageOffset":1072648,"symbol":"PEImage::GetLayoutInternal(unsigned int, unsigned int)","symbolLocation":116,"imageIndex":0},{"imageOffset":1066724,"symbol":"PEImage::GetLayout(unsigned int, unsigned int)","symbolLocation":236,"imageIndex":0},{"imageOffset":1634676,"symbol":"BinderAcquireImport","symbolLocation":164,"imageIndex":0},{"imageOffset":3563672,"symbol":"BINDER_SPACE::AssemblyBinder::GetAssembly(SString&, int, int, BINDER_SPACE::Assembly**, char16_t const*, BundleFileLocation)","symbolLocation":436,"imageIndex":0},{"imageOffset":3561796,"symbol":"BINDER_SPACE::AssemblyBinder::BindToSystem(SString&, BINDER_SPACE::Assembly**, bool)","symbolLocation":432,"imageIndex":0},{"imageOffset":3597448,"symbol":"CCoreCLRBinderHelper::BindToSystem(ICLRPrivAssembly**, bool)","symbolLocation":292,"imageIndex":0},{"imageOffset":1061944,"symbol":"PEAssembly::DoOpenSystem(IUnknown*)","symbolLocation":64,"imageIndex":0},{"imageOffset":1061332,"symbol":"PEAssembly::OpenSystem(IUnknown*)","symbolLocation":132,"imageIndex":0},{"imageOffset":326984,"symbol":"SystemDomain::LoadBaseSystemClasses()","symbolLocation":28,"imageIndex":0},{"imageOffset":326292,"symbol":"SystemDomain::Init()","symbolLocation":580,"imageIndex":0},{"imageOffset":5647680,"symbol":"EEStartupHelper()","symbolLocation":1696,"imageIndex":0},{"imageOffset":5644448,"symbol":"EEStartup()","symbolLocation":196,"imageIndex":0},{"imageOffset":5644224,"symbol":"EnsureEEStarted()","symbolLocation":356,"imageIndex":0},{"imageOffset":592340,"symbol":"CorHost2::Start()","symbolLocation":124,"imageIndex":0},{"imageOffset":5663236,"symbol":"coreclr_initialize","symbolLocation":724,"imageIndex":0},{"imageOffset":133048,"symbol":"coreclr_t::create(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const*, char const*, coreclr_property_bag_t const&, std::__1::unique_ptr<coreclr_t, std::__1::default_delete<coreclr_t> >&)","symbolLocation":412,"imageIndex":0},{"imageOffset":187120,"symbol":"(anonymous namespace)::create_coreclr()","symbolLocation":432,"imageIndex":0},{"imageOffset":185780,"symbol":"corehost_main","symbolLocation":160,"imageIndex":0},{"imageOffset":58272,"symbol":"fx_muxer_t::handle_exec_host_command(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, host_startup_info_t const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::unordered_map<known_options, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >, known_options_hash, std::__1::equal_to<known_options>, std::__1::allocator<std::__1::pair<known_options const, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > > > const&, int, char const**, int, host_mode_t, bool, char*, int, int*)","symbolLocation":1320,"imageIndex":0},{"imageOffset":54412,"symbol":"fx_muxer_t::execute(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, char const**, host_startup_info_t const&, char*, int, int*)","symbolLocation":856,"imageIndex":0},{"imageOffset":40812,"symbol":"hostfxr_main_bundle_startupinfo","symbolLocation":196,"imageIndex":0},{"imageOffset":316392,"symbol":"exe_start(int, char const**)","symbolLocation":1124,"imageIndex":0},{"imageOffset":317144,"symbol":"main","symbolLocation":152,"imageIndex":0},{"imageOffset":20616,"symbol":"start","symbolLocation":516,"imageIndex":1}]},{"id":104253,"frames":[{"imageOffset":6352,"symbol":"mach_msg_trap","symbolLocation":8,"imageIndex":2},{"imageOffset":7488,"symbol":"mach_msg","symbolLocation":76,"imageIndex":2},{"imageOffset":6340700,"symbol":"MachMessage::Receive(unsigned int)","symbolLocation":80,"imageIndex":0},{"imageOffset":6337528,"symbol":"SEHExceptionThread(void*)","symbolLocation":148,"imageIndex":0},{"imageOffset":29292,"symbol":"_pthread_start","symbolLocation":148,"imageIndex":3},{"imageOffset":8332,"symbol":"thread_start","symbolLocation":8,"imageIndex":3}]},{"id":104254,"frames":[{"imageOffset":31808,"symbol":"kevent","symbolLocation":8,"imageIndex":2},{"imageOffset":6289816,"symbol":"CorUnix::CPalSynchronizationManager::ReadBytesFromProcessPipe(int, unsigned char*, int)","symbolLocation":464,"imageIndex":0},{"imageOffset":6287512,"symbol":"CorUnix::CPalSynchronizationManager::WorkerThread(void*)","symbolLocation":116,"imageIndex":0},{"imageOffset":6328188,"symbol":"CorUnix::CPalThread::ThreadEntry(void*)","symbolLocation":380,"imageIndex":0},{"imageOffset":29292,"symbol":"_pthread_start","symbolLocation":148,"imageIndex":3},{"imageOffset":8332,"symbol":"thread_start","symbolLocation":8,"imageIndex":3}]},{"id":104255,"frames":[{"imageOffset":40656,"symbol":"poll","symbolLocation":8,"imageIndex":2},{"imageOffset":3537280,"symbol":"ds_ipc_poll(_DiagnosticsIpcPollHandle*, unsigned long, unsigned int, void (*)(char const*, unsigned int))","symbolLocation":180,"imageIndex":0},{"imageOffset":4280588,"symbol":"ds_ipc_stream_factory_get_next_available_stream(void (*)(char const*, unsigned int))","symbolLocation":884,"imageIndex":0},{"imageOffset":4272584,"symbol":"server_thread(void*)","symbolLocation":324,"imageIndex":0},{"imageOffset":6328188,"symbol":"CorUnix::CPalThread::ThreadEntry(void*)","symbolLocation":380,"imageIndex":0},{"imageOffset":29292,"symbol":"_pthread_start","symbolLocation":148,"imageIndex":3},{"imageOffset":8332,"symbol":"thread_start","symbolLocation":8,"imageIndex":3}]},{"id":104256,"frames":[{"imageOffset":9456,"symbol":"__open","symbolLocation":8,"imageIndex":2},{"imageOffset":53272,"symbol":"open","symbolLocation":64,"imageIndex":2},{"imageOffset":3540164,"symbol":"TwoWayPipe::WaitForConnection()","symbolLocation":40,"imageIndex":0},{"imageOffset":3515436,"symbol":"DbgTransportSession::TransportWorker()","symbolLocation":196,"imageIndex":0},{"imageOffset":3511548,"symbol":"DbgTransportSession::TransportWorkerStatic(void*)","symbolLocation":12,"imageIndex":0},{"imageOffset":6328188,"symbol":"CorUnix::CPalThread::ThreadEntry(void*)","symbolLocation":380,"imageIndex":0},{"imageOffset":29292,"symbol":"_pthread_start","symbolLocation":148,"imageIndex":3},{"imageOffset":8332,"symbol":"thread_start","symbolLocation":8,"imageIndex":3}]},{"id":104257,"frames":[{"imageOffset":21136,"symbol":"__psynch_cvwait","symbolLocation":8,"imageIndex":2},{"imageOffset":30780,"symbol":"_pthread_cond_wait","symbolLocation":1236,"imageIndex":3},{"imageOffset":6280840,"symbol":"CorUnix::CPalSynchronizationManager::ThreadNativeWait(CorUnix::_ThreadNativeWaitData*, unsigned int, CorUnix::ThreadWakeupReason*, unsigned int*)","symbolLocation":340,"imageIndex":0},{"imageOffset":6280000,"symbol":"CorUnix::CPalSynchronizationManager::BlockThread(CorUnix::CPalThread*, unsigned int, bool, bool, CorUnix::ThreadWakeupReason*, unsigned int*)","symbolLocation":444,"imageIndex":0},{"imageOffset":6297008,"symbol":"CorUnix::InternalWaitForMultipleObjectsEx(CorUnix::CPalThread*, unsigned int, void* const*, int, unsigned int, int, int)","symbolLocation":1676,"imageIndex":0},{"imageOffset":3505404,"symbol":"DebuggerRCThread::MainLoop()","symbolLocation":208,"imageIndex":0},{"imageOffset":3505088,"symbol":"DebuggerRCThread::ThreadProc()","symbolLocation":248,"imageIndex":0},{"imageOffset":3504520,"symbol":"DebuggerRCThread::ThreadProcStatic(void*)","symbolLocation":32,"imageIndex":0},{"imageOffset":6328188,"symbol":"CorUnix::CPalThread::ThreadEntry(void*)","symbolLocation":380,"imageIndex":0},{"imageOffset":29292,"symbol":"_pthread_start","symbolLocation":148,"imageIndex":3},{"imageOffset":8332,"symbol":"thread_start","symbolLocation":8,"imageIndex":3}]},{"id":104258,"frames":[{"imageOffset":21136,"symbol":"__psynch_cvwait","symbolLocation":8,"imageIndex":2},{"imageOffset":30780,"symbol":"_pthread_cond_wait","symbolLocation":1236,"imageIndex":3},{"imageOffset":6280788,"symbol":"CorUnix::CPalSynchronizationManager::ThreadNativeWait(CorUnix::_ThreadNativeWaitData*, unsigned int, CorUnix::ThreadWakeupReason*, unsigned int*)","symbolLocation":288,"imageIndex":0},{"imageOffset":6280000,"symbol":"CorUnix::CPalSynchronizationManager::BlockThread(CorUnix::CPalThread*, unsigned int, bool, bool, CorUnix::ThreadWakeupReason*, unsigned int*)","symbolLocation":444,"imageIndex":0},{"imageOffset":6297008,"symbol":"CorUnix::InternalWaitForMultipleObjectsEx(CorUnix::CPalThread*, unsigned int, void* const*, int, unsigned int, int, int)","symbolLocation":1676,"imageIndex":0},{"imageOffset":6297452,"symbol":"WaitForSingleObjectEx","symbolLocation":80,"imageIndex":0},{"imageOffset":2333048,"symbol":"CLREventBase::WaitEx(unsigned int, WaitMode, PendingSync*)","symbolLocation":196,"imageIndex":0},{"imageOffset":1748436,"symbol":"FinalizerThread::WaitForFinalizerEvent(CLREvent*)","symbolLocation":48,"imageIndex":0},{"imageOffset":1748972,"symbol":"FinalizerThread::FinalizerThreadWorker(void*)","symbolLocation":252,"imageIndex":0},{"imageOffset":1267744,"symbol":"ManagedThreadBase_DispatchOuter(ManagedThreadCallState*)","symbolLocation":260,"imageIndex":0},{"imageOffset":1269236,"symbol":"ManagedThreadBase::FinalizerBase(void (*)(void*))","symbolLocation":36,"imageIndex":0},{"imageOffset":1749284,"symbol":"FinalizerThread::FinalizerThreadStart(void*)","symbolLocation":88,"imageIndex":0},{"imageOffset":6328188,"symbol":"CorUnix::CPalThread::ThreadEntry(void*)","symbolLocation":380,"imageIndex":0},{"imageOffset":29292,"symbol":"_pthread_start","symbolLocation":148,"imageIndex":3},{"imageOffset":8332,"symbol":"thread_start","symbolLocation":8,"imageIndex":3}]}],
  "usedImages" : [
  {
    "source" : "P",
    "arch" : "arm64",
    "base" : 4343758848,
    "size" : 7749632,
    "uuid" : "3ddf2c6d-8b74-3ae6-af41-29399701b1f5",
    "path" : "\/usr\/local\/bin\/tone",
    "name" : "tone"
  },
  {
    "source" : "P",
    "arch" : "arm64e",
    "base" : 4367187968,
    "size" : 393216,
    "uuid" : "fbb89662-e6f2-3434-b542-f75185ac5e74",
    "path" : "\/usr\/lib\/dyld",
    "name" : "dyld"
  },
  {
    "source" : "P",
    "arch" : "arm64e",
    "base" : 6940667904,
    "size" : 229376,
    "uuid" : "1d7b3b8e-75a1-34ea-aa52-9f7c23155c55",
    "path" : "\/usr\/lib\/system\/libsystem_kernel.dylib",
    "name" : "libsystem_kernel.dylib"
  },
  {
    "source" : "P",
    "arch" : "arm64e",
    "base" : 6940897280,
    "size" : 53248,
    "uuid" : "cee8bc77-6923-34d9-89a3-6f8f7279605e",
    "path" : "\/usr\/lib\/system\/libsystem_pthread.dylib",
    "name" : "libsystem_pthread.dylib"
  },
  {
    "size" : 0,
    "source" : "A",
    "base" : 0,
    "uuid" : "00000000-0000-0000-0000-000000000000"
  }
],
  "sharedCache" : {
  "base" : 6937608192,
  "size" : 3136438272,
  "uuid" : "00edbaf8-9281-3f26-b94f-e6a315e3a659"
},
  "vmSummary" : "ReadOnly portion of Libraries: Total=684.0M resident=0K(0%) swapped_out_or_unallocated=684.0M(100%)\nWritable regions: Total=805.8M written=0K(0%) resident=0K(0%) swapped_out=0K(0%) unallocated=805.8M(100%)\n\n                                VIRTUAL   REGION \nREGION TYPE                        SIZE    COUNT (non-coalesced) \n===========                     =======  ======= \nKernel Alloc Once                   32K        1 \nMALLOC                           162.2M       15 \nMALLOC guard page                   96K        5 \nMALLOC_MEDIUM (reserved)         240.0M        2         reserved VM address space (unallocated)\nMALLOC_NANO (reserved)           384.0M        1         reserved VM address space (unallocated)\nSTACK GUARD                       56.1M        7 \nStack                             11.2M        7 \nVM_ALLOCATE                        2.5G       20 \n__AUTH                             241K       50 \n__AUTH_CONST                      2960K      129 \n__DATA                            1162K      123 \n__DATA_CONST                      3917K      130 \n__DATA_DIRTY                       234K       51 \n__LINKEDIT                       596.4M        3 \n__OBJC_CONST                       279K       31 \n__OBJC_RO                         82.9M        1 \n__OBJC_RW                         3152K        1 \n__TEXT                            87.7M      137 \n__UNICODE                          592K        1 \ndyld private memory               1024K        1 \nshared memory                       16K        1 \n===========                     =======  ======= \nTOTAL                              4.1G      717 \nTOTAL, minus reserved VM space     3.5G      717 \n",
  "legacyInfo" : {
  "threadTriggered" : {
    "queue" : "com.apple.main-thread"
  }
},
  "trialInfo" : {
  "rollouts" : [
    {
      "rolloutId" : "6112dda2fc54bc3389840642",
      "factorPackIds" : {
        "SIRI_DICTATION_ASSETS" : "628bd2fda5168570b594bb52"
      },
      "deploymentId" : 240000135
    },
    {
      "rolloutId" : "61af99aeda72d16a4beb7756",
      "factorPackIds" : {

      },
      "deploymentId" : 240000176
    }
  ],
  "experiments" : [

  ]
}
}

Model: MacBookAir10,1, BootROM 7459.101.2, proc 8:4:4 processors, 16 GB, SMC 
Graphics: Apple M1, Apple M1, Built-In
Display: Color LCD, 2560 x 1600 Retina, Main, MirrorOff, Online
Display: ES07D03, 5120 x 2880 (5K/UHD+ - Ultra High Definition Plus), MirrorOff, Online
Memory Module: LPDDR4
AirPort: Wi-Fi, wl0: Feb  8 2022 01:44:45 version 18.60.21.0.7.8.126 FWID 01-1cdae627
Bluetooth: Version (null), 0 services, 0 devices, 0 incoming serial ports
Network Service: Thunderbolt Ethernet Slot 0, Ethernet, en6
Network Service: iPhone, Ethernet, en7
Network Service: Wi-Fi, AirPort, en0
PCI Card: pci1b73,1100, USB eXtensible Host Controller, Thunderbolt@6,0,0
PCI Card: pci1b73,1100, USB eXtensible Host Controller, Thunderbolt@5,0,0
PCI Card: ethernet, Ethernet Controller, Thunderbolt@3,0,0
PCI Card: pci1b21,1242, USB eXtensible Host Controller, Thunderbolt@4,0,0
PCI Card: pci8086,15d4, USB eXtensible Host Controller, Thunderbolt@7,0,0
PCI Card: pci1987,5012, NVM Express Controller, Thunderbolt@4,0,0
PCI Card: pci8086,15f0, USB eXtensible Host Controller, Thunderbolt@3,0,0
USB Device: USB31Bus
USB Device: USB31Bus
USB Device: USB30Bus
USB Device: iPhone
USB Device: CalDigit Thunderbolt 3 Audio
USB Device: USB30Bus
USB Device: Card Reader
USB Device: Portable
USB Device: USB31Bus
USB Device: USB31Bus
USB Device: Billboard
USB Device: USB31Bus
Thunderbolt Bus: MacBook Air, Apple Inc.
Thunderbolt Device: TS3 Plus, CalDigit, Inc., 1, 44.1
Thunderbolt Bus: MacBook Air, Apple Inc.
Thunderbolt Device: Rocket XTRM Q, Sabrent, 1, 60.1

Spectre CommandRuntimeException

Hello, I've just gotten the new release to test the fixed issues, but I seem to be running into a new one...

$ tone-0.1.3-linux-x64/tone 
Spectre.Console.Cli.CommandRuntimeException: Could not get settings type for command of type 'tone.Commands.DumpCommand'.
  at ConfiguredCommand Spectre.Console.Cli.ConfiguredCommand.FromType<TCommand>(string , bool )
  at ICommandConfigurator Spectre.Console.Cli.Configurator.AddCommand<TCommand>(string )       
  at void Program.<>c__DisplayClass0_0.<<Main>$>b__8(IConfigurator )                           
  at async Task<int> Program.<Main>$(string[] )

It's happening both on my linux desktop (above) and the musl version within docker (below)

# tone
Spectre.Console.Cli.CommandRuntimeException: Could not get settings type for command of type 'tone.Commands.DumpCommand'.
  at ConfiguredCommand Spectre.Console.Cli.ConfiguredCommand.FromType<TCommand>(string , bool )
  at ICommandConfigurator Spectre.Console.Cli.Configurator.AddCommand<TCommand>(string )       
  at void Program.<>c__DisplayClass0_0.<<Main>$>b__8(IConfigurator )                           
  at async Task<int> Program.<Main>$(string[] )

Is there something I've done wrong with the new version? 0.1.2 works as expected thru direct extraction & execution.

Thanks in advance

invalid chapter "length" parameter in json output

Hello,

I have an ogg opus file which is part of a split-file audiobook. The first file contains embedded chapters which can be loaded by audiobookshelf. ABS uses tone for metadata analysis, and is getting some invalid chapter data past the first chapter. I decided to test tone standalone and see how the metadata was coming through. For some reason, this tool seems to generate invalid data for the "length" property for all except the first chapter. The embedded metadata is the standard vorbis chapters comment format, with no durations specified. Additionally, the chapters list total duration far exceeds the playback time of the file, so that could be having some fun interactions.

tone dump & opusinfo output:
https://gist.github.com/itzexor/29cd09be45ea986900fc8e6d7b2904d5

edit:
it's clear from the gist, but i forgot to mention that this is with json output. i didn't actually see a duration in the default dump

Remove specific strings from a tag

Is it possible to remove a specific string in a tag of a m4b-file if that string exists?

e.g.
Album name: "The great audiobook - stringtoberemoved"

--> Album name: "The great audiobook"

Add a license

Add a LICENSE file, probably Apache 2.0:


                                 Apache License
                           Version 2.0, January 2004
                        https://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   Copyright 2013-2018 Docker, Inc.

   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

       https://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.

Implement `--exclude-property` for `dump` command

Having an --include-property is good, but for some cases an --exclude-property would be better, especiall for

tone dump input.mp3 --format=json --exclude-property=pictures --exclude-property=chapters

to keep the dump small.

Support JSON response when tagging

When tagging there is only a response to be used in a CLI.

Also, when the tag fails there is no way to check if the tag failed since everything is written to stdout.

ChptFmtNative needs more info

There is not currently enough info to understand how to add chapters to the Metadata. The documentation states that all that is required is the command tone tag --taggers="ChptFmtNative" [file] and the chapter data found in chapters.txt (assumedly in the same directory that the [file] is in - but I also tried the current directory and the user home directory) will be added. There is no indication of what format or interface to use. After reading through your tests it seems that the format to use is something like 00:00:00.000 chapter 1 \n00:00:05.000 chapter 2 \n00:00:15.000 chapter 3. This should be indicated. Despite this, it doesn't make any changes and simply states unchanged: [file], and does not give any indication whether the file was picked up or not. More information should be added to the documentation to make this process much clearer... I have also tried adding the --debug flag and changing the name of the chapters file and nothing changes.

Using: Windows 10 and Powershell

Documentation updates

The documentation has to be updated:

  • Sample of tone.json format
  • Reference to the official docker images
  • Reserved tone metadata fields:
    • ----:com.pilabor.tone:AUDIBLE_ASIN: Audible ASIN
    • ----:com.pilabor.tone:PART: Movement index (e.g. 1 or 2.5 - offical m4b mvi does not store strings, but integers)

Tagging m4b is changing the timebase

The milliseconds of chapter times are changing when tagging m4b files. I'm not sure if it is isolated to m4b because I haven't tested mp3 yet. This was reported here advplyr/audiobookshelf#1060

When trying to track down why this is happening I noticed that m4b audiobooks I have that are using a 1/1000 timebase are being converted to 1/44100

I added a sample file named TimebaseSample.m4b here: https://github.com/advplyr/node-tone/tree/master/samples

Before tagging:

{
    "id": 1,
    "time_base": "1/1000",
    "start": 14043,
    "start_time": "14.043000",
    "end": 393113,
    "end_time": "393.113000",
    "tags": {
        "title": "Chapter 1"
    }
}

After tagging:

{
    "id": 1,
    "time_base": "1/44100",
    "start": 619296,
    "start_time": "14.042993",
    "end": 17336283,
    "end_time": "393.112993",
    "tags": {
        "title": "Chapter 1"
    }
}

The time base doesn't really matter in the end but I think it may be related to the milliseconds getting changed.

Null reference exception using dump --format json on DRM protected file

Trying to extract the chapters from a DRM protected file and write to a file so I can write them back into the non-DRM protected version. I can dump the chapters using the standard format, and manually edit this into a standard chapter format, but this is time consuming.

Trying this command so I can automate all files:
tone dump drmfilename.m4b --include-property chapters --format json > chapters.json

Then write back with this command:
tone tag nodrmfilename.m4b --meta-tone-json-file="chapters.json" --auto-import="tonejson"

When I try to dump the chapters with the json format I get a null reference exception. Debugging the application, turns out that track.ChannelsArragement is null on these files. So, the SerializeAsync method fails with the null reference exception on this line:

Channels = new { Count = track.ChannelsArrangement.NbChannels, Description = track.ChannelsArrangement.Description },

I tried it with this line commented out and I was able to write the file fine without the Channels info and the nodrm file kept its existing Channels info.

Great tool btw!

Add `--auto-import=ffmetadata`

For export / dump there already is support for ffmetadata format - but import is not supported yet.

Todo:

  • Finish implementation ReadAsync in FfmetadataFormat class
  • Extend enum with Ffmetadata
  • Implement FfmetadataTagger
  • Add Tagger in TagCommand

Trojan warning of 0.1.4 binary on Windows 10

After downloading and executing the clone.exe binary, Windows Defender prevents it from running marking it

https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?name=Trojan%3aWin32%2fBearfoos.A!ml&threatid=2147731250

Trojan:Win32/Bearfoos.A!ml
Detected by Microsoft Defender Antivirus
Aliases: No associated aliases

Summary
Microsoft Defender Antivirus detects and removes this threat.

This threat can perform a number of actions of a malicious hacker's choice on your PC.

Could not find file with double quote in name and folder

Filename: /audiobooks/Scott Frost/"Diane..." The Twin Peaks Tapes of Agent Cooper/"Diane..." The Twin Peaks Tapes of Agent Cooper.m4b

If I try this in the directory
tone dump \"Diane...\"\ The\ Twin\ Peaks\ Tapes\ of\ Agent\ Cooper.m4b
I get the error
Error: Could not find file '/audiobooks/Scott Frost/"Diane..." The Twin Peaks Tapes of Agent Cooper/Diane...'.

If I rename the file to test.m4b tone dump generates output.

Version 0.1.2 bundled with AudiobookShelf

Ideas collection

Unsorted Ideas for improvements:

external binaries (like ffmpeg and fdkaac)

filter options notes

class OrderByDirective<IEnumerable<T>> : IDirective<IEnumerable<T>> {
    public OrderByInstructions(string orderBy) {
         _parseOrderBy(orderBy);
    }

   public Apply(IEnumerable<T> items) {

   }
}

Add `--stdin` / `pipe` support for `tag` command and `tone.json`

Instead of always creating a metadata file, we may want to accept data on stdin / via pipe. Example:

echo '{"album": "My Album"}' | tone tag --stdin="json" a-music-file.mp3

Maybe with --query support:

echo '{"meta": {"album": "My Album"}}' | tone tag --stdin="json" --query="$.meta" a-music-file.mp3

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.