npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

tracking-lib-ott

v1.0.21

Published

Thư viện tracking events dành cho các dự án OTT (Web, Smart TV).

Downloads

2,259

Readme

Tracking Library OTT

Thư viện tracking events dành cho các dự án OTT (Web, Smart TV).

Cài đặt

npm install tracking-lib-ott
# hoặc
yarn add tracking-lib-ott

Session ID

const sessionId = getOrCreateSessionId({
  domain: window.location.hostname,
  expirationMinutes: 30,
});

1. Khởi tạo (Init)

import tracking from "tracking-lib-ott";

tracking.init({
  baseURL: "https://api.example.com/v2/event_batch",
  debug: true,

  // Required fields
  appId: "ONPlus", // ONPlus, ONLiveTV
  packageId: "Name of app",
  sessionSign: "md5_signature", // MD5(append(sessionId, secret_key))
  deviceId: "device-unique-id",
  platform: "SmartTV", // WebPC | WebMobile | SmartTV | AndroidTV
  deviceModel: "Samsung TV 2024",
  deviceBrand: "Samsung",
  events: [],
  userId: -1, // User ID, -1 nếu chưa đăng nhập

  // Optional fields
  adId: "gaid-or-idfa",
  deviceOsVersion: "17.0",
  sdkVersion: "1.0.0",
});

2. Set User Info

// Khi user đăng nhập -> set userId
// userId sẽ tự động được thêm vào mỗi event
tracking.setUserInfo({ userId: 12345 });

// Khi user đăng xuất
tracking.setUserInfo({ userId: -1 });

3. Track Page View

tracking.trackPageView("/home");
tracking.trackPageView("/detail/123");
tracking.trackPageView("/live/channel-1");

4. Track Custom Event

tracking.trackEvent("button_click", {
  button_id: "subscribe_btn",
  page_id: "detail",
});

tracking.trackEvent("search", {
  keyword: "bóng đá",
  results_count: 25,
});

Video Playback Events

Thư viện hỗ trợ các events cho video player:

Flow tracking video

view_content_details → playback_started → playback_progress (định kỳ) → playback_completed
                                       ↘ playback_paused ↔ playback_resumed
                                       ↘ buffer_started → buffer_ended
                                       ↘ quality_changed
                                       ↘ playback_error

1. View Content Details

import { trackViewContentDetails } from "tracking-lib-ott";

trackViewContentDetails(
  "content_123", // contentId
  "Phim ABC", // contentTitle
  0, // contentType: 0=VOD, 1=Event, 2=Channel
  "channel_vtv1", // channelId (optional)
  1755766513, // eventTime (optional)
);

2. Playback Started

import { trackPlaybackStarted } from "tracking-lib-ott";

trackPlaybackStarted({
  contentId: "content_123",
  contentTitle: "Phim ABC",
  contentType: 0, // 0=VOD, 1=Live, 2=Channel
  playbackSession: "md5_session_hash", // MD5(content_id + start_timestamp)
  videoQuality: "1080p", // 360p | 480p | 720p | 1080p | 2k | 4k
  startTimestamp: 1755766513,
  startPosition: 0, // Live=0, VOD: 0 nếu mới, >0 nếu resume
  duration: 3600, // Live=-1, VOD=số giây
  // Optional
  channelId: "channel_vtv1",
  subContentId: "program_456",
  subContentTitle: "Thời sự 19h",
});

3. Playback Progress (gửi định kỳ 5s/25s)

import { trackPlaybackProgress } from "tracking-lib-ott";

trackPlaybackProgress({
  contentId: "content_123",
  contentTitle: "Phim ABC",
  contentType: 0,
  playbackSession: "md5_session_hash",
  totalWatchTime: 60, // Tổng thời gian đã xem (giây, không tính pause)
  // Optional
  channelId: "channel_vtv1",
  subContentId: "program_456",
  subContentTitle: "Thời sự 19h",
});

4. Playback Completed

import { trackPlaybackCompleted } from "tracking-lib-ott";

trackPlaybackCompleted({
  contentId: "content_123",
  contentTitle: "Phim ABC",
  contentType: 0,
  playbackSession: "md5_session_hash",
  totalWatchTime: 3600,
  // Optional
  channelId: "channel_vtv1",
  subContentId: "program_456",
  subContentTitle: "Thời sự 19h",
});

5. Playback Paused / Resumed

import { trackPlaybackPaused, trackPlaybackResumed } from "tracking-lib-ott";

// Khi user pause
trackPlaybackPaused({
  contentId: "content_123",
  contentTitle: "Phim ABC",
  contentType: 0,
  playbackSession: "md5_session_hash",
  positionSec: 120,
});

// Khi user resume
trackPlaybackResumed({
  contentId: "content_123",
  contentTitle: "Phim ABC",
  contentType: 0,
  playbackSession: "md5_session_hash",
  positionSec: 120,
});

6. Buffer Started / Ended

import { trackBufferStarted, trackBufferEnded } from "tracking-lib-ott";

// Khi bắt đầu buffer
trackBufferStarted({
  contentId: "content_123",
  contentTitle: "Phim ABC",
  contentType: 0,
  playbackSession: "md5_session_hash",
  videoQuality: "1080p",
  positionSec: 120,
  reason: "network_congestion", // seek_operation | network_congestion
});

