Ambrevar/demlo

Album-awareness and input ordering

Ambrevar opened this issue · 11 comments

In #4 we mentioned the issue of auto-numbering tracks according to their position in the queue.

There are several ways to proceed. Some do not cope well with parallelization.

Using the queue order in the script is not very flexible though: what if the sorting (which depends on the locale) does not suit the user?

Probably better: add a directory listing function. That should not harm the sandboxed nature of Demlo.
By matching the track path with the directory listing, we could auto-number the tracks.

Other things to consider: online tagging needs some sort of album awareness to identify albums, to instance the total track count.

For maximum flexibility, we could simply dispatch the online tagging function (and covers) to a script.
This way it would be possible from the Lua side to first gather the list of files in the current directory to infer the total track count, then tag online.

What about reading external file tags from the Lua side? This would probably require some sort of caching too avoid excessive I/O.
Export a metadata function then?

For maximum flexibility, we could simply dispatch the online tagging function (and covers) to a script.
This way it would be possible from the Lua side to first gather the list of files in the current directory to infer the total track count, then tag online.

This seems like a good idea, yes. Though "the currently directory" is not general enough, since the user can pass in any list of files they want.

What about reading external file tags from the Lua side? This would probably require some sort of caching too avoid excessive I/O.
Export a metadata function then?

I don't understand what you mean by this. They're read on the Go side and accesible via input.tags on the Lua side—why should this change?

Current directory: Indeed, any directory is even better and it comes at no cost.

External metadata: because the input and output structures accessible on the Lua side only refer to the current track. What if you want to count all the tracks that have the same album? You need to inspect their metadata and right now there is no way to do that from a Lua script.

I suggest two functions:

  • list_directory(path string) []string
  • metadata(path string) input{}

Oh, I see. Yes I've had a thought about this. I think that could indeed work if caching is done. Here's another option: Have a table inputs that's just a list of input tables indexed by a canonical ordering of files/directories. Then add a field index to each input table, specifying where in the inputs array it is.

Wait, why do you want the metadata() function to take a path as input? Can you give a use case for that?

Did you expect something else?

Well I'm just imagining that it would be hard to use. How would you know the path when writing the script? With my input method, you could have a script do preprocessing by iterating through each input to get a list of unique album names, number of tracks for each album, etc. How would you accomplish this with metadata()?

The problem with the inputs table is that it must be built beforehand,
which severely impedes the parallel processing.

Besides, iterating over the full table for every track does not scale
well to big folder hierarchies.

Concrete example with what I suggest:

tracktotal=0
for _, j in pairs(list_directory(dirname(input.path))) do
  local in = metadata(j)
  if in then
    stringrel(in.tags.album, i.album) > 0.7
    tracktotal = tracktotal + 1
  end
end

The problem with the inputs table is that it must be built beforehand,
which severely impedes the parallel processing.

This is true. But how is caching all the metadata beforehand any faster? Isn't it the exact same thing?

Besides, iterating over the full table for every track does not scale
well to big folder hierarchies.

That's certainly true as well. Let me think about that.

Ok I see what you mean. It's the same speed if you do end up looping through every input file, it just wouldn't do that every time unless you tell it to.