Skip to content

Commit

Permalink
Adds basic archive support.
Browse files Browse the repository at this point in the history
 Reading archives uses 7zip code.

 The project can be found here: https://github.com/aidan-g/BASS_ZIPSTREAM
  • Loading branch information
pudding committed Jan 28, 2024
1 parent c8d89a2 commit cf0f1ca
Show file tree
Hide file tree
Showing 21 changed files with 1,056 additions and 3 deletions.
16 changes: 16 additions & 0 deletions FoxTunes.Core/Interfaces/MetaData/IFileAbstraction.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System;
using System.IO;

namespace FoxTunes.Interfaces
{
public interface IFileAbstraction : IDisposable
{
string FileName { get; }

Stream ReadStream { get; }

Stream WriteStream { get; }

void CloseStream(Stream stream);
}
}
2 changes: 2 additions & 0 deletions FoxTunes.Core/Interfaces/MetaData/IMetaDataSource.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ public interface IMetaDataSource : IBaseComponent

Task<IEnumerable<MetaDataItem>> GetMetaData(string fileName);

Task<IEnumerable<MetaDataItem>> GetMetaData(IFileAbstraction fileAbstraction);

Task SetMetaData(string fileName, IEnumerable<MetaDataItem> metaDataItems, Func<MetaDataItem, bool> predicate);
}

Expand Down
5 changes: 5 additions & 0 deletions FoxTunes.MetaData.FileName/FileNameMetaDataSource.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,11 @@ public async Task<IEnumerable<MetaDataItem>> GetMetaData(string fileName)
return result;
}

public Task<IEnumerable<MetaDataItem>> GetMetaData(IFileAbstraction fileAbstraction)
{
throw new NotImplementedException();
}

protected virtual MetaDataItem GetMetaData(string name, string value)
{
return new MetaDataItem(name, MetaDataItemType.Tag)
Expand Down
5 changes: 5 additions & 0 deletions FoxTunes.MetaData.TagLib/Mpeg4/File.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ public Task<IEnumerable<MetaDataItem>> GetMetaData(string fileName)
#endif
}

public Task<IEnumerable<MetaDataItem>> GetMetaData(global::FoxTunes.Interfaces.IFileAbstraction fileAbstraction)
{
throw new NotImplementedException();
}

public Task SetMetaData(string fileName, IEnumerable<MetaDataItem> metaDataItems, Func<MetaDataItem, bool> predicate)
{
var box = this.GetXtraBox();
Expand Down
53 changes: 53 additions & 0 deletions FoxTunes.MetaData.TagLib/TagLibFileAbstraction.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
using FoxTunes.Interfaces;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace FoxTunes
{
public class TagLibFileAbstraction : global::TagLib.File.IFileAbstraction
{
public TagLibFileAbstraction(IFileAbstraction fileAbstraction)
{
this.FileAbstraction = fileAbstraction;
}

public IFileAbstraction FileAbstraction { get; private set; }

public string Name
{
get
{
return this.FileAbstraction.FileName;
}
}

public Stream ReadStream
{
get
{
return this.FileAbstraction.ReadStream;
}
}

public Stream WriteStream
{
get
{
return this.FileAbstraction.WriteStream;
}
}

public void CloseStream(Stream stream)
{
this.FileAbstraction.CloseStream(stream);
}

public static TagLibFileAbstraction Create(IFileAbstraction fileAbstraction)
{
return new TagLibFileAbstraction(fileAbstraction);
}
}
}
5 changes: 5 additions & 0 deletions FoxTunes.MetaData.TagLib/TagLibFileFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ public File Create(string fileName)
return file;
}

public File Create(IFileAbstraction fileAbstraction)
{
return File.Create(TagLibFileAbstraction.Create(fileAbstraction));
}

public IEnumerable<ConfigurationSection> GetConfigurationSections()
{
return TagLibFileFactoryConfiguration.GetConfigurationSections();
Expand Down
14 changes: 12 additions & 2 deletions FoxTunes.MetaData.TagLib/TagLibMetaDataSource.cs
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,17 @@ public override void InitializeComponent(ICore core)
base.InitializeComponent(core);
}

public async Task<IEnumerable<MetaDataItem>> GetMetaData(string fileName)
public Task<IEnumerable<MetaDataItem>> GetMetaData(string fileName)
{
return this.GetMetaData(fileName, () => this.FileFactory.Create(fileName));
}

public Task<IEnumerable<MetaDataItem>> GetMetaData(IFileAbstraction fileAbstraction)
{
return this.GetMetaData(fileAbstraction.FileName, () => this.FileFactory.Create(fileAbstraction));
}

public async Task<IEnumerable<MetaDataItem>> GetMetaData(string fileName, Func<File> factory)
{
if (!this.IsSupported(fileName))
{
Expand All @@ -139,7 +149,7 @@ public async Task<IEnumerable<MetaDataItem>> GetMetaData(string fileName)
Logger.Write(this, LogLevel.Trace, "Reading meta data for file: {0}", fileName);
try
{
using (var file = this.FileFactory.Create(fileName))
using (var file = factory())
{
if (file.PossiblyCorrupt)
{
Expand Down
68 changes: 68 additions & 0 deletions FoxTunes.Output.Bass.Archive/BassArchiveStreamProvider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
using FoxTunes.Interfaces;
using ManagedBass;
using ManagedBass.ZipStream;
using System.Collections.Generic;

namespace FoxTunes
{
public class BassArchiveStreamProvider : BassStreamProvider
{
public BassArchiveStreamProviderBehaviour Behaviour { get; private set; }

public override void InitializeComponent(ICore core)
{
this.Behaviour = ComponentRegistry.Instance.GetComponent<BassArchiveStreamProviderBehaviour>();
base.InitializeComponent(core);
}

public override bool CanCreateStream(PlaylistItem playlistItem)
{
//The behaviour is not loaded for utilities so we can't check whether it's enabled.
//if (this.Behaviour == null || !this.Behaviour.Enabled)
//{
// return false;
//}
var fileName = default(string);
var entryName = default(string);
return ArchiveUtils.ParseUrl(playlistItem.FileName, out fileName, out entryName);
}

public override IBassStream CreateBasicStream(PlaylistItem playlistItem, IEnumerable<IBassStreamAdvice> advice, BassFlags flags)
{
var fileName = default(string);
var entryName = default(string);
if (!ArchiveUtils.ParseUrl(playlistItem.FileName, out fileName, out entryName))
{
//This shouldn't happen as CanCreateStream would have returned false.
return BassStream.Empty;
}
var index = default(int);
if (!ArchiveUtils.GetEntryIndex(fileName, entryName, out index))
{
//The associated entry was not found.
return BassStream.Empty;
}
var channelHandle = BassZipStream.CreateStream(fileName, index, Flags: flags);
return this.CreateBasicStream(channelHandle, advice, flags);
}

public override IBassStream CreateInteractiveStream(PlaylistItem playlistItem, IEnumerable<IBassStreamAdvice> advice, BassFlags flags)
{
var fileName = default(string);
var entryName = default(string);
if (!ArchiveUtils.ParseUrl(playlistItem.FileName, out fileName, out entryName))
{
//This shouldn't happen as CanCreateStream would have returned false.
return BassStream.Empty;
}
var index = default(int);
if (!ArchiveUtils.GetEntryIndex(fileName, entryName, out index))
{
//The associated entry was not found.
return BassStream.Empty;
}
var channelHandle = BassZipStream.CreateStream(fileName, index, Flags: flags);
return this.CreateInteractiveStream(channelHandle, advice, flags);
}
}
}
Loading

0 comments on commit cf0f1ca

Please sign in to comment.