// Khi kết thúc buffer
trackBufferEnded({
  contentId: "content_123",
  contentTitle: "Phim ABC",
  contentType: 0,
  playbackSession: "md5_session_hash",
  videoQuality: "1080p",
  positionSec: 120,
  bufferDurationSec: 3, // Buffer mất 3 giây
  reason: "network_congestion",
});

7. Quality Changed

import { trackQualityChanged } from "tracking-lib-ott";

trackQualityChanged({
  contentId: "content_123",
  contentTitle: "Phim ABC",
  contentType: 0,
  playbackSession: "md5_session_hash",
  fromQuality: "480p",
  toQuality: "1080p",
  positionSec: 120,
  reason: "user_selected", // automatic_abr | user_selected
});

8. Playback Error

import { trackPlaybackError } from "tracking-lib-ott";

trackPlaybackError({
  contentId: "content_123",
  contentTitle: "Phim ABC",
  contentType: 0, // 0=VOD, 1=Live
  playbackSession: "md5_session_hash",
  errorCode: 404,
  errorMessage: "Video not found",
  errorType: "network_error", // video_playback_error, network_error...
});

Session Lifecycle Tracking

| Event | Khi nào gọi | | ------------------ | ------------------------- | | session_start | User mở app | | session_progress | Định kỳ (mặc định 5 phút) | | session_end | User đóng tab/browser/app |

import tracking from "tracking-lib-ott";

// Init session tracking
tracking.initSession({
  progressInterval: 5 * 60 * 1000, // 5 phút
  autoStart: true,
  debug: true,
});

// Cleanup khi unmount
tracking.cleanupSession();

Tích hợp Next.js (Pages Router)

import { useEffect } from "react";
import { useRouter } from "next/router";
import tracking from "tracking-lib-ott";

function MyApp({ Component, pageProps }) {
  const router = useRouter();

  useEffect(() => {
    // 1. Init tracking
    tracking.init({
      baseURL: process.env.NEXT_PUBLIC_TRACKING_URL,
      appId: "ONPlus",
      packageId: "com.example.app",
      sessionSign: "session-sign",
      deviceId: "device-id",
      platform: "WebPC",
      deviceModel: navigator.userAgent,
      deviceBrand: "Web Browser",
      events: [],
      debug: process.env.NODE_ENV === "development",
    });

    // 2. Set user info (after login)
    tracking.setUserInfo({ userId: 12345 });

    // 3. Auto track page views
    const cleanup = tracking.usePageViewTracking(router);

    // 4. Init session tracking
    tracking.initSession({ autoStart: true });

    return () => {
      cleanup?.();
      tracking.cleanupSession();
    };
  }, [router]);

  return <Component {...pageProps} />;
}

export default MyApp;

Custom Page Mapping

tracking.init({
  // ... other config
  pageMap: {
    // Override hoặc thêm mới
    phim: { name: "Phim", id: "movie" },
    "the-thao": { name: "Thể thao", id: "sports" },
  },
});

Default page mapping:

| URL Path | Page Name | Page ID | | ----------- | --------- | -------- | | / | Home | home | | /home | Home | home | | /search | Search | search | | /detail | Detail | detail | | /player | Player | player | | /video | Video | video | | /live | Live | live | | /category | Category | category | | /profile | Profile | profile | | /login | Login | login |


API Reference

TrackingConfig (Required Fields)

| Field | Type | Giới hạn | Mô tả | | ------------- | ------ | -------- | -------------------------------------------------- | | baseURL | string | - | URL endpoint | | appId | string | - | ONPlus, ONLiveTV | | packageId | string | ≤ 125 | Package/Bundle ID | | sessionId | string | UUID v4 | Session ID | | sessionSign | string | 16..128 | MD5(append(session_id, secret_key)) | | deviceId | string | ≤ 125 | Device unique ID | | platform | string | - | Android, Ios, WebPC, WebMobile, SmartTV, AndroidTV | | deviceModel | string | ≤ 125 | Model thiết bị | | deviceBrand | string | ≤ 125 | Hãng thiết bị | | events | array | - | Mảng events (không rỗng) |

TrackingConfig (Optional Fields)

| Field | Type | Giới hạn | Mô tả | | ----------------- | ------- | -------- | ------------------ | | adId | string | ≤ 125 | GAID/IDFA | | deviceOsVersion | string | ≤ 50 | VD: "14", "17.6" | | sdkVersion | string | ≤ 50 | Phiên bản SDK | | debug | boolean | - | Bật/tắt debug logs |

Lưu ý: ip_addresscarrier_net KHÔNG cần gửi. Server tự lấy từ header.

Event Object Format

| Field | Type | Bắt buộc | Mô tả | | -------------- | ------ | -------- | --------------------- | | user_id | bigint | ✅ | -1 nếu chưa đăng nhập | | event_name | string | ✅ | Tên event (≤ 125) | | event_time | int | ✅ | Unix seconds | | event_params | string | ❌ | JSON string (≤ 1024) |


Publish

npm version patch
npm publish