diff --git a/client/src/app/components/debug/debug.component.html b/client/src/app/components/debug/debug.component.html
index 16fd8f9..237ef06 100644
--- a/client/src/app/components/debug/debug.component.html
+++ b/client/src/app/components/debug/debug.component.html
@@ -23,6 +23,7 @@
+
diff --git a/client/src/app/components/debug/debug.component.ts b/client/src/app/components/debug/debug.component.ts
index 9fc88d2..c9b92c5 100644
--- a/client/src/app/components/debug/debug.component.ts
+++ b/client/src/app/components/debug/debug.component.ts
@@ -54,6 +54,13 @@ export class DebugComponent implements OnInit {
console.log('debug.component.ts', 'processPlaylists', e)
);
}
+ processPlaylistItems() {
+ this._jobsService
+ .processPlaylistItems()
+ .subscribe((e) =>
+ console.log('debug.component.ts', 'processPlaylists', e)
+ );
+ }
updateYouTubeDl() {
this._jobsService
.updateYouTubeDl()
diff --git a/client/src/app/services/jobs.service.ts b/client/src/app/services/jobs.service.ts
index d1f27be..5d61f88 100644
--- a/client/src/app/services/jobs.service.ts
+++ b/client/src/app/services/jobs.service.ts
@@ -18,6 +18,11 @@ export class JobsService {
environment.API_HOST + '/job/processplaylists'
);
}
+ processPlaylistItems(): Observable {
+ return this._http.get(
+ environment.API_HOST + '/job/processplaylistitems'
+ );
+ }
updateYouTubeDl(): Observable {
return this._http.get(
environment.API_HOST + '/job/updateyoutubedl'
diff --git a/server/Controllers/EntryController.cs b/server/Controllers/EntryController.cs
index 849a60a..6b44fb0 100644
--- a/server/Controllers/EntryController.cs
+++ b/server/Controllers/EntryController.cs
@@ -5,6 +5,7 @@ using System.Linq;
using System.Threading.Tasks;
using AutoMapper;
using Hangfire;
+using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
@@ -32,6 +33,7 @@ namespace PodNoms.Api.Controllers {
private readonly IUnitOfWork _unitOfWork;
private readonly IMapper _mapper;
private readonly IUrlProcessService _processor;
+ private readonly IHostingEnvironment _hostingEnvironment;
private readonly ILogger _logger;
private readonly AudioFileStorageSettings _audioFileStorageSettings;
private readonly StorageSettings _storageSettings;
@@ -43,6 +45,7 @@ namespace PodNoms.Api.Controllers {
IConfiguration options,
IUrlProcessService processor, ILoggerFactory logger,
UserManager userManager,
+ IHostingEnvironment hostingEnvironment,
IHttpContextAccessor contextAccessor) : base(contextAccessor, userManager) {
this._logger = logger.CreateLogger();
this._podcastRepository = podcastRepository;
@@ -53,6 +56,7 @@ namespace PodNoms.Api.Controllers {
this._audioFileStorageSettings = audioFileStorageSettings.Value;
this._mapper = mapper;
this._processor = processor;
+ this._hostingEnvironment = hostingEnvironment;
}
private void _processEntry(PodcastEntry entry) {
@@ -111,7 +115,7 @@ namespace PodNoms.Api.Controllers {
var result = _mapper.Map(entry);
return result;
}
- } else if (status == AudioType.Playlist) {
+ } else if (status == AudioType.Playlist && _hostingEnvironment.IsDevelopment()) {
entry.ProcessingStatus = ProcessingStatus.Deferred;
return Accepted(entry);
}
diff --git a/server/Controllers/JobController.cs b/server/Controllers/JobController.cs
index 8db8431..e6c874e 100644
--- a/server/Controllers/JobController.cs
+++ b/server/Controllers/JobController.cs
@@ -19,6 +19,11 @@ namespace PodNoms.Api.Controllers {
var infoJobId = BackgroundJob.Enqueue(service => service.Execute());
return Ok();
}
+ [HttpGet("processplaylistitems")]
+ public IActionResult ProcessPlaylistItems() {
+ var infoJobId = BackgroundJob.Enqueue(service => service.Execute());
+ return Ok();
+ }
[HttpGet("updateyoutubedl")]
public IActionResult UpdateYouTubeDl() {
var infoJobId = BackgroundJob.Enqueue(service => service.Execute());
diff --git a/server/Migrations/20180507153433_ParsedPlaylistVideos.Designer.cs b/server/Migrations/20180507153433_ParsedPlaylistVideos.Designer.cs
new file mode 100644
index 0000000..f658378
--- /dev/null
+++ b/server/Migrations/20180507153433_ParsedPlaylistVideos.Designer.cs
@@ -0,0 +1,390 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Metadata.Internal;
+using Microsoft.EntityFrameworkCore.Migrations;
+using PodNoms.Api.Persistence;
+
+namespace PodNoms.Api.Migrations
+{
+ [DbContext(typeof(PodnomsDbContext))]
+ [Migration("20180507153433_ParsedPlaylistVideos")]
+ partial class ParsedPlaylistVideos
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "2.1.0-preview2-30571")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken();
+
+ b.Property("Name")
+ .HasMaxLength(256);
+
+ b.Property("NormalizedName")
+ .HasMaxLength(256);
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedName")
+ .IsUnique()
+ .HasName("RoleNameIndex")
+ .HasFilter("[NormalizedName] IS NOT NULL");
+
+ b.ToTable("AspNetRoles");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ClaimType");
+
+ b.Property("ClaimValue");
+
+ b.Property("RoleId")
+ .IsRequired();
+
+ b.HasKey("Id");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetRoleClaims");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ClaimType");
+
+ b.Property("ClaimValue");
+
+ b.Property("UserId")
+ .IsRequired();
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserClaims");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.Property("LoginProvider");
+
+ b.Property("ProviderKey");
+
+ b.Property("ProviderDisplayName");
+
+ b.Property("UserId")
+ .IsRequired();
+
+ b.HasKey("LoginProvider", "ProviderKey");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserLogins");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.Property("UserId");
+
+ b.Property("RoleId");
+
+ b.HasKey("UserId", "RoleId");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetUserRoles");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.Property("UserId");
+
+ b.Property("LoginProvider");
+
+ b.Property("Name");
+
+ b.Property("Value");
+
+ b.HasKey("UserId", "LoginProvider", "Name");
+
+ b.ToTable("AspNetUserTokens");
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Models.ParsedPlaylistVideo", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("CreateDate");
+
+ b.Property("IsProcessed");
+
+ b.Property("PlaylistId");
+
+ b.Property("UpdateDate");
+
+ b.Property("VideoId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PlaylistId");
+
+ b.ToTable("ParsedPlaylistVideos");
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Models.Playlist", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("CreateDate");
+
+ b.Property("PodcastId");
+
+ b.Property("SourceUrl");
+
+ b.Property("UpdateDate");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PodcastId");
+
+ b.ToTable("Playlists");
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Models.Podcast", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AppUserId");
+
+ b.Property("CreateDate");
+
+ b.Property("Description");
+
+ b.Property("Slug");
+
+ b.Property("TemporaryImageUrl");
+
+ b.Property("Title");
+
+ b.Property("Uid");
+
+ b.Property("UpdateDate");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AppUserId");
+
+ b.ToTable("Podcasts");
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Models.PodcastEntry", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AudioFileSize");
+
+ b.Property("AudioLength");
+
+ b.Property("AudioUrl");
+
+ b.Property("Author");
+
+ b.Property("CreateDate");
+
+ b.Property("Description");
+
+ b.Property("ImageUrl");
+
+ b.Property("PlaylistId");
+
+ b.Property("PodcastId");
+
+ b.Property("Processed");
+
+ b.Property("ProcessingPayload");
+
+ b.Property("ProcessingStatus");
+
+ b.Property("SourceUrl");
+
+ b.Property("Title");
+
+ b.Property("Uid");
+
+ b.Property("UpdateDate");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PlaylistId");
+
+ b.HasIndex("PodcastId");
+
+ b.ToTable("PodcastEntries");
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Services.Auth.ApplicationUser", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AccessFailedCount");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken();
+
+ b.Property("Email")
+ .HasMaxLength(256);
+
+ b.Property("EmailConfirmed");
+
+ b.Property("FacebookId");
+
+ b.Property("FirstName");
+
+ b.Property("LastName");
+
+ b.Property("LockoutEnabled");
+
+ b.Property("LockoutEnd");
+
+ b.Property("NormalizedEmail")
+ .HasMaxLength(256);
+
+ b.Property("NormalizedUserName")
+ .HasMaxLength(256);
+
+ b.Property("PasswordHash");
+
+ b.Property("PhoneNumber");
+
+ b.Property("PhoneNumberConfirmed");
+
+ b.Property("PictureUrl");
+
+ b.Property("SecurityStamp");
+
+ b.Property("Slug");
+
+ b.Property("TwoFactorEnabled");
+
+ b.Property("UserName")
+ .HasMaxLength(256);
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedEmail")
+ .HasName("EmailIndex");
+
+ b.HasIndex("NormalizedUserName")
+ .IsUnique()
+ .HasName("UserNameIndex")
+ .HasFilter("[NormalizedUserName] IS NOT NULL");
+
+ b.ToTable("AspNetUsers");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole")
+ .WithMany()
+ .HasForeignKey("RoleId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.HasOne("PodNoms.Api.Services.Auth.ApplicationUser")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.HasOne("PodNoms.Api.Services.Auth.ApplicationUser")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole")
+ .WithMany()
+ .HasForeignKey("RoleId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("PodNoms.Api.Services.Auth.ApplicationUser")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.HasOne("PodNoms.Api.Services.Auth.ApplicationUser")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Models.ParsedPlaylistVideo", b =>
+ {
+ b.HasOne("PodNoms.Api.Models.Playlist", "Playlist")
+ .WithMany("ParsedPlaylistVideos")
+ .HasForeignKey("PlaylistId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Models.Playlist", b =>
+ {
+ b.HasOne("PodNoms.Api.Models.Podcast", "Podcast")
+ .WithMany()
+ .HasForeignKey("PodcastId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Models.Podcast", b =>
+ {
+ b.HasOne("PodNoms.Api.Services.Auth.ApplicationUser", "AppUser")
+ .WithMany()
+ .HasForeignKey("AppUserId");
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Models.PodcastEntry", b =>
+ {
+ b.HasOne("PodNoms.Api.Models.Playlist")
+ .WithMany("PodcastEntries")
+ .HasForeignKey("PlaylistId");
+
+ b.HasOne("PodNoms.Api.Models.Podcast", "Podcast")
+ .WithMany("PodcastEntries")
+ .HasForeignKey("PodcastId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/server/Migrations/20180507153433_ParsedPlaylistVideos.cs b/server/Migrations/20180507153433_ParsedPlaylistVideos.cs
new file mode 100644
index 0000000..8c11030
--- /dev/null
+++ b/server/Migrations/20180507153433_ParsedPlaylistVideos.cs
@@ -0,0 +1,75 @@
+using System;
+using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace PodNoms.Api.Migrations
+{
+ public partial class ParsedPlaylistVideos : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.AlterColumn(
+ name: "CreateDate",
+ table: "Podcasts",
+ nullable: false,
+ oldClrType: typeof(DateTime),
+ oldDefaultValueSql: "getdate()");
+
+ migrationBuilder.AlterColumn(
+ name: "CreateDate",
+ table: "PodcastEntries",
+ nullable: false,
+ oldClrType: typeof(DateTime),
+ oldDefaultValueSql: "getdate()");
+
+ migrationBuilder.CreateTable(
+ name: "ParsedPlaylistVideos",
+ columns: table => new
+ {
+ CreateDate = table.Column(nullable: false),
+ UpdateDate = table.Column(nullable: false),
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
+ VideoId = table.Column(nullable: true),
+ IsProcessed = table.Column(nullable: false),
+ PlaylistId = table.Column(nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_ParsedPlaylistVideos", x => x.Id);
+ table.ForeignKey(
+ name: "FK_ParsedPlaylistVideos_Playlists_PlaylistId",
+ column: x => x.PlaylistId,
+ principalTable: "Playlists",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_ParsedPlaylistVideos_PlaylistId",
+ table: "ParsedPlaylistVideos",
+ column: "PlaylistId");
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "ParsedPlaylistVideos");
+
+ migrationBuilder.AlterColumn(
+ name: "CreateDate",
+ table: "Podcasts",
+ nullable: false,
+ defaultValueSql: "getdate()",
+ oldClrType: typeof(DateTime));
+
+ migrationBuilder.AlterColumn(
+ name: "CreateDate",
+ table: "PodcastEntries",
+ nullable: false,
+ defaultValueSql: "getdate()",
+ oldClrType: typeof(DateTime));
+ }
+ }
+}
diff --git a/server/Migrations/20180507155436_Rename_ParsedPlaylistVideos.Designer.cs b/server/Migrations/20180507155436_Rename_ParsedPlaylistVideos.Designer.cs
new file mode 100644
index 0000000..387ba8d
--- /dev/null
+++ b/server/Migrations/20180507155436_Rename_ParsedPlaylistVideos.Designer.cs
@@ -0,0 +1,390 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Metadata.Internal;
+using Microsoft.EntityFrameworkCore.Migrations;
+using PodNoms.Api.Persistence;
+
+namespace PodNoms.Api.Migrations
+{
+ [DbContext(typeof(PodnomsDbContext))]
+ [Migration("20180507155436_Rename_ParsedPlaylistVideos")]
+ partial class Rename_ParsedPlaylistVideos
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "2.1.0-preview2-30571")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken();
+
+ b.Property("Name")
+ .HasMaxLength(256);
+
+ b.Property("NormalizedName")
+ .HasMaxLength(256);
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedName")
+ .IsUnique()
+ .HasName("RoleNameIndex")
+ .HasFilter("[NormalizedName] IS NOT NULL");
+
+ b.ToTable("AspNetRoles");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ClaimType");
+
+ b.Property("ClaimValue");
+
+ b.Property("RoleId")
+ .IsRequired();
+
+ b.HasKey("Id");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetRoleClaims");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ClaimType");
+
+ b.Property("ClaimValue");
+
+ b.Property("UserId")
+ .IsRequired();
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserClaims");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.Property("LoginProvider");
+
+ b.Property("ProviderKey");
+
+ b.Property("ProviderDisplayName");
+
+ b.Property("UserId")
+ .IsRequired();
+
+ b.HasKey("LoginProvider", "ProviderKey");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserLogins");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.Property("UserId");
+
+ b.Property("RoleId");
+
+ b.HasKey("UserId", "RoleId");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetUserRoles");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.Property("UserId");
+
+ b.Property("LoginProvider");
+
+ b.Property("Name");
+
+ b.Property("Value");
+
+ b.HasKey("UserId", "LoginProvider", "Name");
+
+ b.ToTable("AspNetUserTokens");
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Models.ParsedPlaylistItem", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("CreateDate");
+
+ b.Property("IsProcessed");
+
+ b.Property("PlaylistId");
+
+ b.Property("UpdateDate");
+
+ b.Property("VideoId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PlaylistId");
+
+ b.ToTable("ParsedPlaylistItems");
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Models.Playlist", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("CreateDate");
+
+ b.Property("PodcastId");
+
+ b.Property("SourceUrl");
+
+ b.Property("UpdateDate");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PodcastId");
+
+ b.ToTable("Playlists");
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Models.Podcast", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AppUserId");
+
+ b.Property("CreateDate");
+
+ b.Property("Description");
+
+ b.Property("Slug");
+
+ b.Property("TemporaryImageUrl");
+
+ b.Property("Title");
+
+ b.Property("Uid");
+
+ b.Property("UpdateDate");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AppUserId");
+
+ b.ToTable("Podcasts");
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Models.PodcastEntry", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AudioFileSize");
+
+ b.Property("AudioLength");
+
+ b.Property("AudioUrl");
+
+ b.Property("Author");
+
+ b.Property("CreateDate");
+
+ b.Property("Description");
+
+ b.Property("ImageUrl");
+
+ b.Property("PlaylistId");
+
+ b.Property("PodcastId");
+
+ b.Property("Processed");
+
+ b.Property("ProcessingPayload");
+
+ b.Property("ProcessingStatus");
+
+ b.Property("SourceUrl");
+
+ b.Property("Title");
+
+ b.Property("Uid");
+
+ b.Property("UpdateDate");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PlaylistId");
+
+ b.HasIndex("PodcastId");
+
+ b.ToTable("PodcastEntries");
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Services.Auth.ApplicationUser", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AccessFailedCount");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken();
+
+ b.Property("Email")
+ .HasMaxLength(256);
+
+ b.Property("EmailConfirmed");
+
+ b.Property("FacebookId");
+
+ b.Property("FirstName");
+
+ b.Property("LastName");
+
+ b.Property("LockoutEnabled");
+
+ b.Property("LockoutEnd");
+
+ b.Property("NormalizedEmail")
+ .HasMaxLength(256);
+
+ b.Property("NormalizedUserName")
+ .HasMaxLength(256);
+
+ b.Property("PasswordHash");
+
+ b.Property("PhoneNumber");
+
+ b.Property("PhoneNumberConfirmed");
+
+ b.Property("PictureUrl");
+
+ b.Property("SecurityStamp");
+
+ b.Property("Slug");
+
+ b.Property("TwoFactorEnabled");
+
+ b.Property("UserName")
+ .HasMaxLength(256);
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedEmail")
+ .HasName("EmailIndex");
+
+ b.HasIndex("NormalizedUserName")
+ .IsUnique()
+ .HasName("UserNameIndex")
+ .HasFilter("[NormalizedUserName] IS NOT NULL");
+
+ b.ToTable("AspNetUsers");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole")
+ .WithMany()
+ .HasForeignKey("RoleId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.HasOne("PodNoms.Api.Services.Auth.ApplicationUser")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.HasOne("PodNoms.Api.Services.Auth.ApplicationUser")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole")
+ .WithMany()
+ .HasForeignKey("RoleId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("PodNoms.Api.Services.Auth.ApplicationUser")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.HasOne("PodNoms.Api.Services.Auth.ApplicationUser")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Models.ParsedPlaylistItem", b =>
+ {
+ b.HasOne("PodNoms.Api.Models.Playlist", "Playlist")
+ .WithMany("ParsedPlaylistItems")
+ .HasForeignKey("PlaylistId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Models.Playlist", b =>
+ {
+ b.HasOne("PodNoms.Api.Models.Podcast", "Podcast")
+ .WithMany()
+ .HasForeignKey("PodcastId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Models.Podcast", b =>
+ {
+ b.HasOne("PodNoms.Api.Services.Auth.ApplicationUser", "AppUser")
+ .WithMany()
+ .HasForeignKey("AppUserId");
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Models.PodcastEntry", b =>
+ {
+ b.HasOne("PodNoms.Api.Models.Playlist")
+ .WithMany("PodcastEntries")
+ .HasForeignKey("PlaylistId");
+
+ b.HasOne("PodNoms.Api.Models.Podcast", "Podcast")
+ .WithMany("PodcastEntries")
+ .HasForeignKey("PodcastId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/server/Migrations/20180507155436_Rename_ParsedPlaylistVideos.cs b/server/Migrations/20180507155436_Rename_ParsedPlaylistVideos.cs
new file mode 100644
index 0000000..b752eec
--- /dev/null
+++ b/server/Migrations/20180507155436_Rename_ParsedPlaylistVideos.cs
@@ -0,0 +1,78 @@
+using System;
+using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace PodNoms.Api.Migrations
+{
+ public partial class Rename_ParsedPlaylistVideos : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "ParsedPlaylistVideos");
+
+ migrationBuilder.CreateTable(
+ name: "ParsedPlaylistItems",
+ columns: table => new
+ {
+ CreateDate = table.Column(nullable: false),
+ UpdateDate = table.Column(nullable: false),
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
+ VideoId = table.Column(nullable: true),
+ IsProcessed = table.Column(nullable: false),
+ PlaylistId = table.Column(nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_ParsedPlaylistItems", x => x.Id);
+ table.ForeignKey(
+ name: "FK_ParsedPlaylistItems_Playlists_PlaylistId",
+ column: x => x.PlaylistId,
+ principalTable: "Playlists",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_ParsedPlaylistItems_PlaylistId",
+ table: "ParsedPlaylistItems",
+ column: "PlaylistId");
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "ParsedPlaylistItems");
+
+ migrationBuilder.CreateTable(
+ name: "ParsedPlaylistVideos",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
+ CreateDate = table.Column(nullable: false),
+ IsProcessed = table.Column(nullable: false),
+ PlaylistId = table.Column(nullable: false),
+ UpdateDate = table.Column(nullable: false),
+ VideoId = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_ParsedPlaylistVideos", x => x.Id);
+ table.ForeignKey(
+ name: "FK_ParsedPlaylistVideos_Playlists_PlaylistId",
+ column: x => x.PlaylistId,
+ principalTable: "Playlists",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_ParsedPlaylistVideos_PlaylistId",
+ table: "ParsedPlaylistVideos",
+ column: "PlaylistId");
+ }
+ }
+}
diff --git a/server/Migrations/20180507162159_AddVideoTypeToPlaylistItem.Designer.cs b/server/Migrations/20180507162159_AddVideoTypeToPlaylistItem.Designer.cs
new file mode 100644
index 0000000..61bfb4e
--- /dev/null
+++ b/server/Migrations/20180507162159_AddVideoTypeToPlaylistItem.Designer.cs
@@ -0,0 +1,392 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Metadata.Internal;
+using Microsoft.EntityFrameworkCore.Migrations;
+using PodNoms.Api.Persistence;
+
+namespace PodNoms.Api.Migrations
+{
+ [DbContext(typeof(PodnomsDbContext))]
+ [Migration("20180507162159_AddVideoTypeToPlaylistItem")]
+ partial class AddVideoTypeToPlaylistItem
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "2.1.0-preview2-30571")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken();
+
+ b.Property("Name")
+ .HasMaxLength(256);
+
+ b.Property("NormalizedName")
+ .HasMaxLength(256);
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedName")
+ .IsUnique()
+ .HasName("RoleNameIndex")
+ .HasFilter("[NormalizedName] IS NOT NULL");
+
+ b.ToTable("AspNetRoles");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ClaimType");
+
+ b.Property("ClaimValue");
+
+ b.Property("RoleId")
+ .IsRequired();
+
+ b.HasKey("Id");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetRoleClaims");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ClaimType");
+
+ b.Property("ClaimValue");
+
+ b.Property("UserId")
+ .IsRequired();
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserClaims");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.Property("LoginProvider");
+
+ b.Property("ProviderKey");
+
+ b.Property("ProviderDisplayName");
+
+ b.Property("UserId")
+ .IsRequired();
+
+ b.HasKey("LoginProvider", "ProviderKey");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserLogins");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.Property("UserId");
+
+ b.Property("RoleId");
+
+ b.HasKey("UserId", "RoleId");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetUserRoles");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.Property("UserId");
+
+ b.Property("LoginProvider");
+
+ b.Property("Name");
+
+ b.Property("Value");
+
+ b.HasKey("UserId", "LoginProvider", "Name");
+
+ b.ToTable("AspNetUserTokens");
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Models.ParsedPlaylistItem", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("CreateDate");
+
+ b.Property("IsProcessed");
+
+ b.Property("PlaylistId");
+
+ b.Property("UpdateDate");
+
+ b.Property("VideoId");
+
+ b.Property("VideoType");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PlaylistId");
+
+ b.ToTable("ParsedPlaylistItems");
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Models.Playlist", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("CreateDate");
+
+ b.Property("PodcastId");
+
+ b.Property("SourceUrl");
+
+ b.Property("UpdateDate");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PodcastId");
+
+ b.ToTable("Playlists");
+ });
+
+ modelBuilder.Entity("PodNoms.Api.Models.Podcast", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AppUserId");
+
+ b.Property("CreateDate");
+
+ b.Property("Description");
+
+ b.Property