#7 adding User Narration Profile and using it to name files during post processing

This commit is contained in:
Hamid Reza Mohammadi 2020-09-11 11:58:55 +04:30
parent f2ba1c723b
commit 675f0393e5
7 changed files with 296 additions and 12 deletions

View File

@ -11,6 +11,7 @@ using RMuseum.Models.Notification;
using RSecurityBackend.DbContext;
using RSecurityBackend.Models.Auth.Db;
using System;
using Dapper;
namespace RMuseum.DbContext
{
@ -138,5 +139,10 @@ namespace RMuseum.DbContext
/// </summary>
public DbSet<UploadSession> UploadSessions { get; set; }
/// <summary>
/// User Narration Profiles
/// </summary>
public DbSet<UserNarrationProfile> UserNarrationProfiles { get; set; }
}
}

View File

@ -0,0 +1,58 @@
using RSecurityBackend.Models.Auth.Db;
using System;
namespace RMuseum.Models.GanjoorAudio
{
/// <summary>
/// Narration Profiles for users
/// </summary>
public class UserNarrationProfile
{
/// <summary>
/// Id
/// </summary>
public Guid Id { get; set; }
/// <summary>
/// User
/// </summary>
public RAppUser User { get; set; }
/// <summary>
/// UserId
/// </summary>
public Guid UserId { get; set; }
/// <summary>
/// this would be appended to audio files names prefixed by a dash to make them unique and specfic to user
/// filenames usually would look like {GanjoorPostId}-{FileSuffixWithoutDash}.{ext}
/// for example 2200-hrm.xml
/// </summary>
public string FileSuffixWithoutDash { get; set; }
/// <summary>
/// artist name
/// </summary>
public string ArtistName { get; set; }
/// <summary>
/// artist url
/// </summary>
public string ArtistUrl { get; set; }
/// <summary>
/// audio src
/// </summary>
public string AudioSrc { get; set; }
/// <summary>
/// audio src url
/// </summary>
public string AudioSrcUrl { get; set; }
/// <summary>
/// is default
/// </summary>
public bool IsDefault { get; set; }
}
}

View File

@ -27,7 +27,6 @@
</ItemGroup>
<ItemGroup>
<Folder Include="Services\Implementation\ImportedFromDesktopGanjoor\" />
<Folder Include="Swashbuckle\" />
</ItemGroup>

View File

@ -825,6 +825,11 @@
Upload Sessions
</summary>
</member>
<member name="P:RMuseum.DbContext.RMuseumDbContext.UserNarrationProfiles">
<summary>
User Narration Profiles
</summary>
</member>
<member name="T:RMuseum.Models.Artifact.PublishStatus">
<summary>
Items or pictures status
@ -1778,6 +1783,58 @@
Review Status
</summary>
</member>
<member name="T:RMuseum.Models.GanjoorAudio.UserNarrationProfile">
<summary>
Narration Profiles for users
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.UserNarrationProfile.Id">
<summary>
Id
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.UserNarrationProfile.User">
<summary>
User
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.UserNarrationProfile.UserId">
<summary>
UserId
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.UserNarrationProfile.FileSuffixWithoutDash">
<summary>
this would be appended to audio files names prefixed by a dash to make them unique and specfic to user
filenames usually would look like {GanjoorPostId}-{FileSuffixWithoutDash}.{ext}
for example 2200-hrm.xml
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.UserNarrationProfile.ArtistName">
<summary>
artist name
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.UserNarrationProfile.ArtistUrl">
<summary>
artist url
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.UserNarrationProfile.AudioSrc">
<summary>
audio src
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.UserNarrationProfile.AudioSrcUrl">
<summary>
audio src url
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.UserNarrationProfile.IsDefault">
<summary>
is default
</summary>
</member>
<member name="T:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel">
<summary>
Poem Narration view model
@ -4220,6 +4277,35 @@
<param name="format"></param>
<returns></returns>
</member>
<member name="T:RMuseum.Services.Implementation.ImportedFromDesktopGanjoor.GPersianTextSync">
<summary>
Persian specific text utility class
</summary>
</member>
<member name="M:RMuseum.Services.Implementation.ImportedFromDesktopGanjoor.GPersianTextSync.Sync(System.String)">
<summary>
convert arabic characters to persian equivalents
</summary>
<param name="inputStr"></param>
<returns></returns>
</member>
<member name="P:RMuseum.Services.Implementation.ImportedFromDesktopGanjoor.GPersianTextSync.PersianLetters">
<summary>
list of persian letters
</summary>
</member>
<member name="M:RMuseum.Services.Implementation.ImportedFromDesktopGanjoor.GPersianTextSync.Farglisize(System.String)">
<summary>
convert persian text to simple pinglish
</summary>
<param name="inputStr"></param>
<returns></returns>
</member>
<member name="F:RMuseum.Services.Implementation.ImportedFromDesktopGanjoor.GPersianTextSync._PinglishDic">
<summary>
equaivalnet for persian characters
</summary>
</member>
<member name="T:RMuseum.Services.Implementation.PictureFileService">
<summary>
manipulating picture files

