001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.apache.juneau.bean.html5; 018 019import java.net.*; 020 021import org.apache.juneau.*; 022import org.apache.juneau.annotation.*; 023import org.apache.juneau.internal.*; 024 025/** 026 * DTO for an HTML <a class="doclink" href="https://www.w3.org/TR/html5/embedded-content-0.html#the-track-element"><track></a> 027 * element. 028 * 029 * <p> 030 * The track element is used to specify timed text tracks for media elements (audio and video). 031 * It allows you to add subtitles, captions, descriptions, chapters, or metadata to media content, 032 * making it more accessible and user-friendly. 033 * 034 * <h5 class='section'>Examples:</h5> 035 * <p class='bcode w800'> 036 * <jc>// Subtitles track</jc> 037 * Track <jv>subtitles</jv> = <jsm>track</jsm>() 038 * .kind(<js>"subtitles"</js>) 039 * .src(<js>"/media/subtitles-en.vtt"</js>) 040 * .srclang(<js>"en"</js>) 041 * .label(<js>"English"</js>); 042 * 043 * <jc>// Captions track (for deaf/hard of hearing)</jc> 044 * Track <jv>captions</jv> = <jsm>track</jsm>() 045 * .kind(<js>"captions"</js>) 046 * .src(<js>"/media/captions-en.vtt"</js>) 047 * .srclang(<js>"en"</js>) 048 * .label(<js>"English Captions"</js>) 049 * ._default(<jk>true</jk>); 050 * 051 * <jc>// Descriptions track (for audio descriptions)</jc> 052 * Track <jv>descriptions</jv> = <jsm>track</jsm>() 053 * .kind(<js>"descriptions"</js>) 054 * .src(<js>"/media/descriptions-en.vtt"</js>) 055 * .srclang(<js>"en"</js>) 056 * .label(<js>"English Descriptions"</js>); 057 * 058 * <jc>// Chapters track</jc> 059 * Track <jv>chapters</jv> = <jsm>track</jsm>() 060 * .kind(<js>"chapters"</js>) 061 * .src(<js>"/media/chapters.vtt"</js>) 062 * .srclang(<js>"en"</js>) 063 * .label(<js>"Chapters"</js>); 064 * 065 * <jc>// Video with multiple tracks</jc> 066 * Video <jv>video</jv> = <jsm>video</jsm>() 067 * .src(<js>"/media/movie.mp4"</js>) 068 * .controls(<jk>true</jk>) 069 * .children( 070 * <jsm>track</jsm>(<js>"/media/subtitles-en.vtt"</js>, <js>"subtitles"</js>).srclang(<js>"en"</js>).label(<js>"English"</js>)._default(<jk>true</jk>), 071 * <jsm>track</jsm>(<js>"/media/subtitles-es.vtt"</js>, <js>"subtitles"</js>).srclang(<js>"es"</js>).label(<js>"Español"</js>), 072 * <jsm>track</jsm>(<js>"/media/subtitles-fr.vtt"</js>, <js>"subtitles"</js>).srclang(<js>"fr"</js>).label(<js>"Français"</js>) 073 * ); 074 * </p> 075 * 076 * <p> 077 * The following convenience methods are provided for constructing instances of this bean: 078 * <ul class='javatree'> 079 * <li class='jc'>{@link HtmlBuilder} 080 * <ul class='javatree'> 081 * <li class='jm'>{@link HtmlBuilder#track() track()} 082 * </ul> 083 * </ul> 084 * </p> 085 * 086 * <h5 class='section'>See Also:</h5><ul> 087 * <li class='link'><a class="doclink" href="https://juneau.apache.org/docs/topics/JuneauBeanHtml5">juneau-bean-html5</a> 088 * </ul> 089 */ 090@Bean(typeName="track") 091public class Track extends HtmlElementVoid { 092 093 /** 094 * Creates an empty {@link Track} element. 095 */ 096 public Track() {} 097 098 /** 099 * Creates a {@link Track} element with the specified {@link Track#src(Object)} and {@link Track#kind(String)} 100 * attributes. 101 * 102 * @param src The {@link Track#src(Object)} attribute. 103 * @param kind The {@link Track#kind(String)} attribute. 104 */ 105 public Track(Object src, String kind) { 106 src(src).kind(kind); 107 } 108 109 /** 110 * <a class="doclink" href="https://www.w3.org/TR/html5/embedded-content-0.html#attr-track-default">default</a> 111 * attribute. 112 * 113 * <p> 114 * Specifies that this track should be enabled by default if no other text track is more suitable. 115 * This is useful for providing fallback captions or subtitles. 116 * 117 * <p> 118 * This attribute uses deminimized values: 119 * <ul> 120 * <li><jk>false</jk> - Track is not enabled by default (default)</li> 121 * <li><jk>true</jk> - Track is enabled by default</li> 122 * <li>Other values - Passed through as-is</li> 123 * </ul> 124 * 125 * @param _default Whether this track should be enabled by default. 126 * @return This object. 127 */ 128 public Track _default(String value) { // NOSONAR - Intentional naming. 129 attr("default", value); 130 return this; 131 } 132 133 /** 134 * <a class="doclink" href="https://www.w3.org/TR/html5/embedded-content-0.html#attr-track-kind">kind</a> attribute. 135 * 136 * <p> 137 * Specifies the type of text track. This determines how the track is used by the media element. 138 * 139 * <p> 140 * Possible values: 141 * <ul> 142 * <li><js>"subtitles"</js> - Subtitles for the deaf and hard-of-hearing</li> 143 * <li><js>"captions"</js> - Captions for the deaf and hard-of-hearing</li> 144 * <li><js>"descriptions"</js> - Text descriptions of the video content</li> 145 * <li><js>"chapters"</js> - Chapter titles for navigation</li> 146 * <li><js>"metadata"</js> - Metadata for the media</li> 147 * </ul> 148 * 149 * @param kind The type of text track. 150 * @return This object. 151 */ 152 public Track kind(String value) { 153 attr("kind", value); 154 return this; 155 } 156 157 /** 158 * <a class="doclink" href="https://www.w3.org/TR/html5/embedded-content-0.html#attr-track-label">label</a> attribute. 159 * 160 * <p> 161 * Specifies a user-visible label for the text track. This label is displayed in the media 162 * player's track selection menu. 163 * 164 * <p> 165 * The label should be descriptive and help users identify the track (e.g., "English Subtitles", 166 * "Spanish Captions"). 167 * 168 * @param label The user-visible label for the text track. 169 * @return This object. 170 */ 171 public Track label(String value) { 172 attr("label", value); 173 return this; 174 } 175 176 /** 177 * <a class="doclink" href="https://www.w3.org/TR/html5/embedded-content-0.html#attr-track-src">src</a> attribute. 178 * 179 * <p> 180 * Address of the resource. 181 * 182 * <p> 183 * The value can be of any of the following types: {@link URI}, {@link URL}, {@link String}. 184 * Strings must be valid URIs. 185 * 186 * <p> 187 * URIs defined by {@link UriResolver} can be used for values. 188 * 189 * @param src 190 * The new value for this attribute. 191 * Typically a {@link URL} or {@link String}. 192 * @return This object. 193 */ 194 public Track src(Object value) { 195 attrUri("src", value); 196 return this; 197 } 198 199 /** 200 * <a class="doclink" href="https://www.w3.org/TR/html5/embedded-content-0.html#attr-track-srclang">srclang</a> 201 * attribute. 202 * 203 * <p> 204 * Specifies the language of the text track. This helps browsers and media players 205 * determine which track to use based on the user's language preferences. 206 * 207 * <p> 208 * The value should be a valid language code (e.g., "en", "es", "fr", "de"). 209 * 210 * @param srclang The language code of the text track. 211 * @return This object. 212 */ 213 public Track srclang(String value) { 214 attr("srclang", value); 215 return this; 216 } 217 218 //----------------------------------------------------------------------------------------------------------------- 219 // Overridden methods 220 //----------------------------------------------------------------------------------------------------------------- 221 @Override /* Overridden from HtmlElement */ 222 public Track _class(String value) { // NOSONAR - Intentional naming. 223 super._class(value); 224 return this; 225 } 226 227 @Override /* Overridden from HtmlElement */ 228 public Track accesskey(String value) { 229 super.accesskey(value); 230 return this; 231 } 232 233 @Override /* Overridden from HtmlElement */ 234 public Track contenteditable(Object value) { 235 super.contenteditable(value); 236 return this; 237 } 238 239 @Override /* Overridden from HtmlElement */ 240 public Track dir(String value) { 241 super.dir(value); 242 return this; 243 } 244 245 @Override /* Overridden from HtmlElement */ 246 public Track hidden(Object value) { 247 super.hidden(value); 248 return this; 249 } 250 251 @Override /* Overridden from HtmlElement */ 252 public Track id(String value) { 253 super.id(value); 254 return this; 255 } 256 257 @Override /* Overridden from HtmlElement */ 258 public Track lang(String value) { 259 super.lang(value); 260 return this; 261 } 262 263 @Override /* Overridden from HtmlElement */ 264 public Track onabort(String value) { 265 super.onabort(value); 266 return this; 267 } 268 269 @Override /* Overridden from HtmlElement */ 270 public Track onblur(String value) { 271 super.onblur(value); 272 return this; 273 } 274 275 @Override /* Overridden from HtmlElement */ 276 public Track oncancel(String value) { 277 super.oncancel(value); 278 return this; 279 } 280 281 @Override /* Overridden from HtmlElement */ 282 public Track oncanplay(String value) { 283 super.oncanplay(value); 284 return this; 285 } 286 287 @Override /* Overridden from HtmlElement */ 288 public Track oncanplaythrough(String value) { 289 super.oncanplaythrough(value); 290 return this; 291 } 292 293 @Override /* Overridden from HtmlElement */ 294 public Track onchange(String value) { 295 super.onchange(value); 296 return this; 297 } 298 299 @Override /* Overridden from HtmlElement */ 300 public Track onclick(String value) { 301 super.onclick(value); 302 return this; 303 } 304 305 @Override /* Overridden from HtmlElement */ 306 public Track oncuechange(String value) { 307 super.oncuechange(value); 308 return this; 309 } 310 311 @Override /* Overridden from HtmlElement */ 312 public Track ondblclick(String value) { 313 super.ondblclick(value); 314 return this; 315 } 316 317 @Override /* Overridden from HtmlElement */ 318 public Track ondurationchange(String value) { 319 super.ondurationchange(value); 320 return this; 321 } 322 323 @Override /* Overridden from HtmlElement */ 324 public Track onemptied(String value) { 325 super.onemptied(value); 326 return this; 327 } 328 329 @Override /* Overridden from HtmlElement */ 330 public Track onended(String value) { 331 super.onended(value); 332 return this; 333 } 334 335 @Override /* Overridden from HtmlElement */ 336 public Track onerror(String value) { 337 super.onerror(value); 338 return this; 339 } 340 341 @Override /* Overridden from HtmlElement */ 342 public Track onfocus(String value) { 343 super.onfocus(value); 344 return this; 345 } 346 347 @Override /* Overridden from HtmlElement */ 348 public Track oninput(String value) { 349 super.oninput(value); 350 return this; 351 } 352 353 @Override /* Overridden from HtmlElement */ 354 public Track oninvalid(String value) { 355 super.oninvalid(value); 356 return this; 357 } 358 359 @Override /* Overridden from HtmlElement */ 360 public Track onkeydown(String value) { 361 super.onkeydown(value); 362 return this; 363 } 364 365 @Override /* Overridden from HtmlElement */ 366 public Track onkeypress(String value) { 367 super.onkeypress(value); 368 return this; 369 } 370 371 @Override /* Overridden from HtmlElement */ 372 public Track onkeyup(String value) { 373 super.onkeyup(value); 374 return this; 375 } 376 377 @Override /* Overridden from HtmlElement */ 378 public Track onload(String value) { 379 super.onload(value); 380 return this; 381 } 382 383 @Override /* Overridden from HtmlElement */ 384 public Track onloadeddata(String value) { 385 super.onloadeddata(value); 386 return this; 387 } 388 389 @Override /* Overridden from HtmlElement */ 390 public Track onloadedmetadata(String value) { 391 super.onloadedmetadata(value); 392 return this; 393 } 394 395 @Override /* Overridden from HtmlElement */ 396 public Track onloadstart(String value) { 397 super.onloadstart(value); 398 return this; 399 } 400 401 @Override /* Overridden from HtmlElement */ 402 public Track onmousedown(String value) { 403 super.onmousedown(value); 404 return this; 405 } 406 407 @Override /* Overridden from HtmlElement */ 408 public Track onmouseenter(String value) { 409 super.onmouseenter(value); 410 return this; 411 } 412 413 @Override /* Overridden from HtmlElement */ 414 public Track onmouseleave(String value) { 415 super.onmouseleave(value); 416 return this; 417 } 418 419 @Override /* Overridden from HtmlElement */ 420 public Track onmousemove(String value) { 421 super.onmousemove(value); 422 return this; 423 } 424 425 @Override /* Overridden from HtmlElement */ 426 public Track onmouseout(String value) { 427 super.onmouseout(value); 428 return this; 429 } 430 431 @Override /* Overridden from HtmlElement */ 432 public Track onmouseover(String value) { 433 super.onmouseover(value); 434 return this; 435 } 436 437 @Override /* Overridden from HtmlElement */ 438 public Track onmouseup(String value) { 439 super.onmouseup(value); 440 return this; 441 } 442 443 @Override /* Overridden from HtmlElement */ 444 public Track onmousewheel(String value) { 445 super.onmousewheel(value); 446 return this; 447 } 448 449 @Override /* Overridden from HtmlElement */ 450 public Track onpause(String value) { 451 super.onpause(value); 452 return this; 453 } 454 455 @Override /* Overridden from HtmlElement */ 456 public Track onplay(String value) { 457 super.onplay(value); 458 return this; 459 } 460 461 @Override /* Overridden from HtmlElement */ 462 public Track onplaying(String value) { 463 super.onplaying(value); 464 return this; 465 } 466 467 @Override /* Overridden from HtmlElement */ 468 public Track onprogress(String value) { 469 super.onprogress(value); 470 return this; 471 } 472 473 @Override /* Overridden from HtmlElement */ 474 public Track onratechange(String value) { 475 super.onratechange(value); 476 return this; 477 } 478 479 @Override /* Overridden from HtmlElement */ 480 public Track onreset(String value) { 481 super.onreset(value); 482 return this; 483 } 484 485 @Override /* Overridden from HtmlElement */ 486 public Track onresize(String value) { 487 super.onresize(value); 488 return this; 489 } 490 491 @Override /* Overridden from HtmlElement */ 492 public Track onscroll(String value) { 493 super.onscroll(value); 494 return this; 495 } 496 497 @Override /* Overridden from HtmlElement */ 498 public Track onseeked(String value) { 499 super.onseeked(value); 500 return this; 501 } 502 503 @Override /* Overridden from HtmlElement */ 504 public Track onseeking(String value) { 505 super.onseeking(value); 506 return this; 507 } 508 509 @Override /* Overridden from HtmlElement */ 510 public Track onselect(String value) { 511 super.onselect(value); 512 return this; 513 } 514 515 @Override /* Overridden from HtmlElement */ 516 public Track onshow(String value) { 517 super.onshow(value); 518 return this; 519 } 520 521 @Override /* Overridden from HtmlElement */ 522 public Track onstalled(String value) { 523 super.onstalled(value); 524 return this; 525 } 526 527 @Override /* Overridden from HtmlElement */ 528 public Track onsubmit(String value) { 529 super.onsubmit(value); 530 return this; 531 } 532 533 @Override /* Overridden from HtmlElement */ 534 public Track onsuspend(String value) { 535 super.onsuspend(value); 536 return this; 537 } 538 539 @Override /* Overridden from HtmlElement */ 540 public Track ontimeupdate(String value) { 541 super.ontimeupdate(value); 542 return this; 543 } 544 545 @Override /* Overridden from HtmlElement */ 546 public Track ontoggle(String value) { 547 super.ontoggle(value); 548 return this; 549 } 550 551 @Override /* Overridden from HtmlElement */ 552 public Track onvolumechange(String value) { 553 super.onvolumechange(value); 554 return this; 555 } 556 557 @Override /* Overridden from HtmlElement */ 558 public Track onwaiting(String value) { 559 super.onwaiting(value); 560 return this; 561 } 562 563 @Override /* Overridden from HtmlElement */ 564 public Track spellcheck(Object value) { 565 super.spellcheck(value); 566 return this; 567 } 568 569 @Override /* Overridden from HtmlElement */ 570 public Track style(String value) { 571 super.style(value); 572 return this; 573 } 574 575 @Override /* Overridden from HtmlElement */ 576 public Track tabindex(Object value) { 577 super.tabindex(value); 578 return this; 579 } 580 581 @Override /* Overridden from HtmlElement */ 582 public Track title(String value) { 583 super.title(value); 584 return this; 585 } 586 587 @Override /* Overridden from HtmlElement */ 588 public Track translate(Object value) { 589 super.translate(value); 590 return this; 591 } 592}