Huge API rewrite
This commit is contained in:
		| @@ -20,7 +20,7 @@ namespace YTManager.Controllers { | ||||
|                 Title = c.Title; | ||||
|                 Description = c.Description; | ||||
|                 ID = c.YoutubeID; | ||||
|                 Video_IDs = c.Videos?.Select(v => v.YoutubeID).ToList(); | ||||
|                 Video_IDs = c.Videos.Select(v => v.YoutubeID).ToList(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @@ -38,6 +38,7 @@ namespace YTManager.Controllers { | ||||
|         public async Task<IActionResult> Get() { | ||||
|             // Get all the relevant channels. | ||||
|             var chanels = await db.Channels | ||||
|                 .Include(c => c.Videos) | ||||
|                 .OrderByDescending(i => i.AddedtoDB) | ||||
|                 .Take(max_per_query) | ||||
|                 .ToListAsync(); | ||||
|   | ||||
							
								
								
									
										141
									
								
								YTManager/Controllers/Raw/Private_Channel.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								YTManager/Controllers/Raw/Private_Channel.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,141 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.AspNetCore.Http; | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using YTManager; | ||||
| using YTManager.Models; | ||||
|  | ||||
| namespace YTManager.Controllers.Private | ||||
| { | ||||
|     [Produces("application/json")] | ||||
|     [Route("api_raw/Channels")] | ||||
|     public class Private_Channel : Controller | ||||
|     { | ||||
|         private readonly MediaDB db; | ||||
|  | ||||
|         public Private_Channel(MediaDB context) | ||||
|         { | ||||
|             db = context; | ||||
|         } | ||||
|  | ||||
|         [HttpGet] | ||||
|         public IEnumerable<Channel> GetChannels() | ||||
|         { | ||||
|             return db.Channels; | ||||
|         } | ||||
|  | ||||
|         [HttpGet("{id}")] | ||||
|         public async Task<IActionResult> GetChannel([FromRoute] long id) | ||||
|         { | ||||
|             if (!ModelState.IsValid) | ||||
|             { | ||||
|                 return BadRequest(ModelState); | ||||
|             } | ||||
|  | ||||
|             var channel = await db | ||||
|                 .Channels | ||||
|                 .Include(c => c.Videos) | ||||
|                 .SingleOrDefaultAsync(m => m.PrimaryKey == id); | ||||
|  | ||||
|             if (channel == null) | ||||
|             { | ||||
|                 return NotFound(); | ||||
|             } | ||||
|  | ||||
|             return Ok(channel); | ||||
|         } | ||||
|  | ||||
|         [HttpPut("{id}")] | ||||
|         public async Task<IActionResult> PutChannel([FromRoute] long id, [FromBody] Channel channel) | ||||
|         { | ||||
|             if (!ModelState.IsValid) | ||||
|             { | ||||
|                 return BadRequest(ModelState); | ||||
|             } | ||||
|  | ||||
|             if (id != channel.PrimaryKey) | ||||
|             { | ||||
|                 return BadRequest(); | ||||
|             } | ||||
|  | ||||
|             db.Entry(channel).State = EntityState.Modified; | ||||
|  | ||||
|             try | ||||
|             { | ||||
|                 await db.SaveChangesAsync(); | ||||
|             } | ||||
|             catch (DbUpdateConcurrencyException) | ||||
|             { | ||||
|                 if (!ChannelExists(id)) | ||||
|                 { | ||||
|                     return NotFound(); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     throw; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             return NoContent(); | ||||
|         } | ||||
|  | ||||
|         [HttpPost("{channelid}")] | ||||
|         public async Task<IActionResult> PostChannel([FromRoute] string channelid) { | ||||
|             // Only add it to the databse if it's not in there already. | ||||
|             if (db.Channels.Any(c => c.YoutubeID == channelid)) | ||||
|                 return BadRequest(); | ||||
|  | ||||
|             // Get the channel contents from youtube. | ||||
|             var channel = await Tasks.FetchVideos.Get_YTChannel(channelid); | ||||
|  | ||||
|             // Add it to the databse. | ||||
|             await db.Channels.AddAsync(channel); | ||||
|             await db.SaveChangesAsync(); | ||||
|  | ||||
|             // Say all went ok. | ||||
|             return Ok(channel); | ||||
|         } | ||||
|  | ||||
|         [HttpPost] | ||||
|         public async Task<IActionResult> PostChannel([FromBody] Channel channel) | ||||
|         { | ||||
|             if (!ModelState.IsValid) | ||||
|             { | ||||
|                 return BadRequest(ModelState); | ||||
|             } | ||||
|  | ||||
|             db.Channels.Add(channel); | ||||
|             await db.SaveChangesAsync(); | ||||
|  | ||||
|             return CreatedAtAction("GetChannel", new { id = channel.PrimaryKey }, channel); | ||||
|         } | ||||
|  | ||||
|         [HttpDelete("{id}")] | ||||
|         public async Task<IActionResult> DeleteChannel([FromRoute] long id) | ||||
|         { | ||||
|             if (!ModelState.IsValid) | ||||
|             { | ||||
|                 return BadRequest(ModelState); | ||||
|             } | ||||
|  | ||||
|             var channel = await db.Channels.SingleOrDefaultAsync(m => m.PrimaryKey == id); | ||||
|             if (channel == null) | ||||
|             { | ||||
|                 return NotFound(); | ||||
|             } | ||||
|  | ||||
|             db.Channels.Remove(channel); | ||||
|             await db.SaveChangesAsync(); | ||||
|  | ||||
|             return Ok(channel); | ||||
|         } | ||||
|  | ||||
|         private bool ChannelExists(long id) | ||||
|         { | ||||
|             return db.Channels.Any(e => e.PrimaryKey == id); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										129
									
								
								YTManager/Controllers/Raw/Private_Video.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								YTManager/Controllers/Raw/Private_Video.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,129 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.AspNetCore.Http; | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using YTManager; | ||||
| using YTManager.Models; | ||||
|  | ||||
| namespace YTManager.Controllers | ||||
| { | ||||
|     [Produces("application/json")] | ||||
|     [Route("api_raw/Videos")] | ||||
|     public class Private_Videos : Controller | ||||
|     { | ||||
|         private readonly MediaDB _context; | ||||
|  | ||||
|         public Private_Videos(MediaDB context) | ||||
|         { | ||||
|             _context = context; | ||||
|         } | ||||
|  | ||||
|         // GET: api/Videos | ||||
|         [HttpGet] | ||||
|         public IEnumerable<Video> GetVideos() | ||||
|         { | ||||
|             return _context.Videos; | ||||
|         } | ||||
|  | ||||
|         // GET: api/Videos/5 | ||||
|         [HttpGet("{id}")] | ||||
|         public async Task<IActionResult> GetVideo([FromRoute] long id) | ||||
|         { | ||||
|             if (!ModelState.IsValid) | ||||
|             { | ||||
|                 return BadRequest(ModelState); | ||||
|             } | ||||
|  | ||||
|             var video = await _context | ||||
|                 .Videos | ||||
|                 .Include(v => v.Channel) | ||||
|                 .SingleOrDefaultAsync(m => m.PrimaryKey == id); | ||||
|  | ||||
|             if (video == null) | ||||
|             { | ||||
|                 return NotFound(); | ||||
|             } | ||||
|  | ||||
|             return Ok(video); | ||||
|         } | ||||
|  | ||||
|         // PUT: api/Videos/5 | ||||
|         [HttpPut("{id}")] | ||||
|         public async Task<IActionResult> PutVideo([FromRoute] long id, [FromBody] Video video) | ||||
|         { | ||||
|             if (!ModelState.IsValid) | ||||
|             { | ||||
|                 return BadRequest(ModelState); | ||||
|             } | ||||
|  | ||||
|             if (id != video.PrimaryKey) | ||||
|             { | ||||
|                 return BadRequest(); | ||||
|             } | ||||
|  | ||||
|             _context.Entry(video).State = EntityState.Modified; | ||||
|  | ||||
|             try | ||||
|             { | ||||
|                 await _context.SaveChangesAsync(); | ||||
|             } | ||||
|             catch (DbUpdateConcurrencyException) | ||||
|             { | ||||
|                 if (!VideoExists(id)) | ||||
|                 { | ||||
|                     return NotFound(); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     throw; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             return NoContent(); | ||||
|         } | ||||
|  | ||||
|         // POST: api/Videos | ||||
|         [HttpPost] | ||||
|         public async Task<IActionResult> PostVideo([FromBody] Video video) | ||||
|         { | ||||
|             if (!ModelState.IsValid) | ||||
|             { | ||||
|                 return BadRequest(ModelState); | ||||
|             } | ||||
|  | ||||
|             _context.Videos.Add(video); | ||||
|             await _context.SaveChangesAsync(); | ||||
|  | ||||
|             return CreatedAtAction("GetVideo", new { id = video.PrimaryKey }, video); | ||||
|         } | ||||
|  | ||||
|         // DELETE: api/Videos/5 | ||||
|         [HttpDelete("{id}")] | ||||
|         public async Task<IActionResult> DeleteVideo([FromRoute] long id) | ||||
|         { | ||||
|             if (!ModelState.IsValid) | ||||
|             { | ||||
|                 return BadRequest(ModelState); | ||||
|             } | ||||
|  | ||||
|             var video = await _context.Videos.SingleOrDefaultAsync(m => m.PrimaryKey == id); | ||||
|             if (video == null) | ||||
|             { | ||||
|                 return NotFound(); | ||||
|             } | ||||
|  | ||||
|             _context.Videos.Remove(video); | ||||
|             await _context.SaveChangesAsync(); | ||||
|  | ||||
|             return Ok(video); | ||||
|         } | ||||
|  | ||||
|         private bool VideoExists(long id) | ||||
|         { | ||||
|             return _context.Videos.Any(e => e.PrimaryKey == id); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -22,7 +22,7 @@ namespace YTManager.Controllers { | ||||
|             // Thumbnail URL. | ||||
|             public string Thumbnail; | ||||
|  | ||||
|             // Channel youtube ID. | ||||
|             // Channel on youtube that owns this video | ||||
|             public string Channel; | ||||
|  | ||||
|             // Populate this struct using a model video. | ||||
| @@ -31,7 +31,7 @@ namespace YTManager.Controllers { | ||||
|                 Description = video.Description; | ||||
|                 ID = video.YoutubeID; | ||||
|                 Thumbnail = video.ThumbnailURL; | ||||
|                 Channel = video.channel?.YoutubeID; | ||||
|                 Channel = video.Channel.Title; | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @@ -49,6 +49,7 @@ namespace YTManager.Controllers { | ||||
|         public async Task<IActionResult> GetVideos() { | ||||
|             // Get all the relevant videos. | ||||
|             var vids = await db.Videos | ||||
|                 .Include(v => v.Channel) | ||||
|                 .OrderByDescending(i => i.AddedtoDB) | ||||
|                 .Take(max_per_query) | ||||
|                 .ToListAsync(); | ||||
| @@ -63,12 +64,12 @@ namespace YTManager.Controllers { | ||||
|         } | ||||
|  | ||||
|         // Returns the most recent videos of a channel. | ||||
|         [HttpGet("fromchannel/{channelID}")] | ||||
|         public async Task<IActionResult> Get_Channel_Videos([FromRoute] string channelID) { | ||||
|         [HttpGet("fromchannel/{channelName}")] | ||||
|         public async Task<IActionResult> Get_Channel_Videos([FromRoute] string channelName) { | ||||
|             // Get all the relevant videos. | ||||
|             var vids = await db.Videos | ||||
|                 .Include(v => v.channel) | ||||
|                 .Where(v => v.channel.YoutubeID == channelID) | ||||
|                 .Include(v => v.Channel) | ||||
|                 .Where(v => v.Channel.Title == channelName) | ||||
|                 .OrderByDescending(i => i.AddedtoDB) | ||||
|                 .Take(max_per_query) | ||||
|                 .ToListAsync(); | ||||
|   | ||||
| @@ -1,25 +0,0 @@ | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace YTManager.Migrations | ||||
| { | ||||
|     public partial class added_refreshed : Migration | ||||
|     { | ||||
|         protected override void Up(MigrationBuilder migrationBuilder) | ||||
|         { | ||||
|             migrationBuilder.AddColumn<DateTime>( | ||||
|                 name: "Refreshed", | ||||
|                 table: "Channels", | ||||
|                 nullable: false, | ||||
|                 defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); | ||||
|         } | ||||
|  | ||||
|         protected override void Down(MigrationBuilder migrationBuilder) | ||||
|         { | ||||
|             migrationBuilder.DropColumn( | ||||
|                 name: "Refreshed", | ||||
|                 table: "Channels"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -11,8 +11,8 @@ using YTManager; | ||||
| namespace YTManager.Migrations | ||||
| { | ||||
|     [DbContext(typeof(MediaDB))] | ||||
|     [Migration("20180220053952_added_refreshed")] | ||||
|     partial class added_refreshed | ||||
|     [Migration("20180224051602_initial")] | ||||
|     partial class initial | ||||
|     { | ||||
|         protected override void BuildTargetModel(ModelBuilder modelBuilder) | ||||
|         { | ||||
| @@ -5,7 +5,7 @@ using System.Collections.Generic; | ||||
| 
 | ||||
| namespace YTManager.Migrations | ||||
| { | ||||
|     public partial class initiailmigration : Migration | ||||
|     public partial class initial : Migration | ||||
|     { | ||||
|         protected override void Up(MigrationBuilder migrationBuilder) | ||||
|         { | ||||
| @@ -17,6 +17,7 @@ namespace YTManager.Migrations | ||||
|                         .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.SerialColumn), | ||||
|                     AddedtoDB = table.Column<DateTime>(nullable: false), | ||||
|                     Description = table.Column<string>(nullable: false), | ||||
|                     Refreshed = table.Column<DateTime>(nullable: false), | ||||
|                     ThumbnailURL = table.Column<string>(nullable: false), | ||||
|                     Title = table.Column<string>(nullable: false), | ||||
|                     YoutubeID = table.Column<string>(nullable: false) | ||||
| @@ -11,8 +11,8 @@ using YTManager; | ||||
| namespace YTManager.Migrations | ||||
| { | ||||
|     [DbContext(typeof(MediaDB))] | ||||
|     [Migration("20180220032847_initiailmigration")] | ||||
|     partial class initiailmigration | ||||
|     [Migration("20180224055707_fix_channel_relationship")] | ||||
|     partial class fix_channel_relationship | ||||
|     { | ||||
|         protected override void BuildTargetModel(ModelBuilder modelBuilder) | ||||
|         { | ||||
| @@ -31,6 +31,8 @@ namespace YTManager.Migrations | ||||
|                     b.Property<string>("Description") | ||||
|                         .IsRequired(); | ||||
| 
 | ||||
|                     b.Property<DateTime>("Refreshed"); | ||||
| 
 | ||||
|                     b.Property<string>("ThumbnailURL") | ||||
|                         .IsRequired(); | ||||
| 
 | ||||
| @@ -53,8 +55,12 @@ namespace YTManager.Migrations | ||||
|                     b.Property<string>("Name") | ||||
|                         .IsRequired(); | ||||
| 
 | ||||
|                     b.Property<long?>("VideoPrimaryKey"); | ||||
| 
 | ||||
|                     b.HasKey("PrimaryKey"); | ||||
| 
 | ||||
|                     b.HasIndex("VideoPrimaryKey"); | ||||
| 
 | ||||
|                     b.ToTable("Tags"); | ||||
|                 }); | ||||
| 
 | ||||
| @@ -67,7 +73,7 @@ namespace YTManager.Migrations | ||||
| 
 | ||||
|                     b.Property<DateTime>("AddedtoDB"); | ||||
| 
 | ||||
|                     b.Property<long?>("ChannelPrimaryKey"); | ||||
|                     b.Property<long>("ChannelPrimaryKey"); | ||||
| 
 | ||||
|                     b.Property<string>("Description") | ||||
|                         .IsRequired(); | ||||
| @@ -88,11 +94,19 @@ namespace YTManager.Migrations | ||||
|                     b.ToTable("Videos"); | ||||
|                 }); | ||||
| 
 | ||||
|             modelBuilder.Entity("YTManager.Models.Tag", b => | ||||
|                 { | ||||
|                     b.HasOne("YTManager.Models.Video") | ||||
|                         .WithMany("Tags") | ||||
|                         .HasForeignKey("VideoPrimaryKey"); | ||||
|                 }); | ||||
| 
 | ||||
|             modelBuilder.Entity("YTManager.Models.Video", b => | ||||
|                 { | ||||
|                     b.HasOne("YTManager.Models.Channel") | ||||
|                     b.HasOne("YTManager.Models.Channel", "Channel") | ||||
|                         .WithMany("Videos") | ||||
|                         .HasForeignKey("ChannelPrimaryKey"); | ||||
|                         .HasForeignKey("ChannelPrimaryKey") | ||||
|                         .OnDelete(DeleteBehavior.Cascade); | ||||
|                 }); | ||||
| #pragma warning restore 612, 618 | ||||
|         } | ||||
| @@ -0,0 +1,82 @@ | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace YTManager.Migrations | ||||
| { | ||||
|     public partial class fix_channel_relationship : Migration | ||||
|     { | ||||
|         protected override void Up(MigrationBuilder migrationBuilder) | ||||
|         { | ||||
|             migrationBuilder.DropForeignKey( | ||||
|                 name: "FK_Videos_Channels_ChannelPrimaryKey", | ||||
|                 table: "Videos"); | ||||
|  | ||||
|             migrationBuilder.AlterColumn<long>( | ||||
|                 name: "ChannelPrimaryKey", | ||||
|                 table: "Videos", | ||||
|                 nullable: false, | ||||
|                 oldClrType: typeof(long), | ||||
|                 oldNullable: true); | ||||
|  | ||||
|             migrationBuilder.AddColumn<long>( | ||||
|                 name: "VideoPrimaryKey", | ||||
|                 table: "Tags", | ||||
|                 nullable: true); | ||||
|  | ||||
|             migrationBuilder.CreateIndex( | ||||
|                 name: "IX_Tags_VideoPrimaryKey", | ||||
|                 table: "Tags", | ||||
|                 column: "VideoPrimaryKey"); | ||||
|  | ||||
|             migrationBuilder.AddForeignKey( | ||||
|                 name: "FK_Tags_Videos_VideoPrimaryKey", | ||||
|                 table: "Tags", | ||||
|                 column: "VideoPrimaryKey", | ||||
|                 principalTable: "Videos", | ||||
|                 principalColumn: "PrimaryKey", | ||||
|                 onDelete: ReferentialAction.Restrict); | ||||
|  | ||||
|             migrationBuilder.AddForeignKey( | ||||
|                 name: "FK_Videos_Channels_ChannelPrimaryKey", | ||||
|                 table: "Videos", | ||||
|                 column: "ChannelPrimaryKey", | ||||
|                 principalTable: "Channels", | ||||
|                 principalColumn: "PrimaryKey", | ||||
|                 onDelete: ReferentialAction.Cascade); | ||||
|         } | ||||
|  | ||||
|         protected override void Down(MigrationBuilder migrationBuilder) | ||||
|         { | ||||
|             migrationBuilder.DropForeignKey( | ||||
|                 name: "FK_Tags_Videos_VideoPrimaryKey", | ||||
|                 table: "Tags"); | ||||
|  | ||||
|             migrationBuilder.DropForeignKey( | ||||
|                 name: "FK_Videos_Channels_ChannelPrimaryKey", | ||||
|                 table: "Videos"); | ||||
|  | ||||
|             migrationBuilder.DropIndex( | ||||
|                 name: "IX_Tags_VideoPrimaryKey", | ||||
|                 table: "Tags"); | ||||
|  | ||||
|             migrationBuilder.DropColumn( | ||||
|                 name: "VideoPrimaryKey", | ||||
|                 table: "Tags"); | ||||
|  | ||||
|             migrationBuilder.AlterColumn<long>( | ||||
|                 name: "ChannelPrimaryKey", | ||||
|                 table: "Videos", | ||||
|                 nullable: true, | ||||
|                 oldClrType: typeof(long)); | ||||
|  | ||||
|             migrationBuilder.AddForeignKey( | ||||
|                 name: "FK_Videos_Channels_ChannelPrimaryKey", | ||||
|                 table: "Videos", | ||||
|                 column: "ChannelPrimaryKey", | ||||
|                 principalTable: "Channels", | ||||
|                 principalColumn: "PrimaryKey", | ||||
|                 onDelete: ReferentialAction.Restrict); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -54,8 +54,12 @@ namespace YTManager.Migrations | ||||
|                     b.Property<string>("Name") | ||||
|                         .IsRequired(); | ||||
|  | ||||
|                     b.Property<long?>("VideoPrimaryKey"); | ||||
|  | ||||
|                     b.HasKey("PrimaryKey"); | ||||
|  | ||||
|                     b.HasIndex("VideoPrimaryKey"); | ||||
|  | ||||
|                     b.ToTable("Tags"); | ||||
|                 }); | ||||
|  | ||||
| @@ -68,7 +72,7 @@ namespace YTManager.Migrations | ||||
|  | ||||
|                     b.Property<DateTime>("AddedtoDB"); | ||||
|  | ||||
|                     b.Property<long?>("ChannelPrimaryKey"); | ||||
|                     b.Property<long>("ChannelPrimaryKey"); | ||||
|  | ||||
|                     b.Property<string>("Description") | ||||
|                         .IsRequired(); | ||||
| @@ -89,11 +93,19 @@ namespace YTManager.Migrations | ||||
|                     b.ToTable("Videos"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("YTManager.Models.Tag", b => | ||||
|                 { | ||||
|                     b.HasOne("YTManager.Models.Video") | ||||
|                         .WithMany("Tags") | ||||
|                         .HasForeignKey("VideoPrimaryKey"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("YTManager.Models.Video", b => | ||||
|                 { | ||||
|                     b.HasOne("YTManager.Models.Channel") | ||||
|                     b.HasOne("YTManager.Models.Channel", "Channel") | ||||
|                         .WithMany("Videos") | ||||
|                         .HasForeignKey("ChannelPrimaryKey"); | ||||
|                         .HasForeignKey("ChannelPrimaryKey") | ||||
|                         .OnDelete(DeleteBehavior.Cascade); | ||||
|                 }); | ||||
| #pragma warning restore 612, 618 | ||||
|         } | ||||
|   | ||||
| @@ -34,10 +34,10 @@ namespace YTManager.Models { | ||||
|  | ||||
|         // What channel this video comes from. | ||||
|         [Required] | ||||
|         public Channel channel; | ||||
|         public Channel Channel { get; set; } | ||||
|  | ||||
|         // Tag this video applies to. | ||||
|         [Required] | ||||
|         public List<Tag> Tags; | ||||
|         public List<Tag> Tags { get; set; } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -59,7 +59,8 @@ namespace YTManager.Tasks { | ||||
|                 ThumbnailURL = response.Items.First().Snippet.Thumbnails.Medium.Url, | ||||
|                 YoutubeID = channelID, | ||||
|                 AddedtoDB = DateTime.Now, | ||||
|                 Refreshed = DateTime.MinValue | ||||
|                 Refreshed = DateTime.MinValue, | ||||
|                 Videos = null | ||||
|             }; | ||||
|         } | ||||
|  | ||||
| @@ -70,7 +71,7 @@ namespace YTManager.Tasks { | ||||
|             ops.UseNpgsql(dbstr); | ||||
|  | ||||
|             // Get all the channels from the db that expired. | ||||
|             var threshold = DateTime.Now.Subtract(TimeSpan.FromSeconds(100)); | ||||
|             var threshold = DateTime.Now.Subtract(TimeSpan.FromMinutes(60)); | ||||
|             var channel_ids = await  | ||||
|                 (new MediaDB(ops.Options)).Channels | ||||
|                 .Where(ch => ch.Refreshed < threshold) | ||||
| @@ -104,7 +105,7 @@ namespace YTManager.Tasks { | ||||
|  | ||||
|                 // Say what channel all the videos came from. | ||||
|                 foreach (var v in newvids) | ||||
|                     v.channel = channel; | ||||
|                     v.Channel = channel; | ||||
|  | ||||
|                 // Say the channel has been refreshed. | ||||
|                 channel.Refreshed = DateTime.Now; | ||||
|   | ||||
							
								
								
									
										64
									
								
								YTManager/wwwroot/Admin/index.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								YTManager/wwwroot/Admin/index.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | ||||
| body { | ||||
|     margin-left: 5%; | ||||
|     margin-right: 5%; | ||||
|     line-height: 1.6; | ||||
|     font-size: 18px; | ||||
|     color: #003636; | ||||
|     background-color: #F8F8F8; | ||||
|     max-width: 1280px; | ||||
|     margin: auto; | ||||
| } | ||||
|  | ||||
| .pageheader { | ||||
|     max-width: 960px; | ||||
|     margin: auto; | ||||
| } | ||||
|  | ||||
| .error { | ||||
|     background-color: red; | ||||
| } | ||||
|  | ||||
| .curvedbottom { | ||||
|     border-bottom-left-radius: 10px; | ||||
|     border-bottom-right-radius: 10px; | ||||
| } | ||||
|  | ||||
| #addnewchannelform { | ||||
|     width: inherit; | ||||
|     margin: auto; | ||||
| } | ||||
|  | ||||
| .tinytext10px{ font-size: 10px; } | ||||
| .tinytext12px{ font-size: 12px; } | ||||
| .tinytext14px{ font-size: 14px; } | ||||
| .tinytext16px{ font-size: 16px; } | ||||
| .tinytext18px{ font-size: 18px; } | ||||
|  | ||||
| [v-cloak] { | ||||
|     display: none; | ||||
| } | ||||
|  | ||||
| .fade-enter-active, .fade-leave-active { | ||||
|     transition: opacity 0.75s; | ||||
| } | ||||
|  | ||||
| .fade-enter, .fade-leave-to { | ||||
|     opacity: 0; | ||||
| } | ||||
|  | ||||
| .apistatusicon { | ||||
|     animation-duration: 1s; | ||||
|     animation-name: spinny; | ||||
|     animation-iteration-count: infinite; | ||||
|     animation-direction: alternate; | ||||
| } | ||||
|  | ||||
| @keyframes spinny { | ||||
|     from { | ||||
|         transform: rotate(-15deg); | ||||
|     } | ||||
|  | ||||
|     to { | ||||
|         transform: rotate(15deg); | ||||
|     } | ||||
| } | ||||
| @@ -39,6 +39,6 @@ | ||||
|     <script src="https://unpkg.com/vue"></script> | ||||
| 
 | ||||
|     <!-- All of my custom JS. Put here so body loads before Vue based stuff loads/attempts to bind. --> | ||||
|     <script src="admin.js"></script> | ||||
|     <script src="index.js"></script> | ||||
| </body> | ||||
| </html> | ||||
| @@ -59,7 +59,7 @@ var addchanel0 = new Vue({ | ||||
|         submit: function (event) { | ||||
|             // Send the channel to our API and request tables be updated.
 | ||||
|             var d = this.entry; | ||||
|             axios.post('/api/Channels/' + this.entry.yTChannelID) | ||||
|             axios.post('/api_raw/Channels/' + this.entry.yTChannelID) | ||||
|                 .then(function (response) { | ||||
|                     this.entry.title = ""; | ||||
|                     this.entry.description = ""; | ||||
| @@ -229,9 +229,9 @@ var videostb = new Vue({ | ||||
|             </thead> | ||||
|             <tbody> | ||||
|                 <tr v-cloak v-for="video in Videos"> | ||||
|                     <td class="tinytext12px">{{video.id}}</td> | ||||
|                     <td class="tinytext12px">{{video.title}}</td> | ||||
|                     <td class="tinytext12px">{{video.description}}</td> | ||||
|                     <td class="tinytext12px">{{video.id}}</td> | ||||
|                     <td class="tinytext12px">{{video.channel}}</td> | ||||
|                 </tr> | ||||
|             </tbody> | ||||
| @@ -14,20 +14,11 @@ | ||||
|     margin: auto; | ||||
| } | ||||
|  | ||||
| .error { | ||||
|     background-color: red; | ||||
| } | ||||
|  | ||||
| .curvedbottom { | ||||
|     border-bottom-left-radius: 10px; | ||||
|     border-bottom-right-radius: 10px; | ||||
| } | ||||
|  | ||||
| #addnewchannelform { | ||||
|     width: inherit; | ||||
|     margin: auto; | ||||
| } | ||||
|  | ||||
| .tinytext10px{ font-size: 10px; } | ||||
| .tinytext12px{ font-size: 12px; } | ||||
| .tinytext14px{ font-size: 14px; } | ||||
| @@ -45,20 +36,3 @@ | ||||
| .fade-enter, .fade-leave-to { | ||||
|     opacity: 0; | ||||
| } | ||||
|  | ||||
| .apistatusicon { | ||||
|     animation-duration: 1s; | ||||
|     animation-name: spinny; | ||||
|     animation-iteration-count: infinite; | ||||
|     animation-direction: alternate; | ||||
| } | ||||
|  | ||||
| @keyframes spinny { | ||||
|     from { | ||||
|         transform: rotate(-15deg); | ||||
|     } | ||||
|  | ||||
|     to { | ||||
|         transform: rotate(15deg); | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user