Skip to content

Write audio tags back into files#728

Merged
daschuer merged 57 commits intomixxxdj:masterfrom
uklotzde:WriteAudioTags
Dec 10, 2017
Merged

Write audio tags back into files#728
daschuer merged 57 commits intomixxxdj:masterfrom
uklotzde:WriteAudioTags

Conversation

@uklotzde
Copy link
Copy Markdown
Contributor

@uklotzde uklotzde commented Oct 3, 2015

Re-enables writing of metadata into files:
https://bugs.launchpad.net/mixxx/+bug/728197

Related bugs:
https://bugs.launchpad.net/mixxx/+bug/1156868
https://bugs.launchpad.net/mixxx/+bug/687293
https://bugs.launchpad.net/mixxx/+bug/1181869

Contains lots of fixes around TrackInfoObject including caching of TIOs to safely manage all references of a file. I'm already using a version of Mixxx built from this branch for myself. It has proven to be very stable and I only discovered and fixed some rare edge cases (like hide + purge + rescan while a track is still cached) recently.

New preferences for "Library" in section "Audio File Tags"

  • "Write modified track meta-data from library into files as audio tags"
  • "Update track meta-data in library by reloading audio tags from files" 2016-06-24: Considered experimental and moved into another branch. Has some nasty side-effects when selecting and loading multiple tracks at once.

The 2nd option should only be enabled after all files are in sync with your Mixxx library! Otherwise the information stored in your Mixxx library gets updated/overwritten whenever Mixxx accesses a file. A warning message will appear if you enable this option to prevent users from unintentionally selecting it. 2016-06-24: Considered experimental and moved into another branch. Has some nasty side-effects when selecting and loading multiple tracks at once.

New context menu item (mainly for migration purposes):

  • "Save Metadata into File"

What's missing (optional):

  • Add a separate dirty flag for track metadata
  • Use QSaveFile from Qt5

I've finished to separate my modifications into commits that are hopefully reviewable now. The changes are numerous! Even if the refactoring is not completely finished I'm already very happy with the end result. Now I can use Mixxx to manage my music library except when I need to edit the properties of multiple tracks at once.

Note
I will rebase and edit this branch frequently until we agree that it is mergeable ;) That's the reason for tagging this PR with [PREVIEW]

@ferranlala
Copy link
Copy Markdown
Contributor

Nice nice nice! Thank you.
Any specific things to test?

2015-10-03 17:59 GMT+02:00 Uwe Klotz notifications@github.com:

Re-enables writing of metadata into files:
https://bugs.launchpad.net/mixxx/+bug/728197

Related bugs:
https://bugs.launchpad.net/mixxx/+bug/1156868
https://bugs.launchpad.net/mixxx/+bug/687293
https://bugs.launchpad.net/mixxx/+bug/1181869

This PR is intended as a preview and for testing purposes. Please note
that I will rebase the corresponding branch on master frequently!

Contains lots of fixes around TrackInfoObject including caching of TIOs to
safely manage all references of a file. I'm already using a version of
Mixxx built from this branch for myself. It has proven to be very stable
and I only discovered and fixed some rare edge cases (like hide + purge +
rescan while a track is still cached) recently.

What's missing (optional):

  • Add a separate dirty flag for track metadata
  • Use QSaveFile from Qt5

You can view, comment on, or merge this pull request online at:

