medialibrary issueshttps://code.videolan.org/videolan/medialibrary/-/issues2020-03-23T09:18:07Zhttps://code.videolan.org/videolan/medialibrary/-/issues/230Add Beats Per Minute (BPM) field for music tracks2020-03-23T09:18:07ZFelix Paul Kühnefkuehne@videolan.orgAdd Beats Per Minute (BPM) field for music tracksIt would be nice to have a BPM field for music tracks, so ideally you could enter values manually and sort by the number of beats or even create automatic playlists composed of music with BPM in a certain range.It would be nice to have a BPM field for music tracks, so ideally you could enter values manually and sort by the number of beats or even create automatic playlists composed of music with BPM in a certain range.https://code.videolan.org/videolan/medialibrary/-/issues/216Always use IDeviceLister to list FS devices2020-03-17T12:29:42ZHugo Beauzée-LuyssenAlways use IDeviceLister to list FS devicesIn order to merge all FS implementation into the (lib)vlc one, we first need to reduce the differences between various `IFileSystemFactory` implementations.
The local filesystem implementation delegates listing the devices to an IDeviceL...In order to merge all FS implementation into the (lib)vlc one, we first need to reduce the differences between various `IFileSystemFactory` implementations.
The local filesystem implementation delegates listing the devices to an IDeviceLister implementation while the network one handles device listing itself.
If we were to use the network implementation (ie. the libvlc based one) to handle local filesystem, we'd lose our ability to list devices with their removable states.
We still need to allow the application to provide a custom `IDeviceLister`, since there's no way for us to do this properly on some platforms (notably Android), and we need to delegate this job to the app itself.
The current plan is to:
* [x] Move network devices listing to an IDeviceLister implementation
* [x] Add a `scheme` member function to `IDeviceLister` to be able to have different implementations for different FS factories, as opposed to one device lister for all for now.
* [x] Add a `deviceLister( std::string scheme )` or similar to `IMediaLibrary`, in order to allow the `IFileSystemFactory` to query a device lister for a specific scheme (which allows us to return our existing local device lister implementation to a libvlccore based `IFileSystemFactory`)
* [ ] ~~Remove `IFileSystemFactoryCb` which is essentially the same as `IDeviceListerCb`~~0.7.xHugo Beauzée-LuyssenHugo Beauzée-Luyssenhttps://code.videolan.org/videolan/medialibrary/-/issues/228MediaGroups: Regroup all2020-03-13T11:43:05ZSoomin LeeMediaGroups: Regroup allCurrently the regroup can be achieved by media, but it would be interesting to have a "regroup all" from IMediaLibrary for example.Currently the regroup can be achieved by media, but it would be interesting to have a "regroup all" from IMediaLibrary for example.0.7.xHugo Beauzée-LuyssenHugo Beauzée-Luyssenhttps://code.videolan.org/videolan/medialibrary/-/issues/229src/Media.cpp:94 assert failed after updating to latest medialibrary and vlc2020-03-11T18:46:00ZChristopher Degawasrc/Media.cpp:94 assert failed after updating to latest medialibrary and vlc![image](/uploads/59cfba7ce9f8650d107b2c4053bdd811/image.png)
```c++
Media::Media( MediaLibraryPtr ml, sqlite::Row& row )
: m_ml( ml )
// DB field extraction:
, m_id( row.load<decltype(m_id)>( 0 ) )
, m_type( row.load<dec...![image](/uploads/59cfba7ce9f8650d107b2c4053bdd811/image.png)
```c++
Media::Media( MediaLibraryPtr ml, sqlite::Row& row )
: m_ml( ml )
// DB field extraction:
, m_id( row.load<decltype(m_id)>( 0 ) )
, m_type( row.load<decltype(m_type)>( 1 ) )
, m_subType( row.load<decltype(m_subType)>( 2 ) )
, m_duration( row.load<decltype(m_duration)>( 3 ) )
, m_playCount( row.load<decltype(m_playCount)>( 4 ) )
, m_lastPlayedDate( row.load<decltype(m_lastPlayedDate)>( 5 ) )
// skip real_last_played_date as we don't need it in memory
, m_insertionDate( row.load<decltype(m_insertionDate)>( 7 ) )
, m_releaseDate( row.load<decltype(m_releaseDate)>( 8 ) )
, m_title( row.load<decltype(m_title)>( 9 ) )
, m_filename( row.load<decltype(m_filename)>( 10 ) )
, m_isFavorite( row.load<decltype(m_isFavorite)>( 11 ) )
// Skip is_present
, m_deviceId( row.load<decltype(m_deviceId)>( 13 ) )
, m_nbPlaylists( row.load<unsigned int>( 14 ) )
, m_folderId( row.load<decltype(m_folderId)>( 15 ) )
, m_importType( row.load<decltype(m_importType)>( 16 ) )
, m_groupId( row.load<decltype(m_groupId)>( 17 ) )
, m_forcedTitle( row.load<decltype(m_forcedTitle)>( 18 ) )
// End of DB fields extraction
, m_metadata( m_ml, IMetadata::EntityType::Media )
, m_changed( false )
{
assert( row.nbColumns() == 19 );
}
```
Nothing is particularly printed when running vlc through gdb
This occurred with and without the patches in #225https://code.videolan.org/videolan/medialibrary/-/issues/222MediaGroup: Additional sorting criteria2020-03-10T14:14:30ZSoomin LeeMediaGroup: Additional sorting criteriaI believe it could be interesting to have additional sorting criteria for mediaGroups.
Currently, it seems the medialibrary supports the following for the mediaGroups:
- Alpha (default)
- NbVideo
- NbAudio
- NbMedia
Indeed, since the...I believe it could be interesting to have additional sorting criteria for mediaGroups.
Currently, it seems the medialibrary supports the following for the mediaGroups:
- Alpha (default)
- NbVideo
- NbAudio
- NbMedia
Indeed, since the mediaGroup will be the main object used by the ports for videos it could be interesting to be able to sort by:
- Duration (maybe?)
- InsertionDate
- LastModificationDate (maybe?)0.7.xHugo Beauzée-LuyssenHugo Beauzée-Luyssenhttps://code.videolan.org/videolan/medialibrary/-/issues/223IMedia: removeFromGroup success behaviour2020-03-05T16:08:18ZSoomin LeeIMedia: removeFromGroup success behaviourCurrently, after a successful removal of media from a group, there isn't a group that is automatically created for each medium.
Is this a behaviour we want on the medialibrary side or should this behaviour be integrated on the app side?Currently, after a successful removal of media from a group, there isn't a group that is automatically created for each medium.
Is this a behaviour we want on the medialibrary side or should this behaviour be integrated on the app side?https://code.videolan.org/videolan/medialibrary/-/issues/224IMediaLibrary: createMediaGroup with name should set hasBeenRenamed flag2020-03-05T11:02:26ZSoomin LeeIMediaLibrary: createMediaGroup with name should set hasBeenRenamed flagFrom a UX point I believe that when creating a mediagroup with a specific name, the created group should have the `hasBeenRenamed` flag to `true`.From a UX point I believe that when creating a mediagroup with a specific name, the created group should have the `hasBeenRenamed` flag to `true`.0.7.xHugo Beauzée-LuyssenHugo Beauzée-Luyssenhttps://code.videolan.org/videolan/medialibrary/-/issues/221Publicly expose folders media count2020-02-27T12:01:53ZHugo Beauzée-LuyssenPublicly expose folders media countThe only way to get the number of media in a folder for now is to run a `COUNT(*)` query, while the value is already available in database.
We just need to expose those valuesThe only way to get the number of media in a folder for now is to run a `COUNT(*)` query, while the value is already available in database.
We just need to expose those values0.7.xHugo Beauzée-LuyssenHugo Beauzée-Luyssenhttps://code.videolan.org/videolan/medialibrary/-/issues/218Grouping API request2020-02-27T08:09:56ZJean-Baptiste KempfGrouping API requestWe need the following API:
* [x] Add an helper function to get the common prefix between two media
* [x] Create a group from a list of media
* [x] Add a `Media::groupSimilar` member function, that will group all media with similar nam...We need the following API:
* [x] Add an helper function to get the common prefix between two media
* [x] Create a group from a list of media
* [x] Add a `Media::groupSimilar` member function, that will group all media with similar names. It will only affect ungrouped media, regardless of the `has_been_grouped` flag
* [x] Add a flag to reflect if the group has been renamed (since the UI will need to list them as group instead of as media)
* [x] Ensure a group that was renamed doesn't get automatically renamed when adjusting the name length based on the common prefix
* [x] Remove the unique constraint on group names
* [x] Prevent user to specify an empty name when renaming
* [x] Remove group getter by name, since there can now be 2 groups with the same nameHugo Beauzée-LuyssenHugo Beauzée-Luyssenhttps://code.videolan.org/videolan/medialibrary/-/issues/209MediaGroup: Title sanitization common length2020-02-27T08:09:55ZSoomin LeeMediaGroup: Title sanitization common lengthWith the current integration of MediaGroup, it seems that the title isn't grouped by the most common pattern as it used to be for VideoGroups.
For example:
```
- a_cool_filename_01.mp4
- a_cool_filename_02.mp4
- a_cool_filename_03.mp4
...With the current integration of MediaGroup, it seems that the title isn't grouped by the most common pattern as it used to be for VideoGroups.
For example:
```
- a_cool_filename_01.mp4
- a_cool_filename_02.mp4
- a_cool_filename_03.mp4
```
The above files will be grouped into a MediaGroup named: `a_cool` and not `a_cool_filename_0` as it used to be.Hugo Beauzée-LuyssenHugo Beauzée-Luyssenhttps://code.videolan.org/videolan/medialibrary/-/issues/220Compiling VLC and libmedialibrary using git masters2020-02-17T08:31:14ZChristopher DegawaCompiling VLC and libmedialibrary using git mastersHello, currently when trying to compile medialibrary first using `--without-libvlc` and then trying to compile vlc, both from the master branches, I get to this error
```none
../../modules/misc/medialibrary/medialibrary.h:171:18: error: ...Hello, currently when trying to compile medialibrary first using `--without-libvlc` and then trying to compile vlc, both from the master branches, I get to this error
```none
../../modules/misc/medialibrary/medialibrary.h:171:18: error: 'virtual void MediaLibrary::onMediaModified(std::vector<long long int>)' marked 'override', but does not override
171 | virtual void onMediaModified(std::vector<int64_t> media) override;
| ^~~~~~~~~~~~~~~
../../modules/misc/medialibrary/medialibrary.h:172:18: error: 'virtual void MediaLibrary::onMediaDeleted(std::vector<long long int>)' marked 'override', but does not override
172 | virtual void onMediaDeleted(std::vector<int64_t> mediaIds) override;
| ^~~~~~~~~~~~~~
../../modules/misc/medialibrary/medialibrary.h:174:18: error: 'virtual void MediaLibrary::onArtistsModified(std::vector<long long int>)' marked 'override', but does not override
174 | virtual void onArtistsModified(std::vector<int64_t> artists) override;
| ^~~~~~~~~~~~~~~~~
../../modules/misc/medialibrary/medialibrary.h:175:18: error: 'virtual void MediaLibrary::onArtistsDeleted(std::vector<long long int>)' marked 'override', but does not override
175 | virtual void onArtistsDeleted(std::vector<int64_t> artistsIds) override;
| ^~~~~~~~~~~~~~~~
../../modules/misc/medialibrary/medialibrary.h:177:18: error: 'virtual void MediaLibrary::onAlbumsModified(std::vector<long long int>)' marked 'override', but does not override
177 | virtual void onAlbumsModified(std::vector<int64_t> albums) override;
| ^~~~~~~~~~~~~~~~
../../modules/misc/medialibrary/medialibrary.h:178:18: error: 'virtual void MediaLibrary::onAlbumsDeleted(std::vector<long long int>)' marked 'override', but does not override
178 | virtual void onAlbumsDeleted(std::vector<int64_t> albumsIds) override;
| ^~~~~~~~~~~~~~~
../../modules/misc/medialibrary/medialibrary.h:180:18: error: 'virtual void MediaLibrary::onPlaylistsModified(std::vector<long long int>)' marked 'override', but does not override
180 | virtual void onPlaylistsModified(std::vector<int64_t> playlists) override;
| ^~~~~~~~~~~~~~~~~~~
../../modules/misc/medialibrary/medialibrary.h:181:18: error: 'virtual void MediaLibrary::onPlaylistsDeleted(std::vector<long long int>)' marked 'override', but does not override
181 | virtual void onPlaylistsDeleted(std::vector<int64_t> playlistIds) override;
| ^~~~~~~~~~~~~~~~~~
../../modules/misc/medialibrary/medialibrary.h:183:18: error: 'virtual void MediaLibrary::onGenresModified(std::vector<long long int>)' marked 'override', but does not override
183 | virtual void onGenresModified(std::vector<int64_t> genres) override;
| ^~~~~~~~~~~~~~~~
../../modules/misc/medialibrary/medialibrary.h:184:18: error: 'virtual void MediaLibrary::onGenresDeleted(std::vector<long long int>)' marked 'override', but does not override
184 | virtual void onGenresDeleted(std::vector<int64_t> genreIds) override;
| ^~~~~~~~~~~~~~~
../../modules/misc/medialibrary/medialibrary.h:185:18: error: 'virtual void MediaLibrary::onMediaGroupAdded(std::vector<std::shared_ptr<medialibrary::IMediaGroup> >)' marked 'override', but does not override
185 | virtual void onMediaGroupAdded( std::vector<medialibrary::MediaGroupPtr> mediaGroups ) override;
| ^~~~~~~~~~~~~~~~~
../../modules/misc/medialibrary/medialibrary.h:186:18: error: 'virtual void MediaLibrary::onMediaGroupModified(std::vector<long long int>)' marked 'override', but does not override
186 | virtual void onMediaGroupModified( std::vector<int64_t> mediaGroupsIds ) override;
| ^~~~~~~~~~~~~~~~~~~~
../../modules/misc/medialibrary/medialibrary.h:187:18: error: 'virtual void MediaLibrary::onMediaGroupDeleted(std::vector<long long int>)' marked 'override', but does not override
187 | virtual void onMediaGroupDeleted( std::vector<int64_t> mediaGroupsIds ) override;
| ^~~~~~~~~~~~~~~~~~~
../../modules/misc/medialibrary/medialib.cpp: In function 'int Open(vlc_object_t*)':
../../modules/misc/medialibrary/medialib.cpp:1620:46: error: invalid new-expression of abstract class type 'MediaLibrary'
1620 | p_ml->p_sys = new MediaLibrary( p_ml );
| ^
In file included from ../../modules/misc/medialibrary/medialib.cpp:30:
../../modules/misc/medialibrary/medialibrary.h:134:7: note: because the following virtual functions are pure within 'MediaLibrary':
134 | class MediaLibrary : public medialibrary::IMediaLibraryCb
| ^~~~~~~~~~~~
In file included from ../../modules/misc/medialibrary/medialibrary.h:24,
from ../../modules/misc/medialibrary/medialib.cpp:30:
D:/media-autobuild_suite/local64/include/medialibrary/IMediaLibrary.h:180:18: note: 'virtual void medialibrary::IMediaLibraryCb::onMediaModified(std::set<long long int>)'
180 | virtual void onMediaModified( std::set<int64_t> mediaIds ) = 0;
| ^~~~~~~~~~~~~~~
D:/media-autobuild_suite/local64/include/medialibrary/IMediaLibrary.h:182:18: note: 'virtual void medialibrary::IMediaLibraryCb::onMediaDeleted(std::set<long long int>)'
182 | virtual void onMediaDeleted( std::set<int64_t> mediaIds ) = 0;
| ^~~~~~~~~~~~~~
D:/media-autobuild_suite/local64/include/medialibrary/IMediaLibrary.h:185:18: note: 'virtual void medialibrary::IMediaLibraryCb::onArtistsModified(std::set<long long int>)'
185 | virtual void onArtistsModified( std::set<int64_t> artistsIds ) = 0;
| ^~~~~~~~~~~~~~~~~
D:/media-autobuild_suite/local64/include/medialibrary/IMediaLibrary.h:186:18: note: 'virtual void medialibrary::IMediaLibraryCb::onArtistsDeleted(std::set<long long int>)'
186 | virtual void onArtistsDeleted( std::set<int64_t> artistsIds ) = 0;
| ^~~~~~~~~~~~~~~~
D:/media-autobuild_suite/local64/include/medialibrary/IMediaLibrary.h:189:18: note: 'virtual void medialibrary::IMediaLibraryCb::onAlbumsModified(std::set<long long int>)'
189 | virtual void onAlbumsModified( std::set<int64_t> albumsIds ) = 0;
| ^~~~~~~~~~~~~~~~
D:/media-autobuild_suite/local64/include/medialibrary/IMediaLibrary.h:190:18: note: 'virtual void medialibrary::IMediaLibraryCb::onAlbumsDeleted(std::set<long long int>)'
190 | virtual void onAlbumsDeleted( std::set<int64_t> albumsIds ) = 0;
| ^~~~~~~~~~~~~~~
D:/media-autobuild_suite/local64/include/medialibrary/IMediaLibrary.h:193:18: note: 'virtual void medialibrary::IMediaLibraryCb::onPlaylistsModified(std::set<long long int>)'
193 | virtual void onPlaylistsModified( std::set<int64_t> playlistsIds ) = 0;
| ^~~~~~~~~~~~~~~~~~~
D:/media-autobuild_suite/local64/include/medialibrary/IMediaLibrary.h:194:18: note: 'virtual void medialibrary::IMediaLibraryCb::onPlaylistsDeleted(std::set<long long int>)'
194 | virtual void onPlaylistsDeleted( std::set<int64_t> playlistIds ) = 0;
| ^~~~~~~~~~~~~~~~~~
D:/media-autobuild_suite/local64/include/medialibrary/IMediaLibrary.h:197:18: note: 'virtual void medialibrary::IMediaLibraryCb::onGenresModified(std::set<long long int>)'
197 | virtual void onGenresModified( std::set<int64_t> genresIds ) = 0;
| ^~~~~~~~~~~~~~~~
D:/media-autobuild_suite/local64/include/medialibrary/IMediaLibrary.h:198:18: note: 'virtual void medialibrary::IMediaLibraryCb::onGenresDeleted(std::set<long long int>)'
198 | virtual void onGenresDeleted( std::set<int64_t> genreIds ) = 0;
| ^~~~~~~~~~~~~~~
D:/media-autobuild_suite/local64/include/medialibrary/IMediaLibrary.h:203:18: note: 'virtual void medialibrary::IMediaLibraryCb::onMediaGroupsAdded(std::vector<std::shared_ptr<medialibrary::IMediaGroup> >)'
203 | virtual void onMediaGroupsAdded( std::vector<MediaGroupPtr> mediaGroups ) = 0;
| ^~~~~~~~~~~~~~~~~~
D:/media-autobuild_suite/local64/include/medialibrary/IMediaLibrary.h:204:18: note: 'virtual void medialibrary::IMediaLibraryCb::onMediaGroupsModified(std::set<long long int>)'
204 | virtual void onMediaGroupsModified( std::set<int64_t> mediaGroupsIds ) = 0;
| ^~~~~~~~~~~~~~~~~~~~~
D:/media-autobuild_suite/local64/include/medialibrary/IMediaLibrary.h:205:18: note: 'virtual void medialibrary::IMediaLibraryCb::onMediaGroupsDeleted(std::set<long long int>)'
205 | virtual void onMediaGroupsDeleted( std::set<int64_t> mediaGroupsIds ) = 0;
| ^~~~~~~~~~~~~~~~~~~~
```
I believe this is caused by https://code.videolan.org/videolan/medialibrary/merge_requests/234 using `std::set` in `IMediaLibrary.h` and vlc still using `std::vector` in `modules/misc/medialibrary/medialibrary.h`https://code.videolan.org/videolan/medialibrary/-/issues/213MediaGroup: API to remove media group2020-01-31T12:47:53ZSoomin LeeMediaGroup: API to remove media groupWhile there are methods in order to remove a medium from a media group, it would be interesting to have a call to remove an entire media group by ID or by instance.While there are methods in order to remove a medium from a media group, it would be interesting to have a call to remove an entire media group by ID or by instance.Hugo Beauzée-LuyssenHugo Beauzée-Luyssenhttps://code.videolan.org/videolan/medialibrary/-/issues/215File: Refactor fetch from MRL2020-01-30T16:23:50ZHugo Beauzée-LuyssenFile: Refactor fetch from MRLWe currently have 2 fetch functions:
- fromMrl which only supports discovered files
- fromExternalMrl which only supports absolute MRLs of external media
We start to duplicate the "if external mrl doesn't match anything, fallback to 'in...We currently have 2 fetch functions:
- fromMrl which only supports discovered files
- fromExternalMrl which only supports absolute MRLs of external media
We start to duplicate the "if external mrl doesn't match anything, fallback to 'internal' MRL" logic in at least 3 locations, it's probably worth having a common fetcher, but we might avoid useless requests if we keep the other 2.Hugo Beauzée-LuyssenHugo Beauzée-Luyssenhttps://code.videolan.org/videolan/medialibrary/-/issues/180Notifier: Handling multiple modified notification with the same id2020-01-27T12:40:09ZSoomin LeeNotifier: Handling multiple modified notification with the same idIt would be interesting to have a small optimization of callbacks depending on the id of the entity.
For example for metadata, a batch of them would probably set after a playback.It would be interesting to have a small optimization of callbacks depending on the id of the entity.
For example for metadata, a batch of them would probably set after a playback.https://code.videolan.org/videolan/medialibrary/-/issues/74Ignore album cover for video files2020-01-23T16:51:34ZHugo Beauzée-LuyssenIgnore album cover for video filesAfter a quick look of an issue on iOS, it appears that if a video is stored in a folder with a cover.jpg file (or any other file that matches our cover files patterns), this cover file will be used for the video as well, which is incorre...After a quick look of an issue on iOS, it appears that if a video is stored in a folder with a cover.jpg file (or any other file that matches our cover files patterns), this cover file will be used for the video as well, which is incorrect.
I'm not sure how to address this... we must still accept embedded cover, but probably should reject "album" covers. Maybe the correct fix lies in VLC, and we shouldn't try to fetch a cover when there is a video track?https://code.videolan.org/videolan/medialibrary/-/issues/9Handle secondary media2020-01-23T16:49:05ZGeoffrey Métaisgeoffrey@videolan.orgHandle secondary mediahttps://code.videolan.org/videolan/medialibrary/-/issues/108Automatically clear external media that were added from a playlist2020-01-23T16:37:05ZHugo Beauzée-LuyssenAutomatically clear external media that were added from a playlistCurrently if we ingest a playlist containing an external media, then update the playlist to remove that media, we will have a stalled media & file in the database.
We can't remove it directly when refreshing the playlist though, otherwi...Currently if we ingest a playlist containing an external media, then update the playlist to remove that media, we will have a stalled media & file in the database.
We can't remove it directly when refreshing the playlist though, otherwise we would lose the associated meta, which we want to keep if the media is still part of the playlist.
Maybe keeping them until they are considered outdated is enough, but this needs to be reviewed/verified.Hugo Beauzée-LuyssenHugo Beauzée-Luyssenhttps://code.videolan.org/videolan/medialibrary/-/issues/208MediaGroup: setVideoGroupsAllowSingleVideo2020-01-23T15:48:12ZSoomin LeeMediaGroup: setVideoGroupsAllowSingleVideoWith the `VideoGroup` there was a method in order to filter single media groups which isn't present any more with `MediaGroup`
Indeed, since on VLC-iOS, we do not have a need for a single media automatic group it would be interesting to...With the `VideoGroup` there was a method in order to filter single media groups which isn't present any more with `MediaGroup`
Indeed, since on VLC-iOS, we do not have a need for a single media automatic group it would be interesting to have a replacement for `setVideoGroupsAllowSingleVideo`.https://code.videolan.org/videolan/medialibrary/-/issues/212Expose supported extensions2020-01-23T08:00:00ZSoomin LeeExpose supported extensionsIt would be interesting to have a way of retrieving all the supported by the medialibrary that is media, playlist file extensions.
For example this can help to reduce inconsistency between supported files between updates or in between p...It would be interesting to have a way of retrieving all the supported by the medialibrary that is media, playlist file extensions.
For example this can help to reduce inconsistency between supported files between updates or in between platforms.0.7.xHugo Beauzée-LuyssenHugo Beauzée-Luyssenhttps://code.videolan.org/videolan/medialibrary/-/issues/203Folders with "..." in their names are ignored2020-01-22T14:05:37ZFelix Paul Kühnefkuehne@videolan.orgFolders with "..." in their names are ignoredAs folders starting with a single . are systematically ignored since they are considered to contain private data, folders starting with three dots are ignored as well.
This is misleading to the user as they are displayed by Android's fil...As folders starting with a single . are systematically ignored since they are considered to contain private data, folders starting with three dots are ignored as well.
This is misleading to the user as they are displayed by Android's file manager but disappear in VLC.
A legitimate reason to beginn a folder name with three dots is storing music by the following US artist "...And You Will Know Us by the Trail of Dead".0.7.xHugo Beauzée-LuyssenHugo Beauzée-Luyssen