View File

@ -7,9 +7,11 @@ using MySql.Data.MySqlClient;
using NAudio.Wave;
using OggVorbisEncoder;
using RMuseum.DbContext;
using RMuseum.Migrations;
using RMuseum.Models.GanjoorAudio;
using RMuseum.Models.GanjoorAudio.ViewModels;
using RMuseum.Models.UploadSession;
using RMuseum.Services.Implementation.ImportedFromDesktopGanjoor;
using RSecurityBackend.Models.Generic;
using RSecurityBackend.Services.Implementation;
using System;
@ -157,7 +159,8 @@ namespace RMuseum.Services.Implementation
UseId = userId,
UploadStartTime = DateTime.Now,
Status = UploadSessionProcessStatus.NotStarted,
ProcessProgress = 0
ProcessProgress = 0,
User = await _context.Users.Where(u => u.Id == userId).FirstOrDefaultAsync() //this would be referenced later and is needed
};
await _context.UploadSessions.AddAsync(session);
await _context.SaveChangesAsync();
@ -258,7 +261,7 @@ namespace RMuseum.Services.Implementation
try
{
file.MP3FileCheckSum = PoemAudio.ComputeCheckSum(file.FilePath);
mp3files.Add(file);
mp3files.Add(file);
}
catch (Exception exp)
{
@ -296,10 +299,36 @@ namespace RMuseum.Services.Implementation
File.WriteAllBytes(Path.Combine(Path.GetDirectoryName(mp3file.FilePath), $"{Path.GetFileNameWithoutExtension(mp3file.FilePath)}.ogg") , oggBytes);
}
//create draft poem narration:
var FileNameWithoutExtension = $"{audio.PoemId}-{session.UseId}";//TODO: use user profiles for audio files here
//TODO: rename and move files somewhere here
UserNarrationProfile defProfile = await context.UserNarrationProfiles.Where(p => p.UserId == session.UseId && p.IsDefault == true).FirstOrDefaultAsync();
if(defProfile == null)
{
defProfile = new UserNarrationProfile()
{
FileSuffixWithoutDash = !string.IsNullOrEmpty(session.User.FirstName) ? !string.IsNullOrEmpty(session.User.SureName) ?
GPersianTextSync.Farglisize($"{session.User.FirstName[0]}{session.User.SureName[0]}")
:
GPersianTextSync.Farglisize($"{session.User.FirstName[0]}") : $"{session.User.UserName[0]}",
ArtistName = $"{session.User.FirstName} {session.User.SureName}",
ArtistUrl = "",
AudioSrc = "",
AudioSrcUrl = ""
};
}
//create draft poem narration:
string FileNameWithoutExtension = $"{audio.PoemId}-{defProfile.FileSuffixWithoutDash}";
Guid legacyAudioGuid = audio.SyncGuid;
while(
(await context.AudioFiles.Where(a => a.LegacyAudioGuid == legacyAudioGuid).FirstOrDefaultAsync()) != null
)
{ legacyAudioGuid = Guid.NewGuid(); }
//TODO: rename and move files somewhere here
PoemNarration narration = new PoemNarration()
{
OwnerId = session.UseId,
@ -308,11 +337,11 @@ namespace RMuseum.Services.Implementation
FileNameWithoutExtension = FileNameWithoutExtension,
SoundFilesFolder = "a2",
AudioTitle = audio.PoemTitle,
AudioArtist = "",//TODO: use user profiles for audio files here
AudioArtistUrl = "",//TODO: use user profiles for audio files here
AudioSrc = "", //TODO: use user profiles for audio files here
AudioSrcUrl = "", //TODO: use user profiles for audio files here
LegacyAudioGuid = audio.SyncGuid, //check for repeated guid here
AudioArtist = defProfile.ArtistName,
AudioArtistUrl = defProfile.ArtistUrl,
AudioSrc = defProfile.AudioSrc,
AudioSrcUrl = defProfile.AudioSrcUrl,
LegacyAudioGuid = legacyAudioGuid,
Mp3FileCheckSum = audio.FileCheckSum,
Mp3SizeInBytes = mp3fileSize,
OggSizeInBytes = oggfileSize,

View File

@ -0,0 +1,105 @@
using System.Collections.Generic;
namespace RMuseum.Services.Implementation.ImportedFromDesktopGanjoor
{
/// <summary>
/// Persian specific text utility class
/// </summary>
public class GPersianTextSync
{
/// <summary>
/// convert arabic characters to persian equivalents
/// </summary>
/// <param name="inputStr"></param>
/// <returns></returns>
public static string Sync(string inputStr)
{
return
inputStr
.Replace('ك', 'ک')
.Replace('ي', 'ی')
.Replace("ۀ", "هٔ")
.Replace("ه‌ی", "هٔ")
.Replace("0", "۰")
.Replace("1", "۱")
.Replace("2", "۲")
.Replace("3", "۳")
.Replace("4", "۴")
.Replace("5", "۵")
.Replace("6", "۶")
.Replace("7", "۷")
.Replace("8", "۸")
.Replace("9", "۹");
}
/// <summary>
/// list of persian letters
/// </summary>
public static string PersianLetters
{
get
{
return "اآئأإءبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی";
}
}
/// <summary>
/// convert persian text to simple pinglish
/// </summary>
/// <param name="inputStr"></param>
/// <returns></returns>
public static string Farglisize(string inputStr)
{
string outStr = "";
string s;
foreach (char c in inputStr)
if (_PinglishDic.TryGetValue(c, out s))
outStr += s;
return outStr;
}
/// <summary>
/// equaivalnet for persian characters
/// </summary>
private static Dictionary<char, string> _PinglishDic = new Dictionary<char, string>()
{
{'ا', "a"},
{'آ', "a"},
{'ب', "b"},
{'پ', "p"},
{'ت', "t"},
{'ث', "s"},
{'ج', "j"},
{'چ', "ch"},
{'ح', "h"},
{'خ', "kh"},
{'د', "d"},
{'ذ', "z"},
{'ر', "r"},
{'ز', "z"},
{'ژ', "zh"},
{'س', "s"},
{'ش', "sh"},
{'ص', "s"},
{'ض', "z"},
{'ط', "t"},
{'ظ', "z"},
{'ع', "E"},
{'غ', "gh"},
{'ف', "f"},
{'ق', "gh"},
{'ک', "k"},
{'گ', "g"},
{'ل', "l"},
{'م', "m"},
{'ن', "n"},
{'ه', "h"},
{'و', "v"},
{'ی', "i"},
{'ئ', "E"},
{'أ', "A"},
{'إ', "E"},
{' ', "-"},
};
}
}

View File

@ -40,7 +40,8 @@
"Database": "adab"
},
"AudioUploadService": {
"StoragePath": "C:\\audio"
"StoragePath": "C:\\audio",
"LocalAudioRepositoryPath": "D:\\My Documents\\My Web Design\\ganjoor\\www\\i",
},
"AllowedHosts": "*"
}