@@ -368,7 +368,7 @@ public void testTags() {}
368368 }
369369
370370 public static class PublicBroadcasterTest extends DefaultStreamExtractorTest
371- implements InitYoutubeTest {
371+ implements InitYoutubeTest {
372372 private static final String ID = "cJ9to6EmElQ" ;
373373 private static final int TIMESTAMP = 0 ;
374374 private static final String URL = BASE_URL + ID ;
@@ -400,10 +400,8 @@ protected StreamExtractor createExtractor() throws Exception {
400400 @ Override public List <MetaInfo > expectedMetaInfo () throws MalformedURLException {
401401 return Collections .singletonList (new MetaInfo (
402402 "" ,
403- new Description ("Arte is a French/German public broadcast service." ,
404- Description .PLAIN_TEXT ),
405- List .of (new URL (
406- "https://en.wikipedia.org/wiki/Arte?wprov=yicw1" )),
403+ new Description ("Arte is a French/German public broadcast service." , Description .PLAIN_TEXT ),
404+ List .of (new URL ("https://en.wikipedia.org/wiki/Arte?wprov=yicw1" )),
407405 List .of ("Wikipedia" )
408406 ));
409407 }
@@ -417,6 +415,59 @@ protected StreamExtractor createExtractor() throws Exception {
417415 // @formatter:on
418416 }
419417
418+ public static class LicensedDoctorTest extends DefaultStreamExtractorTest
419+ implements InitYoutubeTest {
420+ private static final String ID = "rCAS2eD-mcw" ;
421+ private static final int TIMESTAMP = 0 ;
422+ private static final String URL = BASE_URL + ID ;
423+
424+ @ Override
425+ protected StreamExtractor createExtractor () throws Exception {
426+ return YouTube .getStreamExtractor (URL );
427+ }
428+
429+ // @formatter:off
430+ @ Override public StreamingService expectedService () { return YouTube ; }
431+ @ Override public String expectedName () { return "Laryngeal Mask Airway (LMA) insertion | ESSENTIAL TECHNIQUES for standard patients" ; }
432+ @ Override public String expectedId () { return ID ; }
433+ @ Override public String expectedUrlContains () { return BASE_URL + ID ; }
434+ @ Override public String expectedOriginalUrlContains () { return URL ; }
435+
436+ @ Override public StreamType expectedStreamType () { return StreamType .VIDEO_STREAM ; }
437+ @ Override public String expectedUploaderName () { return "ABCs of Anaesthesia" ; }
438+ @ Override public String expectedUploaderUrl () { return "https://www.youtube.com/channel/UCs1fy2n5Ey0c9VZRBL7UCsg" ; }
439+ @ Override public long expectedUploaderSubscriberCountAtLeast () { return 200_000 ; }
440+ @ Override public List <String > expectedDescriptionContains () { return Arrays .asList ("https://www.facebook.com/groups/2082807131964430" , "LMA" ); }
441+ @ Override public long expectedLength () { return 343 ; }
442+ @ Override public long expectedTimestamp () { return TIMESTAMP ; }
443+ @ Override public long expectedViewCountAtLeast () { return 60_000 ; }
444+ @ Nullable @ Override public String expectedUploadDate () { return "2022-07-03 11:00:25.000" ; }
445+ @ Nullable @ Override public String expectedTextualUploadDate () { return "2022-07-03T04:00:25-07:00" ; }
446+ @ Override public long expectedLikeCountAtLeast () { return 800 ; }
447+ @ Override public long expectedDislikeCountAtLeast () { return -1 ; }
448+ @ Override public List <MetaInfo > expectedMetaInfo () throws MalformedURLException {
449+ return Collections .singletonList (new MetaInfo (
450+ "" ,
451+ new Description ("From a licensed doctor in Australia" , Description .PLAIN_TEXT ),
452+ List .of (new URL ("https://support.google.com/youtube/answer/9795167" )),
453+ List .of ("Learn more about how experts define health sources" )
454+ ));
455+ }
456+ @ Override public boolean expectedUploaderVerified () { return true ; }
457+ @ Override public String expectedLicence () { return YOUTUBE_LICENCE ; }
458+ @ Override public String expectedCategory () { return "Education" ; }
459+ @ Override public List <String > expectedTags () {
460+ return Arrays .asList ("ANZCA" , "Anaesthesia" , "FANZCA" , "LMA" , "Vortex" , "abcs of anaesthesia" ,
461+ "airway" , "anaesthesiology" , "anaesthetics" , "anaesthetist" , "anesthesia" , "anesthesiologist" ,
462+ "anesthesiology" , "anesthetics" , "anesthetist" , "bag" , "basics" , "cannula insertion technique" ,
463+ "cannulation procedure" , "cannulation tips and tricks" , "cico" , "classic" , "cuff" , "das" ,
464+ "difficult airway" , "igel" , "intravenous cannula insertion" , "intubation" , "laryngeal" , "mask" ,
465+ "medical" , "medicine" , "nurse" , "oxygenation" , "procedure" , "proseal" , "student" , "supreme" ,
466+ "technique" , "tips" , "venepuncture" , "ventilation" );
467+ }
468+ // @formatter:on
469+ }
470+
420471 public static class NoVisualMetadataVideoTest extends DefaultStreamExtractorTest
421472 implements InitYoutubeTest {
422473 // Video without visual metadata on YouTube clients (video title, upload date, channel name,
0 commit comments