Media.java
package com.university.bookstore.model;
/**
* Interface for materials with multimedia content.
* Demonstrates interface segregation principle and multiple inheritance through interfaces.
*
* <p>This interface defines behavior for audio and video materials,
* including duration, format, and playback capabilities.</p>
*
* @author Navid Mohaghegh
* @version 2.0
* @since 2024-09-15
*/
public interface Media {
/**
* Gets the duration of the media in minutes.
*
* @return duration in minutes
*/
int getDuration();
/**
* Gets the file format of the media.
*
* @return format string (e.g., "MP3", "MP4", "WAV")
*/
String getFormat();
/**
* Gets the file size in megabytes.
*
* @return size in MB
*/
double getFileSize();
/**
* Checks if the media requires an internet connection.
*
* @return true if streaming required, false if downloadable
*/
boolean isStreamingOnly();
/**
* Gets the quality setting for the media.
*
* @return quality descriptor
*/
MediaQuality getQuality();
/**
* Gets playback information as a formatted string.
*
* @return playback details
*/
default String getPlaybackInfo() {
return String.format("Duration: %d min, Format: %s, Quality: %s, Size: %.1f MB",
getDuration(), getFormat(), getQuality(), getFileSize());
}
/**
* Calculates estimated download time based on connection speed.
*
* @param mbps download speed in megabits per second
* @return estimated time in seconds
*/
default int estimateDownloadTime(double mbps) {
if (isStreamingOnly()) {
return 0;
}
double megabits = getFileSize() * 8;
return (int) Math.ceil(megabits / mbps);
}
/**
* Quality levels for media content.
*/
enum MediaQuality {
LOW("Low Quality", 64),
MEDIUM("Medium Quality", 96),
STANDARD("Standard Quality", 128),
HIGH("High Quality", 256),
HD("HD Quality", 320),
ULTRA_HD("Ultra HD", 512),
PHYSICAL("Physical Media", 0);
private final String description;
private final int bitrate;
MediaQuality(String description, int bitrate) {
this.description = description;
this.bitrate = bitrate;
}
public String getDescription() {
return description;
}
public int getBitrate() {
return bitrate;
}
@Override
public String toString() {
return description;
}
}
}