#728
Commit Summary

  • Delete redundant constructor
  • Initialize members directly and reuse initialize()
  • Delete redundant QFileInfo instance
  • Make the track location immutable
  • Delete unnecessary destructor
  • Fix signature of operator<< for QDebug
  • Log full track location instead of only the file name
  • Rename file name/size functions in TrackInfoObject
  • Exclude certain columns from editing in table model
  • Delete outdated comment
  • Add more comments about thread-safety of QFileInfo
  • Get rid of LegacyLibraryImporter
  • Move code from initialize() into constructor
  • Delete obsolete file headers and redundant #include directives
  • Reorder member functions in class definition
  • Remove TrackPointer from cover art widgets
  • Merge branch 'master' of https://github.com/mixxxdj/mixxx.git into
    TrackLocationImmutable
  • Move code for obtaining the global key as text to KeyUtils
  • Merge branch 'master' into TrackLocationImmutable
  • Wrap times played and played flag into PlayCounter
  • Replace QScopedPointer with std::unique_ptr
  • Add URL field to track metadata
  • Add operator ==/!= for track metadata
  • Add functions for normalizing floating-point values to track metadata
  • Add function for formatting duration values to track metadata
  • Require a TIO for creating a SoundSourceProxy instance
  • Use QSharedPointer for cue points
  • Rename functions in SoundSourceProviderRegistry
  • Reorder functions in SoundSourceProxy (static before member)
  • Reorder fields in track metadata
  • Keep TIO alive while reading audio data
  • Simplify handling of duration in TIO
  • Reduce visibility of copy constructor
  • Rename BPM functions and apply some refactoring
  • Add factory methods for creating temporary TIOs
  • Reorder and functions in TIO
  • Rename functions for loading metadata and cover art
  • Remove obsolete security token from SoundSourceProxy
  • Parse track metadata and cover art through SoundSourceProxy
  • Fix handling of musical key in TIO
  • Change replay gain type from float to double
  • Change management of dirty flag
  • Encapsulate location and id of tracks in TrackRef
  • Drop obsolete class AudioTagger
  • Add overridable function for writing track metadata into file
  • Rename functions in TrackDAO
  • Aggregated commit ...will be broken down into multiple PRs

File Changes

Patch Links:


Reply to this email directly or view it on GitHub
#728.

@uklotzde
Copy link
Copy Markdown
Contributor Author

uklotzde commented Oct 3, 2015

Nothing particular to test.

The code contains a lot of DEBUG_ASSERTs that are disabled in release
builds. It would be helpful if you use start playing with a debug build by
using the following scons options:
qdebug=1
debug_assertions_fatal=1

With these options Mixxx should crash when an assert condition is violated.
Also good for collecting stack traces. I'm interested in both of them ;)

Please have a look at the new Library options in the section Audio File
Tags. Use the 2nd option ONLY if the metadata in your files is the master
and the Mixxx library just serves as a fast, searchable cache that gets
updated from your files. This is the way I work.

On 10/03/2015 06:09 PM, Ferran Pujol Camins wrote:

Nice nice nice! Thank you.
Any specific things to test?

2015-10-03 17:59 GMT+02:00 Uwe Klotz notifications@github.com:

Re-enables writing of metadata into files:
https://bugs.launchpad.net/mixxx/+bug/728197

Related bugs:
https://bugs.launchpad.net/mixxx/+bug/1156868
https://bugs.launchpad.net/mixxx/+bug/687293
https://bugs.launchpad.net/mixxx/+bug/1181869

This PR is intended as a preview and for testing purposes. Please note
that I will rebase the corresponding branch on master frequently!

Contains lots of fixes around TrackInfoObject including caching of TIOs to
safely manage all references of a file. I'm already using a version of
Mixxx built from this branch for myself. It has proven to be very stable
and I only discovered and fixed some rare edge cases (like hide + purge +
rescan while a track is still cached) recently.

What's missing (optional):

  • Add a separate dirty flag for track metadata
  • Use QSaveFile from Qt5

You can view, comment on, or merge this pull request online at:

