File: src/mylist/MyListItem.coffee
###*
# マイリストの項目モデルです。
#
# Properties
# getメソッドを通じて第1階層まで取得できます。
# Example. mylistItem.get("movie").title
#
# - id : number -- マイリスト項目ID
# - type : number -- 項目の種類(動画、静画など)
# - description : string -- マイリストコメント
# - createTime : Date -- 追加日
# - updateTime : Date -- 更新日(?)
# - watch : number -- 不明
# - movie : Object -- 動画情報
# - id : string -- 動画ID
# - title : string -- 動画タイトル
# - length : number -- 動画の長さ(秒)
# - thumbnail : string -- サムネイル画像のURL
#
# - groupType : string -- 不明
# - lastResponse : string -- 最近投稿されたコメントの一部
# - isDeleted : boolean -- 削除されているか
#
# - updateTime : Date -- この情報の最終更新日時(?)
# - firtsRetrieve : Date -- 動画投稿日
#
# - count -- カウンタ系の情報が詰められたオブジェクト
# - view : number -- 再生数
# - comments : number -- コメント数
# - mylist : number -- マイリスト数
#
# @class MyListItem
###
_ = require "lodash"
__ = require "lodash-deep"
Ent = require "ent"
Emitter = require "../Emitter"
sprintf = require("sprintf").sprintf
deepFreeze = require "deep-freeze"
module.exports =
class MyListItem extends Emitter
###*
# @static
# @property {Object} ItemTypes アイテムの種類のリスト
# @property {Number} ItemTypes.movie 動画
# @property {Number} ItemTypes.seiga 静画
###
@ItemTypes : deepFreeze
MOVIE : 0
SEIGA : 5
BOOK : 6
BLOMAGA : 13
@defaults :
id : -1
type : -1
description : null
createTime : null
updateTime : null
watch : 0
movie : null
###*
# MylistAPIの取得結果の一部からMyListItemのオブジェクトを生成します。
# @static
# @method fronApiResponse
# @param {Object} itemInfo
# @param {MyList} mylist
###
@fromApiResponse : (itemInfo, mylist) ->
item = new MyListItem
item._attr = deepFreeze(MyListItem.parse itemInfo)
item.list = mylist
Object.defineProperties item,
id :
value : item.get("id") | 0
@parse : (itemInfo) ->
item = itemInfo.item_data
attr =
id : itemInfo.item_id|0
type : itemInfo.item_type|0
description : itemInfo.description
watch : itemInfo.watch
createTime : new Date(itemInfo.create_time * 1000)
updateTime : new Date(itemInfo.update_time)
movie :
id : item.video_id
title : Ent.decode(item.title)
length : item.length_seconds|0 # 秒数
thumbnail : item.thumbnail_url
groupType : item.group_type
lastResponse : item.last_res_body
isDeleted : item.deleted isnt "0"
updateTime : new Date(item.update_time * 1000)
firtsRetrieve : new Date(item.first_retrieve * 1000)
count :
view : item.view_counter|0
comments : item.num_res|0
mylist : item.mylist_counter|0
attr
###*
# @private
# @property {Object} _attr
###
###*
# @property {Number} id
###
###*
# @param {String} path
# @return
###
get : (path) ->
__.deepGet @_attr, path
###*
# @return {Promise}
###
delete : ->
@list.deleteItem @
###*
# @return {Boolean}
###
isMovie : ->
@get("type") is MyListItem.ItemTypes.MOVIE
###*
# @return {Boolean}
###
isSeiga : ->
@get("type") is MyListItem.ItemTypes.SEIGA
###*
# @return {Boolean}
###
isBook : ->
@get("type") is MyListItem.ItemTypes.BOOK
###*
# @return {Boolean}
###
isBlomaga : ->
@get("type") is MyListItem.ItemTypes.BLOMAGA