این روزها در شرکت، هر وقت کلمه‌ی «هدفون» گفته می‌شد، همه یک نفر را به یاد می‌آوردند؛ اون کسی نبود جز فرانتیوم. فرانتیوم تنها زمانی که مجبور بود در جلسه‌ای شرکت کند، هدفونش را از روی سر برمی‌داشت. حالا که آکاردئون داشت و بیش از هر زمان دیگری در دنیای موسیقی غرق بود، یک روز هنگام مرور آهنگ‌هایش، سوال بسیار مهمی در ذهنش شکل گرفت: چرا تا الآن یک موزیک پلیر برای خودم نساخته‌ام؟

مثل همیشه، فکر کردن به دنیای فرانت باعث شد ایده‌ی پروژه‌ی جدیدی به ذهن فرانتیوم برسد: ساخت یک موزیک پلیر.

توضیح تصویر

پروژه اولیه

برای دانلود پروژه‌ی اولیه روی این لینک کلیک کنید.

ساختار فایل‌ها

music_player/
├─ fonts/
├─ data.js
├─ index.html
├─ main.js
└─ styles.css

جزئیات پروژه

در گیف زیر می‌توانید عملکر کلی برنامه را مشاهده کنید:

توضیح تصویر

پیاده‌سازی فایل data.js

وقتی که به این فایل رجوع کنید سه پلی‌لیست مشاهده خواهید کرد، برای مثال:

اولین پلی‌لیست

const playlist1 = [
  {
    id: 1,
    title: "Skyline Dreams",
    artist: "Nova",
    genre: "Chill",
    duration: "3:45",
  },
  {
    id: 2,
    title: "Ocean Ride",
    artist: "Wavey",
    genre: "Electronic",
    duration: "4:12",
  },
  {
    id: 3,
    title: "Midnight Sun",
    artist: "Solar",
    genre: "Pop",
    duration: "2:58",
  },
  {
    id: 4,
    title: "Crystal Hearts",
    artist: "Amber",
    genre: "Indie",
    duration: "3:33",
  },
  {
    id: 5,
    title: "Velvet Sky",
    artist: "Luna",
    genre: "Ambient",
    duration: "3:10",
  },
];

توضیح تصویر

پیاده‌‌سازی فایل main.js

در ابتدای فایل تمام تگ‌ها و المان‌هایی که نیاز هست از آن‌ها استفاده کنید، تعریف شده‌اند.


const allMenu = document.getElementById("menu-all");
const playlistMenu = document.getElementById("menu-playlist");
const favoritesMenu = document.getElementById("menu-favorites");
const trackTitle = document.getElementById("track-title");
const trackArtist = document.getElementById("track-artist");
const trackGenre = document.getElementById("track-genre");
const trackTime = document.getElementById("track-time");
const progressBar = document.getElementById("progress-bar");
const progressFill = document.getElementById("progress-fill");

const controls = {
  play: document.getElementById("play"),
  prev: document.getElementById("prev"),
  next: document.getElementById("next"),
  shuffle: document.getElementById("shuffle"),
  favorite: document.getElementById("favorite")
};

let allTracks = [];
let currentTrackIndex = 0;
let activeTrackList = [];
let favorites = [];
let isShuffle = false;
let shuffledTrackList = [];
let timer = null;
let elapsedSeconds = 0;
let totalSeconds = 0;
let isPlaying = false;

متغیرها

توضیح تصویر

توابع

توضیح تصویر

پیاده‌سازی منوی آهنگ‌‌ها

توضیح تصویر

توضیح تصویر

ساختار منو در index.html

<aside class="menu">
        <div class="menu-section">
          <h3 class="toggle" data-section="all">
            <i class="fa-solid fa-headphones"></i> All Tracks
          </h3>
          <ul class="menu-list" id="menu-all"></ul>
        </div>
        <div class="menu-section">
          <h3 class="toggle" data-section="playlist">
            <i class="fa-solid fa-folder-music"></i> Playlists
          </h3>
          <ul class="menu-list" id="menu-playlist"></ul>
        </div>
        <div class="menu-section">
          <h3 class="toggle" data-section="favorites">
            <i class="fa-regular fa-heart"></i> Favorites
          </h3>
          <ul class="menu-list" id="menu-favorites"></ul>
        </div>