#728
Commit Summary

  • Delete redundant constructor
  • Initialize members directly and reuse initialize()
  • Delete redundant QFileInfo instance
  • Make the track location immutable
  • Delete unnecessary destructor
  • Fix signature of operator<< for QDebug
  • Log full track location instead of only the file name
  • Rename file name/size functions in TrackInfoObject
  • Exclude certain columns from editing in table model
  • Delete outdated comment
  • Add more comments about thread-safety of QFileInfo
  • Get rid of LegacyLibraryImporter
  • Move code from initialize() into constructor
  • Delete obsolete file headers and redundant #include directives
  • Reorder member functions in class definition
  • Remove TrackPointer from cover art widgets
  • Merge branch 'master' of https://github.com/mixxxdj/mixxx.git into
    TrackLocationImmutable
  • Move code for obtaining the global key as text to KeyUtils
  • Merge branch 'master' into TrackLocationImmutable
  • Wrap times played and played flag into PlayCounter
  • Replace QScopedPointer with std::unique_ptr
  • Add URL field to track metadata
  • Add operator ==/!= for track metadata
  • Add functions for normalizing floating-point values to track metadata
  • Add function for formatting duration values to track metadata
  • Require a TIO for creating a SoundSourceProxy instance
  • Use QSharedPointer for cue points
  • Rename functions in SoundSourceProviderRegistry
  • Reorder functions in SoundSourceProxy (static before member)
  • Reorder fields in track metadata
  • Keep TIO alive while reading audio data
  • Simplify handling of duration in TIO
  • Reduce visibility of copy constructor
  • Rename BPM functions and apply some refactoring
  • Add factory methods for creating temporary TIOs
  • Reorder and functions in TIO
  • Rename functions for loading metadata and cover art
  • Remove obsolete security token from SoundSourceProxy
  • Parse track metadata and cover art through SoundSourceProxy
  • Fix handling of musical key in TIO
  • Change replay gain type from float to double
  • Change management of dirty flag
  • Encapsulate location and id of tracks in TrackRef
  • Drop obsolete class AudioTagger
  • Add overridable function for writing track metadata into file
  • Rename functions in TrackDAO
  • Aggregated commit ...will be broken down into multiple PRs

File Changes

Patch Links:


Reply to this email directly or view it on GitHub
#728.


Reply to this email directly or view it on GitHub
#728 (comment).

@uklotzde
Copy link
Copy Markdown
Contributor Author

uklotzde commented Oct 3, 2015

...and there is a new context menu option "Write Metadata into File" that
allows to write the track metadata from your Mixxx library into your files.
This is mainly intended for migration purposes after writing tags into files
has been disabled for a long time. For most users the information stored in
their Mixxx library will be newer than what is stored in their files.

On 10/03/2015 06:09 PM, Ferran Pujol Camins wrote:

Nice nice nice! Thank you.
Any specific things to test?

2015-10-03 17:59 GMT+02:00 Uwe Klotz notifications@github.com:

Re-enables writing of metadata into files:
https://bugs.launchpad.net/mixxx/+bug/728197

Related bugs:
https://bugs.launchpad.net/mixxx/+bug/1156868
https://bugs.launchpad.net/mixxx/+bug/687293
https://bugs.launchpad.net/mixxx/+bug/1181869

This PR is intended as a preview and for testing purposes. Please note
that I will rebase the corresponding branch on master frequently!

Contains lots of fixes around TrackInfoObject including caching of TIOs to
safely manage all references of a file. I'm already using a version of
Mixxx built from this branch for myself. It has proven to be very stable
and I only discovered and fixed some rare edge cases (like hide + purge +
rescan while a track is still cached) recently.

What's missing (optional):

  • Add a separate dirty flag for track metadata
  • Use QSaveFile from Qt5

You can view, comment on, or merge this pull request online at:

