ひとまず、作ってみた。
MySQLでデータ管理をして、プログラムを実行すると、前回からの再生回数が差分として登録される。
DBはざっとこんな構成でテーブルは2つのみ。
mysql> desc tbm_track;
+———————-+————–+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+———————-+————–+——+—–+———+——-+
| Track_id | int(11) | NO | PRI | NULL | |
| Name | varchar(160) | YES | | NULL | |
| Artist | varchar(80) | YES | | NULL | |
| Album_Artist | varchar(45) | YES | | NULL | |
| Album | varchar(200) | YES | | NULL | |
| Genre | varchar(45) | YES | | NULL | |
| Kind | varchar(45) | YES | | NULL | |
| Size | int(11) | YES | | NULL | |
| Total_Time | int(11) | YES | | NULL | |
| Disc_Number | int(11) | YES | | NULL | |
| Disc_Count | int(11) | YES | | NULL | |
| Year | int(11) | YES | | NULL | |
| Date_Modified | datetime | YES | | NULL | |
| Date_Added | datetime | YES | | NULL | |
| Bit_Rate | int(11) | YES | | NULL | |
| Sample_Rate | int(11) | YES | | NULL | |
| Play_Count | int(11) | YES | | NULL | |
| play_date | datetime | YES | | NULL | |
| Play_Date_UTC | datetime | YES | | NULL | |
| Sort_Atrist | varchar(45) | YES | | NULL | |
| Compilation | varchar(45) | YES | | NULL | |
| Persistent_ID | varchar(45) | YES | | NULL | |
| Track_Type | varchar(45) | YES | | NULL | |
| Location | varchar(500) | YES | | NULL | |
| File_Folder_Count | int(11) | YES | | NULL | |
| Lobrary_Folder_Count | int(11) | YES | | NULL | |
+———————-+————–+——+—–+———+——-+
26 rows in set (0.02 sec)
mysql> desc tbl_update
-> ;
+————————+————-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+————————+————-+——+—–+———+——-+
| Track_ID | int(11) | NO | PRI | NULL | |
| Update_data | datetime | NO | PRI | NULL | |
| Type | varchar(45) | YES | | NULL | |
| Play_Count | int(11) | YES | | NULL | |
| Incremental_Play_Count | int(11) | YES | | NULL | |
+————————+————-+——+—–+———+——-+
5 rows in set, 1 warning (0.02 sec)
Javaのソースはひとまず動かしたレベル。XMLの読取はhttp://d.hatena.ne.jp/terazzo/20080524/1211656594を参考にして、そこのソースは割愛。
import java.io.IOException;
import java.net.URL;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.xml.sax.SAXException;
import sample.plist.PropertyListUtils;
public class ItunesList {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
ItunesList t = new ItunesList();
try{
t.printTracks();
}catch (Exception e){
e.printStackTrace();
}
}
private static final String TEST_FILE_PATH = “file:C:\\Users\\jun\\Music\\iTunes\\iTunes Music Library.xml“;
public void printTracks() throws IOException, SAXException {
// xmlファイルの読み込み
//URL url = getClass().getResource(TEST_FILE_PATH);
URL url = new URL(TEST_FILE_PATH);
Object content = PropertyListUtils.load(url);
Map tracks = (Map)*1 {
try{
Integer track_id_xml = (Integer)xml_track.get(“Track ID”);
//すでにDBに登録済みかチェック
boolean already_rip_check=false;
for(TbmTrack tbm_track_db : db_mater_list){
if(tbm_track_db.getTrack_id() == track_id_xml.intValue()){
//再生回数を更新
already_rip_check = true;
if*2.intValue() ){
TblUpdate update = this.setTblUpdate(tbm_track_db,(Integer)xml_track.get(“Play Count”));
em.persist(update);
tbm_track_db.setPlay_Count*3;
}
break;
}
}
if(!already_rip_check){
//該当レコードが無いので新規追加
TbmTrack track = setTbmTrack(xml_track);
em.persist(track);
}
}catch (Exception e){
e.printStackTrace();
}
}
tx.commit();
em.close();
emf.close();
}
private TblUpdate setTblUpdate(TbmTrack tbmtrack,Integer fromXml){
TblUpdate update = new TblUpdate();
update.setTrack_ID(tbmtrack.getTrack_id());
update.setUpdate_data(new Date());
update.setPlay_Count(tbmtrack.getPlay_Count());
update.setIncremental_Play_Count(fromXml.intValue() – tbmtrack.getPlay_Count());
return update;
}
private TbmTrack setTbmTrack(Map xml_track) {
TbmTrack track = new TbmTrack();
track.setTrack_id*4;
track.setAlbum*5;
track.setAlbum_Artist*6;
track.setArtist*7;
if(xml_track.get(“Bit Rate”) != null){
track.setBit_Rate*8;
}
track.setCompilation*9;
track.setDate_Added*10;
track.setName*11;
track.setGenre*12;
track.setKind*13;
track.setSize*14;
if(xml_track.get(“Disc Number”) != null){
track.setDisc_Number*15;
}
if(xml_track.get(“Disc Count”) != null){
track.setDisc_Count*16;
}
if(xml_track.get(“Year”) != null){
track.setYear*17;
}
if(xml_track.get(“Date Modified”) != null){
track.setDate_Modified*18;
}
if(xml_track.get(“Sample Rate”) != null){
track.setSample_Rate*19;
}
if(xml_track.get(“Play Count”) != null){
track.setPlay_Count*20;
}
if(xml_track.get(“Play Date”) != null){
track.setPlay_Date(new Date(((Integer) xml_track.get(“Play Date”)).longValue()));
}
track.setCompilation*22;
track.setPersistent_ID*23;
track.setTrack_Type*24;
return track;
}
public static List getAllRecordsTbmTrack(EntityManager em){
Query q = em.createQuery(“select t from TbmTrack t”);
List list = q.getResultList();
return list;
}
}
*1:Map) content).get(“Tracks”);
int i=1;
EntityManagerFactory emf = Persistence.createEntityManagerFactory(“JPA_test”);
EntityManager em = emf.createEntityManager();
// DBの最新情報を取得
List db_mater_list = getAllRecordsTbmTrack(em);
EntityTransaction tx = em.getTransaction();
tx.begin();
for (Map xml_track : tracks.values(
*2:xml_track.get(“Play Count”) != null) &&
tbm_track_db.getPlay_Count() != ((Integer)xml_track.get(“Play Count”
*3:Integer)xml_track.get(“Play Count”
*4:Integer)xml_track.get(“Track ID”
*5:String)xml_track.get(“Album”
*6:String)xml_track.get(“Album Artist”
*7:String)xml_track.get(“Artist”
*8:Integer)xml_track.get(“Bit Rate”
*9:String)xml_track.get(“Compilation”
*10:Date)xml_track.get(“Date Added”
*11:String)xml_track.get(“Name”
*12:String)xml_track.get(“Genre”
*13:String)xml_track.get(“Kind”
*14:Integer)xml_track.get(“Size”
*15:Integer)xml_track.get(“Disc Number”
*16:Integer)xml_track.get(“Disc Count”
*17:Integer)xml_track.get(“Year”
*18:Date)xml_track.get(“Date Modified”
*19:Integer)xml_track.get(“Sample Rate”
*20:Integer)xml_track.get(“Play Count”
*21:Date)xml_track.get(“Play Date UTC“
*22:String)xml_track.get(“Compilation”