mirror of
https://github.com/revenz/FileFlowsPlugins.git
synced 2026-01-06 12:00:26 -06:00
159 lines
5.6 KiB
C#
159 lines
5.6 KiB
C#
using FileFlows.Plugin;
|
|
using Id3;
|
|
using System.Text.RegularExpressions;
|
|
|
|
namespace MetaNodes.Music
|
|
{
|
|
public class MusicMeta:Node
|
|
{
|
|
public override int Inputs => 1;
|
|
public override int Outputs => 1;
|
|
public override string HelpUrl => "https://docs.fileflows.com/plugins/meta-nodes/music-meta";
|
|
|
|
private Dictionary<string, object> _Variables;
|
|
public override Dictionary<string, object> Variables => _Variables;
|
|
public override FlowElementType Type => FlowElementType.Process;
|
|
public override string Icon => "fas fa-music";
|
|
|
|
public MusicMeta()
|
|
{
|
|
_Variables = new Dictionary<string, object>()
|
|
{
|
|
{ "music.Artist", "A Fine Frenzy" },
|
|
{ "music.Album", "Pines" },
|
|
//{ "music.Year", 2012 },
|
|
{ "music.Track.Number", 4 },
|
|
{ "music.Track.Name", "Riversong" },
|
|
};
|
|
}
|
|
|
|
|
|
public override int Execute(NodeParameters args)
|
|
{
|
|
string artist = FindArtist(args);
|
|
string album = FindAlbum(args, artist);
|
|
int trackNumber = FindTrack(args, artist, album);
|
|
int year = FindYear(args, artist, album);
|
|
string track = FindTrackName(args, artist, album);
|
|
//Query q = new Query("FileFlows.MusicBrainzTagger", "0.0.1");
|
|
//findalbu
|
|
//q.FindArtists(artist);
|
|
|
|
Variables["music.Artist"] = artist;
|
|
Variables["music.Album"] = album;
|
|
Variables["music.Year"] = year;
|
|
Variables["music.Track.Number"] = trackNumber;
|
|
Variables["music.Track.Name"] = track;
|
|
|
|
args.UpdateVariables(Variables);
|
|
|
|
return 1;
|
|
}
|
|
|
|
private string FindTrackName(NodeParameters args, string artist, string album)
|
|
{
|
|
try
|
|
{
|
|
using (var mp3 = new Mp3(args.WorkingFile))
|
|
{
|
|
Id3Tag tag = mp3.GetTag(Id3TagFamily.Version2X);
|
|
if (tag != null && tag.Track != null && tag.Track.TrackCount > 0)
|
|
return tag.Title;
|
|
}
|
|
}
|
|
catch (Exception) { }
|
|
return String.Empty;
|
|
}
|
|
private int FindTrack(NodeParameters args, string artist, string album)
|
|
{
|
|
try
|
|
{
|
|
using (var mp3 = new Mp3(args.WorkingFile))
|
|
{
|
|
Id3Tag tag = mp3.GetTag(Id3TagFamily.Version2X);
|
|
if (tag != null && tag.Track != null && tag.Track.TrackCount > 0)
|
|
return tag.Track.TrackCount;
|
|
}
|
|
}
|
|
catch (Exception) { }
|
|
// find in the filename
|
|
string filename = new FileInfo(args.FileName).Name;
|
|
var match = Regex.Match(filename, @"[\d]{1,3}");
|
|
if (match.Success)
|
|
return int.Parse(match.Value);
|
|
return 0;
|
|
}
|
|
|
|
private int FindYear(NodeParameters args, string artist, string album)
|
|
{
|
|
try
|
|
{
|
|
using (var mp3 = new Mp3(args.WorkingFile))
|
|
{
|
|
Id3Tag tag = mp3.GetTag(Id3TagFamily.Version2X);
|
|
if (tag?.Year?.Value > 0)
|
|
return tag.Year.Value.Value;
|
|
}
|
|
}
|
|
catch (Exception) { }
|
|
// find in the filename
|
|
string filename = new FileInfo(args.FileName).Name;
|
|
var match = Regex.Match(filename, @"(?<=([^\d]))[\d]{4}(?=([^\d]))");
|
|
if (match.Success)
|
|
return int.Parse(match.Value);
|
|
return 0;
|
|
}
|
|
private string FindAlbum(NodeParameters args, string artist)
|
|
{
|
|
try
|
|
{
|
|
using (var mp3 = new Mp3(args.WorkingFile))
|
|
{
|
|
Id3Tag tag = mp3.GetTag(Id3TagFamily.Version2X);
|
|
if (string.IsNullOrEmpty(tag.Album) == false)
|
|
return tag.Album;
|
|
}
|
|
}
|
|
catch (Exception) { }
|
|
|
|
// try find it from the filename....
|
|
var parts = args.RelativeFile.Replace("\\", "/").Split('/');
|
|
if (parts.Length == 3)
|
|
return parts[1]; // artist/album/song.mp3
|
|
else if (parts.Length > 3)
|
|
return parts[parts.Length - 2];
|
|
|
|
// not in path. try looking for it in the filename
|
|
string file = new FileInfo(args.FileName).Name;
|
|
|
|
return Regex.Match(parts[parts.Length - 1], @"(?<=([\-_]))[^\-_]+").Value?.Trim() ?? string.Empty;
|
|
}
|
|
|
|
private string FindArtist(NodeParameters args)
|
|
{
|
|
try
|
|
{
|
|
using (var mp3 = new Mp3(args.WorkingFile))
|
|
{
|
|
Id3Tag tag = mp3.GetTag(Id3TagFamily.Version2X);
|
|
if (string.IsNullOrEmpty(tag.Artists) == false)
|
|
return tag.Artists;
|
|
}
|
|
}
|
|
catch (Exception ex) { }
|
|
|
|
// try find it from the filename....
|
|
var parts = args.RelativeFile.Replace("\\", "/").Split('/');
|
|
if (parts.Length == 3)
|
|
return parts[0]; // artist/album/song.mp3
|
|
else if (parts.Length > 3)
|
|
return parts[parts.Length - 3];
|
|
else if (parts.Length == 2)
|
|
return parts[0];
|
|
|
|
// not in path. try looking for it in the filename
|
|
return Regex.Match(parts[parts.Length - 1], @"^[^\-_]+").Value?.Trim() ?? string.Empty;
|
|
}
|
|
}
|
|
}
|