#728
Commit Summary

  • Delete redundant constructor
  • Initialize members directly and reuse initialize()
  • Delete redundant QFileInfo instance
  • Make the track location immutable
  • Delete unnecessary destructor
  • Fix signature of operator<< for QDebug
  • Log full track location instead of only the file name
  • Rename file name/size functions in TrackInfoObject
  • Exclude certain columns from editing in table model
  • Delete outdated comment
  • Add more comments about thread-safety of QFileInfo
  • Get rid of LegacyLibraryImporter
  • Move code from initialize() into constructor
  • Delete obsolete file headers and redundant #include directives
  • Reorder member functions in class definition
  • Remove TrackPointer from cover art widgets
  • Merge branch 'master' of https://github.com/mixxxdj/mixxx.git into
    TrackLocationImmutable
  • Move code for obtaining the global key as text to KeyUtils
  • Merge branch 'master' into TrackLocationImmutable
  • Wrap times played and played flag into PlayCounter
  • Replace QScopedPointer with std::unique_ptr
  • Add URL field to track metadata
  • Add operator ==/!= for track metadata
  • Add functions for normalizing floating-point values to track metadata
  • Add function for formatting duration values to track metadata
  • Require a TIO for creating a SoundSourceProxy instance
  • Use QSharedPointer for cue points
  • Rename functions in SoundSourceProviderRegistry
  • Reorder functions in SoundSourceProxy (static before member)
  • Reorder fields in track metadata
  • Keep TIO alive while reading audio data
  • Simplify handling of duration in TIO
  • Reduce visibility of copy constructor
  • Rename BPM functions and apply some refactoring
  • Add factory methods for creating temporary TIOs
  • Reorder and functions in TIO
  • Rename functions for loading metadata and cover art
  • Remove obsolete security token from SoundSourceProxy
  • Parse track metadata and cover art through SoundSourceProxy
  • Fix handling of musical key in TIO
  • Change replay gain type from float to double
  • Change management of dirty flag
  • Encapsulate location and id of tracks in TrackRef
  • Drop obsolete class AudioTagger
  • Add overridable function for writing track metadata into file
  • Rename functions in TrackDAO
  • Aggregated commit ...will be broken down into multiple PRs

File Changes

Patch Links:


Reply to this email directly or view it on GitHub
#728.


Reply to this email directly or view it on GitHub
#728 (comment).

@uklotzde uklotzde changed the title [PREVIEW] Write audio tags Write audio tags Oct 13, 2015
Comment thread src/library/browse/browsetablemodel.h Outdated
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was intentional at the time since some people use Browse instead of the library and we want to let them edit the tracks in a way that persists across sessions and we didn't want to edit the files on disk by default unless the user opts in to that.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will delete the question and move the comment (including your remarks) to
the corresponding invocation to reveal this intention.

On 12/27/2015 05:49 PM, RJ Ryan wrote:

In src/library/browse/browsetablemodel.h
#728 (comment):

@@ -37,35 +37,42 @@ const int COLUMN_REPLAYGAIN = 20;
// The BrowseTable models displays tracks
// of given directory on the HDD.
// Usage: Recording and Browse feature.
+//
+// NOTE(uklotzde): Accessing tracks from the browse view will

This was intentional at the time since some people use Browse instead of
the library and we want to let them edit the tracks in a way that persists
across sessions and we didn't want to edit the files on disk by default
unless the user opts in to that.


Reply to this email directly or view it on GitHub
https://github.com/mixxxdj/mixxx/pull/728/files#r48456406.

@Alibaobao
Copy link
Copy Markdown

hey im a complete noob about all these branches, compiling and stuff
how can i compile a version of mixxx with your changes ?

@uklotzde
Copy link
Copy Markdown
Contributor Author

You definitely need some knowledge about how to set up a development
environment for your OS to compile Mixxx. It is explained in the Wiki:

http://mixxx.org/wiki/doku.php/start#developer_documentation

If you don't want to do any development yourself you can simply clone my
Mixxx repository from GitHub:

git clone https://github.com/uklotzde/mixxx.git
git checkout WriteAudioTags

...and then start the build as explained in the Wiki.

On 02/20/2016 01:25 PM, Alibaobao wrote:

hey im a complete noob about all these branches, compiling and stuff
how can i compile a version of mixxx with your changes ?


Reply to this email directly or view it on GitHub
#728 (comment).

@Alibaobao
Copy link
Copy Markdown

thanks for your work and help
it works very nice

@uklotzde
Copy link
Copy Markdown
Contributor Author

Glad to hear you managed to compile it :) Please note, that I rebase this
branch on master very often to keep it aligned. You might need to checkout
master, pull all changes from my repository, checkout the remote
WriteAudioTags branch again and rebuild.

I'm using this version for keeping my tags in sync with the library. Editing
tags of multiple files still requires puddletag (or something similar).

If you have some feedback, e.g. on how to name or describe the two new
options in the library settings that could be helpful. Did you understand
from the descriptions how these two options work, especially the 2nd one?

On 02/20/2016 03:56 PM, Alibaobao wrote:

thanks for your work and help
it works very nice


