diff --git a/RMuseum/Controllers/AudioNarrationController.cs b/RMuseum/Controllers/AudioNarrationController.cs
new file mode 100644
index 00000000..ca3448c8
--- /dev/null
+++ b/RMuseum/Controllers/AudioNarrationController.cs
@@ -0,0 +1,61 @@
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using RMuseum.Models.Auth.Memory;
+using RMuseum.Services;
+using RSecurityBackend.Models.Generic;
+using RSecurityBackend.Services;
+using System;
+using System.Linq;
+using System.Net;
+using System.Threading.Tasks;
+
+namespace RMuseum.Controllers
+{
+ [Produces("application/json")]
+ [Route("api/audio")]
+ public class AudioNarrationController : Controller
+ {
+
+ ///
+ /// imports data from ganjoor MySql database
+ ///
+ ///
+ [HttpPost]
+ [Route("mysqlonetimeimport")]
+ [Authorize(Policy = RMuseumSecurableItem.AudioNarrationEntityShortName + ":" + RMuseumSecurableItem.ImportOperationShortName)]
+ [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))]
+ [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
+ public async Task MysqlonetimeImport()
+ {
+ Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
+ RServiceResult res =
+ await _audioService.OneTimeImport(loggedOnUserId);
+ if (res.Result)
+ return Ok();
+ return BadRequest(res.ExceptionString);
+ }
+
+
+ ///
+ /// constructor
+ ///
+ ///
+ ///
+ ///
+ public AudioNarrationController(IAudioNarrationService audioService, IUserPermissionChecker userPermissionChecker)
+ {
+ _audioService = audioService;
+ _userPermissionChecker = userPermissionChecker;
+ }
+
+ ///
+ /// Artifact Service
+ ///
+ protected readonly IAudioNarrationService _audioService;
+
+ ///
+ /// IUserPermissionChecker instance
+ ///
+ protected IUserPermissionChecker _userPermissionChecker;
+ }
+}
diff --git a/RMuseum/RMuseum.xml b/RMuseum/RMuseum.xml
index d26bd044..2a51a003 100644
--- a/RMuseum/RMuseum.xml
+++ b/RMuseum/RMuseum.xml
@@ -620,6 +620,30 @@
Captcha service
+
+
+ imports data from ganjoor MySql database
+
+
+
+
+
+ constructor
+
+
+
+
+
+
+
+ Artifact Service
+
+
+
+
+ IUserPermissionChecker instance
+
+
Audit Log Controller Base
@@ -3000,6 +3024,18 @@
+
+
+ Audio Narration Service
+
+
+
+
+ imports data from ganjoor MySql database
+
+ User Id which becomes owner of imported data
+
+
IArtifactService implementation
@@ -3708,6 +3744,34 @@
+
+
+ Audio Narration Service Implementation
+
+
+
+
+ imports data from ganjoor MySql database
+
+ User Id which becomes owner of imported data
+
+
+
+ Configuration
+
+
+
+
+ Database Contetxt
+
+
+
+
+ constructor
+
+
+
+
British Library Tile Downloader And Mixer
diff --git a/RMuseum/Services/IAudioNarrationService.cs b/RMuseum/Services/IAudioNarrationService.cs
new file mode 100644
index 00000000..86286ee1
--- /dev/null
+++ b/RMuseum/Services/IAudioNarrationService.cs
@@ -0,0 +1,19 @@
+using RSecurityBackend.Models.Generic;
+using System;
+using System.Threading.Tasks;
+
+namespace RMuseum.Services
+{
+ ///
+ /// Audio Narration Service
+ ///
+ public interface IAudioNarrationService
+ {
+ ///
+ /// imports data from ganjoor MySql database
+ ///
+ /// User Id which becomes owner of imported data
+ ///
+ Task> OneTimeImport(Guid OwnrRAppUserId);
+ }
+}
diff --git a/RMuseum/Services/Implementation/AudioNarrationService.cs b/RMuseum/Services/Implementation/AudioNarrationService.cs
new file mode 100644
index 00000000..6172bc66
--- /dev/null
+++ b/RMuseum/Services/Implementation/AudioNarrationService.cs
@@ -0,0 +1,118 @@
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Configuration;
+using MySql.Data.MySqlClient;
+using RMuseum.DbContext;
+using RMuseum.Models.GanjoorAudio;
+using RSecurityBackend.Models.Generic;
+using System;
+using System.Data;
+using System.IO;
+using System.Linq;
+using System.Security.Policy;
+using System.Threading.Tasks;
+
+namespace RMuseum.Services.Implementation
+{
+ ///
+ /// Audio Narration Service Implementation
+ ///
+ public class AudioNarrationService : IAudioNarrationService
+ {
+ ///
+ /// imports data from ganjoor MySql database
+ ///
+ /// User Id which becomes owner of imported data
+ public async Task> OneTimeImport(Guid OwnrRAppUserId)
+ {
+ try
+ {
+ PoemNarration sampleCheck = await _context.AudioFiles.FirstOrDefaultAsync();
+ if(sampleCheck != null)
+ {
+ return new RServiceResult(false, "OneTimeImport is a one time operation and cannot be called multiple times.");
+ }
+ using (MySqlConnection connection = new MySqlConnection
+ (
+ $"server={Configuration.GetSection("AudioMySqlServer")["Server"]};uid={Configuration.GetSection("AudioMySqlServer")["Username"]};pwd={Configuration.GetSection("AudioMySqlServer")["Password"]};database={Configuration.GetSection("AudioMySqlServer")["Database"]};charset=utf8"
+ ))
+ {
+ connection.Open();
+ using(MySqlDataAdapter src = new MySqlDataAdapter(
+ "SELECT audio_ID, audio_post_ID, audio_order, audio_xml, audio_ogg, audio_mp3, " +
+ "audio_title, audio_artist, audio_artist_url, audio_src, audio_src_url, audio_guid, " +
+ "audio_fchecksum, audio_mp3bsize, audio_oggbsize, audio_date " +
+ "FROM adab.ganja_gaudio ORDER BY audio_ID",
+ connection
+ ))
+ {
+ using(DataTable srcData = new DataTable())
+ {
+ await src.FillAsync(srcData);
+
+ int audioSyncStatus = (int)AudioSyncStatus.SynchronizedOrRejected;
+ foreach (DataRow row in srcData.Rows)
+ {
+ PoemNarration newRecord = new PoemNarration()
+ {
+ OwnerId = OwnrRAppUserId,
+ GanjoorAudioId = int.Parse(row["audio_ID"].ToString()),
+ GanjoorPostId = (int)row["audio_post_ID"],
+ AudioOrder = (int)row["audio_order"],
+ AudioTitle = row["audio_title"].ToString(),
+ AudioArtist = row["audio_artist"].ToString(),
+ AudioArtistUrl = row["audio_artist_url"].ToString(),
+ AudioSrc = row["audio_src"].ToString(),
+ AudioSrcUrl = row["audio_src_url"].ToString(),
+ LegacyAudioGuid = new Guid(row["audio_guid"].ToString()),
+ Mp3FileCheckSum = row["audio_fchecksum"].ToString(),
+ Mp3SizeInBytes = (int)row["audio_mp3bsize"],
+ OggSizeInBytes = (int)row["audio_oggbsize"],
+ UploadDate = (DateTime)row["audio_date"],
+ AudioSyncStatus = audioSyncStatus,
+ ReviewStatus = AudioReviewStatus.Approved
+ };
+ newRecord.ReviewDate = newRecord.UploadDate;
+ string audio_xml = row["audio_xml"].ToString();
+ //sample audio_xml value: /i/a/x/11876-Simorgh.xml
+ audio_xml = audio_xml.Substring("/i/".Length); // /i/a/x/11876-Simorgh.xml -> a/x/11876-Simorgh.xml
+ newRecord.SoundFilesFolder = audio_xml.Substring(0, audio_xml.IndexOf('/')); //(a)
+ newRecord.FileNameWithoutExtension = Path.GetFileNameWithoutExtension(audio_xml.Substring(audio_xml.LastIndexOf('/') + 1)); //(11876-Simorgh)
+
+ _context.AudioFiles.Add(newRecord);
+ }
+ }
+ await _context.SaveChangesAsync();
+ }
+ }
+ return new RServiceResult(true);
+ }
+ catch(Exception exp)
+ {
+ return new RServiceResult(false, exp.ToString());
+ }
+
+ }
+
+
+ ///
+ /// Configuration
+ ///
+ protected IConfiguration Configuration { get; }
+
+ ///
+ /// Database Contetxt
+ ///
+ protected readonly RMuseumDbContext _context;
+
+ ///
+ /// constructor
+ ///
+ ///
+ ///
+ public AudioNarrationService(RMuseumDbContext context, IConfiguration configuration)
+ {
+ _context = context;
+ Configuration = configuration;
+ }
+ }
+}
diff --git a/RMuseum/Startup.cs b/RMuseum/Startup.cs
index 3618d8de..ea96692b 100644
--- a/RMuseum/Startup.cs
+++ b/RMuseum/Startup.cs
@@ -248,6 +248,9 @@ namespace RMuseum
//artifact service
services.AddTransient();
+ //audio service
+ services.AddTransient();
+
services.AddHostedService();
services.AddSingleton();
diff --git a/RMuseum/appsettings.json b/RMuseum/appsettings.json
index 5405574b..4d648158 100644
--- a/RMuseum/appsettings.json
+++ b/RMuseum/appsettings.json
@@ -33,6 +33,11 @@
"Password": "password",
"From": "test@gmail.com"
},
-
+ "AudioMySqlServer": {
+ "Server": "localhost",
+ "Username": "root",
+ "Password": "",
+ "Database": "adab"
+ },
"AllowedHosts": "*"
}