</aside>
  1. هر بخش از منو دارای یک <h3> برای عنوان (قابل کلیک) و یک <ul> برای نمایش لیست آیتم‌ها است.

  2. کلاس‌های toggle و open برای مدیریت باز/بسته بودن بخش‌ها استفاده می‌شوند.

  3. آیتم‌های آهنگ‌ها به صورت <li> درون <ul>ها قرار می‌گیرند.

  4. در بخش 📁 Playlists، هر لیست پخش می‌تواند شامل چند <ul> زیرمجموعه باشد (برای گروه‌بندی آهنگ‌ها)، که هرکدام شامل <li>‌های مربوط به آهنگ‌های همان دسته هستند.

نکته: نام آهنگ و نام خواننده که در لیست رندر می‌شوند باید به صورت زیر نمایش داده شوند:

songName + " - " + singerName

نمایش اطلاعات آهنگ

توضیح تصویر

توضیح تصویر

کنترلرهای موزیک پلیر

بخش Progress Bar

این بخش باید با زمان واقعی آهنگ هماهنگ باشد و قابلیت جابه‌جایی بین زمان‌های مختلف آهنگ را فراهم کند. پس از پایان آهنگ، باید به آهنگ بعدی منتقل شود.

آیکون‌ها و عملکرد آن

  1. پخش و توقف (fa-play / fa-pause): + زمانی که آهنگ در حال پخش است، آیکون (fa-pause) نمایش داده می‌شود و با کلیک بر روی آن، آهنگ متوقف می‌شود.
+ زمانی که آهنگ **متوقف** است، آیکون
	<i class="fa-solid fa-play"></i> (`fa-play`) نمایش داده می‌شود و با کلیک، پخش آهنگ ادامه پیدا می‌کند.

2. دکمه‌ی بازگشت (fa-backward-step): + اگر بیش از ۱۰ ثانیه از آهنگ گذشته باشد، با کلیک به ابتدای همان آهنگ بازمی‌گردیم.

+ اگر **کمتر از ۱۰ ثانیه** گذشته باشد، با کلیک به **آهنگ قبلی** منتقل می‌شویم.

3. دکمه‌ی جلو (fa-forward-step): + با کلیک روی این دکمه، به آهنگ بعدی منتقل می‌شویم.

  1. دکمه‌ی شافل (fa-shuffle):

    • با فعال کردن این دکمه، آهنگ‌ها به صورت تصادفی (Random) پخش می‌شوند.

    • با کلیک مجدد، پخش تصادفی غیرفعال می‌شود و ترتیب اصلی آهنگ‌ها بازمی‌گردد.

  2. دکمه‌ی علاقه‌مندی (fa-heart):

    • در حالت عادی، آیکون (fa-regular fa-heart) نمایش داده می‌شود.

    • با کلیک، آهنگ به لیست Favorites اضافه می‌شود و آیکون به (fa-solid fa-heart) تغییر می‌کند.

    • با کلیک مجدد، آهنگ از لیست Favorites حذف شده و آیکون دوباره به fa-regular fa-heart برمی‌گردد.

توضیح تصویر

آن‌چه باید آپلود کنید

  • توجه: پس از اعمال تغییرات، کل پروژه را Zip کرده و آپلود کنید. همانند پروژه اولیه در فایل زیپ شده نباید کد در پوشه‌ی دیگری قرار بگیرد در غیر این صورت سیستم داوری فایل را شناسایی نکرده و نمره‌ای دریافت نخواهید کرد.

  • توجه: تنها فایل‌هایی که در ساختار پروژه مشخص شده‌اند، در سیستم داوری مورد پذیرش قرار خواهد گرفت و سایر تغییرات در سایر فایل‌ها بی‌تاثیر خواهند بود.

  • توجه: پیش از آپلود پاسخ، کامنت‌های موجود در فایل main.js را حذف کنید.

ارسال پاسخ برای این سؤال
فایلی انتخاب نشده است.