Reply to this email directly or view it on GitHub
#728 (comment).

@Alibaobao
Copy link
Copy Markdown

I use your build because i don't want an external beat-analyzer
but want to sort my files by bpm and key.
I still use the normal Version to Scan new files though
because it seems that no beat and key analyzer is configured.
i don't know if it is possible, but can mixxx write the key libary-data into the file ?
the second option means that it rewrites your libary-data using the filetags ?
if that is right its well explained how it works

@uklotzde
Copy link
Copy Markdown
Contributor Author

What do you mean with "normal Version"? Both bpm and key are written into tags.

You can explicitly overwrite the file tags with the metadata from your
library by selecting some tracks and invoking ""Save Metadata into File"
from the context menu. That's more or less the opposite of 2nd configuration
option and enables you to synchronize your file tags with your library.

On 02/21/2016 07:05 PM, Alibaobao wrote:

I use your build because i don't want an external beat-analyzer
but want to sort my files by bpm and key.
I still use the normal Version to Scan new files though
because it seems that no beat and key analyzer is configured.
i don't know if it is possible, but can mixxx write the key libary-data
into the file ?
the second option means that it rewrites your libary-data using the filetags ?
if that is right its well explained how it works


Reply to this email directly or view it on GitHub
#728 (comment).

@uklotzde
Copy link
Copy Markdown
Contributor Author

uklotzde commented Mar 6, 2016

Further discussions about the topic can be found in this closed PR:

#901

This solution works fine for me and is safe. But we need to figure out how to handle existing libraries with inconsistencies or duplicates.

@skaldarnar
Copy link
Copy Markdown

Just wanted to let you know I've been using this branch (local build) for a few days now and haven't encountered any serious issues. Here are two notes/questions I'd like to share with you:

  • saving the metadata of several files at once freezes the UI (active song still playing)
  • which tags are actually written? is the popularimeter in use for saving the rating?

@uklotzde
Copy link
Copy Markdown
Contributor Author

UI freezes are a general issue in Mixxx, because all the library management
code runs in the same UI thread. You will notice this whenever you try to
perform batch operations on a large number of tracks. Even searching is
painfully slow.

Unfortunately there is no common standard for saving ratings in tags, so I
decided don't save them. And before saving them you need to read them ;) I
have my own scheme to encode "rating", "energy", "mood", and "decade" in the
comments field that is easy to filter and portable across various applications.

On 03/21/2016 10:43 AM, Tobias Nett wrote:

Just wanted to let you know I've been using this branch (local build) for
a few days now and haven't encountered any serious issues. Here are two
notes/questions I'd like to share with you:

  • saving the metadata of several files at once freezes the UI (active
    song still playing)
  • which tags are actually written? is the |popularimeter| in use for
    saving the rating?


You are receiving this because you authored the thread.
Reply to this email directly or view it on GitHub
#728 (comment)

@ywwg
Copy link
Copy Markdown
Member

ywwg commented Mar 21, 2016

take a look at the new track exporter code for an idea of how to do non-blocking library operations in a separate worker thread. That code still uses a modal window, but the important part is it's not too hard to make sure the write-to-disk operations don't happen in the UI thread.

@uklotzde
Copy link
Copy Markdown
Contributor Author

But write-to-disk operations occur individually for each track and cannot be
queued safely. If they happen sometime later in a different thread the
corresponding file might already be in use again. Modifications must be
written to disk immediately when the corresponding TrackInfoObject is
evicted from the cache before it is deleted.

On 03/21/2016 03:24 PM, Owen Williams wrote:

take a look at the new track exporter code for an idea of how to do
non-blocking library operations in a separate worker thread. That code
still uses a modal window, but the important part is it's not too hard to
make sure the write-to-disk operations don't happen in the UI thread.


You are receiving this because you authored the thread.
Reply to this email directly or view it on GitHub
#728 (comment)

@ywwg
Copy link
Copy Markdown
Member

ywwg commented Mar 21, 2016

