Aurora.Music icon indicating copy to clipboard operation
Aurora.Music copied to clipboard

支持 OneDrive Files On-Demand

Open OpportunityLiu opened this issue 6 years ago • 10 comments

I'm submitting a...

  • Feature request

Current behavior

只有已经位于本地的文件能够被索引。

Expected behavior

对存放于 OneDrive 上的文件建立索引,进行播放时按需获取文件。

Minimal reproduction of the problem with instructions

Environment

App Version(s): 

Windows 10 Build Number:
- [ ] Fall Creators Update (16299)
- [ ] Spring Creators Update (17133)
- [ ] Insider Build (build number: )

Device form factor:
- [ ] Desktop
- [ ] Mobile
- [ ] Xbox
- [ ] Surface Hub
- [ ] IoT

OpportunityLiu avatar Apr 19 '18 17:04 OpportunityLiu

参考 https://docs.microsoft.com/en-us/windows/uwpcommunitytoolkit/services/onedrive

OpportunityLiu avatar Apr 20 '18 02:04 OpportunityLiu

using Microsoft.Toolkit.Services.OneDrive;
OneDriveService.ServicePlatformInitializer = new Microsoft.Toolkit.Uwp.Services.OneDrive.Platform.OneDriveServicePlatformInitializer();
OneDriveService.Instance.Initialize("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", new[] { Microsoft.Toolkit.Services.Services.MicrosoftGraph.MicrosoftGraphScope.FilesReadAll });
await OneDriveService.Instance.LoginAsync();
var rf = await OneDriveService.Instance.RootFolderAsync();
var mf = await rf.GetFolderAsync("Music");

var files = await getFile(mf);
var musicPropertis = files.Select(f => f.OneDriveItem.Audio);

async Task<List<OneDriveStorageFile>> getFile(OneDriveStorageFolder folder)
{
    var items = await folder.GetItemsAsync(1000);
    var list = new List<OneDriveStorageFile>(items.Count);
    var getFolder = new List<Task<List<OneDriveStorageFile>>>();
    foreach (var item in items)
    {
        if (item.IsFile())
            list.Add((OneDriveStorageFile)item);
        else if (item.IsFolder())
            getFolder.Add(getFile((OneDriveStorageFolder)item));
        else
            continue;// IsOneNote
    }
    foreach (var item in getFolder)
    {
        list.AddRange(await item);
    }
    return list;
}

OpportunityLiu avatar Apr 20 '18 02:04 OpportunityLiu

试了一下,这样获取了我 OneDrive 里 500 多首歌花了 7.5 s

OpportunityLiu avatar Apr 20 '18 03:04 OpportunityLiu

其实系统里面有一个 wrapper 来着,就是 OneDrive 如果有音乐文件夹的话会包含到音乐库中,去遍历音乐库的时候就能找到这些 StorageFile, 这些文件如果只检索属性就不会下载下来,打开文件就会自动下载,当然程序里面都一视同仁是 StorageFile.

无标题.png 无标题1.png

所以我想只要包含了这个云端库就可以了,使用 Onedrive Service 反而会过度设计。像 Groove 就是这么做的。

xiaosu-zhu avatar Apr 20 '18 06:04 xiaosu-zhu

并不能获取到属性。。。 image 我的音乐库就包含了Onedrive

OpportunityLiu avatar Apr 20 '18 07:04 OpportunityLiu

啊我搞错了搞错了,只能遍历到有这个文件,其他的什么都获取不到,那我就加上 Onedrive Service 吧

xiaosu-zhu avatar Apr 20 '18 07:04 xiaosu-zhu

Groove 就是用的 Mircosoft Graph Api 不仅如此,他播放OneDrive文件以后还是缓存在自己的文件夹底下的

OpportunityLiu avatar Apr 20 '18 07:04 OpportunityLiu

我正在写

OpportunityLiu avatar Apr 20 '18 07:04 OpportunityLiu

Thanks for implementing this. I enabled it, signed in to OneDrive and then nothing else happened. What am I supposed to see or how does this feature work? I'd love to stream from OneDrive, just like Groove.

domcote avatar Jun 11 '18 11:06 domcote

@domcote Folders should be included in the system library or in the app library, just the same as local files.

This feature only requests metadata from OneDrive api when a file that is marked as a OneDrive file placeholder, is found. No changes to file search logic.

OpportunityLiu avatar Sep 14 '18 04:09 OpportunityLiu