how long do these writes usually take? Would it be possible to flip a flag in the TIO that prevents the track from being loaded while the write is in progress? A boolean indicating a lock, basically. We could gray the track out in the library while it's being written. For bulk operations, a modal window with progress bar seems reasonable.

@uklotzde
Copy link
Copy Markdown
Contributor Author

The library gets updated in the same moment which also involves a write
operation on disk. This is the current behaviour. Consequently all those
operations need to be revised.

But the write operations have never been an issue for me. Doing bulk updates
in a live situation is a very rare use case. What's becoming more and more
frustrating to me are the UI freezes during each database query that block
the UI for seconds. This really hurts!

On 03/21/2016 03:43 PM, Owen Williams wrote:

how long do these writes usually take? Would it be possible to flip a flag
in the TIO that prevents the track from being loaded while the write is in
progress? A boolean indicating a lock, basically. We could gray the track
out in the library while it's being written. For bulk operations, a modal
window with progress bar seems reasonable.


You are receiving this because you authored the thread.
Reply to this email directly or view it on GitHub
#728 (comment)

@ywwg
Copy link
Copy Markdown
Member

ywwg commented Mar 21, 2016

So there are two writes going on -- writing to the library and writing the track metadata. The library is an sqlite database, and sqlite does its own caching and disk access so it's going to be fairly efficient. Writing the audio tags involves us mutating track files on disk ourselves. My interpretation is that the new UI freezes are caused by the writes to the track files, not the library database. Therefore I'm talking about putting a "lock" on the track entries so the tracks can't be loaded while the metadata is being synced, and then moving that syncing to a separate thread.

If the UI freezes we are talking about are totally unrelated to this PR, then that's a separate bug that should be discussed in its own report. But @skaldarnar seemed to say that something in this PR specifically is causing more UI freezes, and that's what I'm trying to figure out. If metadata syncing is being done in the UI thread, I think that's a bad design choice and we should use techniques like I mentioned to avoid it.

Bulk updates will happen while exiting the program and the whole cache gets cleared at once.

@uklotzde
Copy link
Copy Markdown
Contributor Author

Most bulk operations on tracks are currently causing UI freezes. That's an
issue that needs to be solved by a general library re-design that takes both
read and write operations into account.

There still is an unfinished "Library concurrency refactoring" PR from a
previous GSOC that has not been integrated?

On 03/21/2016 04:01 PM, Owen Williams wrote:

So there are two writes going on -- writing to the library and writing the
track metadata. The library is an sqlite database, and sqlite does its own
caching and disk access so it's going to be fairly efficient. Writing the
audio tags involves us mutating track files on disk ourselves. My
interpretation is that the new UI freezes are caused by the writes to the
track files, not the library database. Therefore I'm talking about putting
a "lock" on the track entries so the tracks can't be loaded while the
metadata is being synced, and then moving that syncing to a separate thread.

If the UI freezes we are talking about are totally unrelated to this PR,
then that's a separate bug that should be discussed in its own report. But
@skaldarnar https://github.com/skaldarnar seemed to say that something
in this PR specifically is causing more UI freezes, and that's what I'm
trying to figure out. If metadata syncing is being done in the UI thread,
I think that's a bad design choice and we should use techniques like I
mentioned to avoid it.

Bulk updates will happen while exiting the program and the whole cache
gets cleared at once.


You are receiving this because you authored the thread.
Reply to this email directly or view it on GitHub
#728 (comment)

@daschuer
Copy link
Copy Markdown
Member

That is on my list. (After all my other projects are merged)
I still like the used concept, but it requires some extra refactoring, before it will work as desired.

@skaldarnar
Copy link
Copy Markdown

Thanks for clarification on the UI freezes. Good to know it is a general issue and that you are aware of the problem.

@uklotzde Thank you for the hint to write additional information into the comment field. Is it possible to sort your library by the rating in the comment field somehow? What do you think about setting (kind of arbitrary) numbers for the rating if the user wants to (opt-in in the preferences) as mentioned on the wikipedia page?

@ywwg
Copy link
Copy Markdown
Member

ywwg commented Mar 21, 2016

ok, I'll give this PR a try and see if I notice any additional freezes while writing track metadata.

@LindyBalboa
Copy link
Copy Markdown
Contributor

What is the status of this?

@uklotzde
Copy link
Copy Markdown
Contributor Author

uklotzde commented Nov 7, 2016

I'm using this version to keep my files in sync with the library. Please
note, that I frequently rebase this branch on master!

On 07.11.2016 11:07, Conner Phillips wrote:

What is the status of this?


You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
#728 (comment), or
mute the thread
https://github.com/notifications/unsubscribe-auth/ABZ-akWOfc6enu3-h3kCAPkiLtGrJFBlks5q7vh7gaJpZM4GIcOu.

@LindyBalboa
Copy link
Copy Markdown
Contributor

I meant in regards to being merged. Any timeline prediction on that?

@uklotzde
Copy link
Copy Markdown
Contributor Author

uklotzde commented Dec 8, 2017

Oops. I accidentally pushed some changes while testing the loop escape PR. Fixed.

@Be-ing
Copy link
Copy Markdown
Contributor

Be-ing commented Dec 10, 2017

LGTM thank you! @daschuer, ready for merge?

@daschuer
Copy link
Copy Markdown
Member

Yes, we can merge. Juchhu! Thank you so much! Now I can consider to ditch Clementine for metadata.

@daschuer daschuer merged commit 43e4462 into mixxxdj:master Dec 10, 2017
@uklotzde
Copy link
Copy Markdown
Contributor Author

Thank you both so much for reviewing this beast! I'm curious to get some real-world user feedback. It's always sensitive to modify a user's own private data.

...now let's get the post-fader effects ready ;)

@daschuer
Copy link
Copy Markdown
Member

Yes!

@foss-
Copy link
Copy Markdown
Contributor

foss- commented Dec 11, 2017

This is awesome. Thanks so much for your work on this Uwe! I am really happy to see this in mixxx

The next thing missing regarding metadata in / out and improving mixxx + other app compatibility and what would be highly helpful to me personally is star ratings, which has a PR but it doesn't look as if active development is happening: #1089

@cgrinham
Copy link
Copy Markdown

Very exciting! Definitely going to test this asap (dw, I have backups! haha)

@uklotzde
Copy link
Copy Markdown
Contributor Author

Vorbis -> MusicBrainz style comments: If anyone needs help with converting DESCRIPTION into COMMENT fields in FLAC files safely, just ask me. I'm preparing a shell script using metaflac to analyze and cleanup my collection.

I don't have any OggVorbis files, but the proceedings should be similar.

@MK-42
Copy link
Copy Markdown
Contributor

MK-42 commented Dec 18, 2017

Awesome work @uklotzde, @daschuer and and @Be-ing we finally have it in master 👍
One thing I noticed while playing with it:
when inline-editing a track in the TrackTable, the export is triggered only when the focus switches to another track in the table. Is that expected behaviour? It's nothing serious but caught my attention.

By the way: It's really nice to see that mixxx gains some pace in development - looking forward for a new beta release to update some friends 👍 I'm already using current master for noncritical daily work

@uklotzde
Copy link
Copy Markdown
Contributor Author

@MK-42 It would be overkill to save tags (including a backup file copy) after every field edit, impossible. Tags are only saved if the corresponding cached track object is destroyed, i.e. when it is evicted from the in-memory cache. You may have noticed the message box that popped up when enabling this feature 😉

Exporting tags is a very costly file operation that might introduce some latency within the main tread due to lock contention on the cache. We already have a follow-up PR trying to minimize this impact. There is also a serious issue with the initialization order on startup that needs to be fixed.

@MK-42
Copy link
Copy Markdown
Contributor

MK-42 commented Dec 19, 2017

It would be overkill to save tags (including a backup file copy) after every field edit, impossible. Tags are only saved if the corresponding cached track object is destroyed

I followed your discussion here and were aware of that fact. But I was unsure if there is some cached track object for that track if it is not loaded to any deck/sampler and expected an immediate write operation in that case. That changing the focus in the table triggers the export was unexpected for me and I was unsure if that could be a bug. If thats expected behavior, everything is alright 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.