⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 link_list.c

📁 自动侦测插入的存贮设备(U盘/移动硬盘等)
💻 C
字号:
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#define FROMPIPE

extern char log_tmp[128];
   
#define MAXLEN 128

struct Linknode{

	char  video_type[2];
  char star_play[20];
	char  star_play_offset[10];
  char  end_play[20];
	char video_length[10];
	char video_name[56];
  struct Linknode *next;
};

typedef struct Linknode Linklist;



long Divstr(char *str,Linklist * result)
{
	char *p,*pend;
	char tmp[MAXLEN];
	
	trim(str);
	if (strlen(str)<20)
		{
			return -1;
		}
	
	sprintf(tmp,"%s\0",str);
	tmp[strlen(tmp)]='\0';
	p=tmp;
    
    pend=p+1;
	for(;*pend!=';';pend++);
	*pend='\0';
	sprintf(result->video_type,"%s\0",p);
	
	
	if (strlen(result->video_type)==0)
		{
			return -1;
		}
	
	p=pend+1;
	for(;*pend!=';';pend++);
	*pend='\0';
	sprintf(result->star_play,"%s\0",p);
	
	if (strlen(result->star_play)==0)
		{
			return -1;
		}
	
	p=pend+1;
	for(;*pend!=';';pend++);
	*pend='\0';
	sprintf(result->star_play_offset,"%s\0",p);
	
		if (strlen(result->star_play_offset)==0)
		{
			return -1;
		}
	
	
	p=pend+1;
	for(;*pend!=';';pend++);
	*pend='\0';
	sprintf(result->end_play,"%s\0",p);
	
		
		if (strlen(result->end_play)==0)
		{
			return -1;
		}
	
	
	p=pend+1;
	for(;*pend!=';';pend++);
	*pend='\0';
    sprintf(result->video_length,"%s\0",p);

	
		if (strlen(result->video_length)==0)
		{
			return -1;
		}
	
	
	p=pend+1;
	sprintf(result->video_name,"%s\0",p);
	
	
		if (strlen(result->video_name)==0)
		{
			return -1;
		}
	
	return 0;
}



Linklist* readfile(char *path)
{
	Linklist *head,*p,*p1;
	char tmp[MAXLEN];
	int i;
	FILE *fp;
    
	fp = fopen(path,"r");
	if(fp==NULL)
		return NULL;
    
	head = (Linklist *)malloc(sizeof(Linklist));
	p=head;
	i=0;
	while(1)
	{
		i++;
		fgets(tmp,MAXLEN,fp);
		
		if (-1 == Divstr(tmp,p))
			{
				
				goto diverror;
			}
/*		printf("div=%s %s %s %s %s %s\n",p->video_type,p->star_play,p->star_play_offset,p->end_play,p->video_length,p->video_name);
*/		if(feof(fp)) break;

		p->next = (Linklist *)malloc(sizeof(Linklist));
		p=p->next;
	}
	for(p1=head;p1->next!=p;p1=p1->next);
	p1->next = NULL;
	
	free(p);
	fclose(fp);
	
	return head;
diverror:	
	free(p);
	fclose(fp);
	
	return -1;
	
	
}

long writefile(char *path,Linklist *head)
{
	Linklist *p;
	FILE *fp;
	char tmp[128];

	fp = fopen(path,"w+");
	if(fp==NULL)
		return -1;

	for(p=head;p!=NULL;p=p->next)
	{
		sprintf(tmp,"%s;%s;%s;%s;%s;%s\n",p->video_type,p->star_play,p->star_play_offset,p->end_play,p->video_length,p->video_name);		
		fputs(tmp,fp);
	}
	fclose(fp);

	return 0;
}

int InitLinkList(Linklist **Lnode)
{
   *Lnode=(Linklist*)malloc(sizeof(Linklist));
   (*Lnode)->next=NULL;
   
   if(!*Lnode)
   return 0;
  
}

/*在链表中插入节点*/
InsertLinkList(Linklist *Lnode,Linklist *new_data)
{
        Linklist *p,*q;
        
        p=Lnode->next;
        /*确定插入点*/
        while(p)
        p=p->next;
        
         /*插入节点q到p和p->next之间*/
        q=(Linklist*)malloc(sizeof(Linklist));
        memcpy(q,new_data,sizeof(Linklist));       
        q->next=p->next;
        p->next=q;
}


int get_Adjust_time(Linklist *p,int video_total_time)
{
	int Adjust_time; 
	
	Adjust_time = video_total_time - atol(p->video_length);
	return Adjust_time;
}


//int get_video_total_length(char *video_name,char *video_path)
//{
//
//	int length;
//	char path[128];
//	
//	sprintf(path,"%s/%s",video_path,video_name);
//  //printf("[get_video_total_time]:cmd=%s\n",cmd);
//  
// // my_system(cmd,result,128);
////  if ((fp = popen(cmd,"r"))== NULL)
////  	{
////  		return -1;
////  	}
////  		
//// fgets(result,128,fp);
//// pclose(fp);
// 
//  length=get_video_total_time(path);
//  if (length != -1)
//  {
//  	
//  	printf("[get_video_total_length]:length=%d\n",length);
//  	
//  	sprintf(log_tmp,"[get_video_total_length]:length=%d",length);
//  	logfile(log_tmp);
//  	
//  	return length;
//  }
//  else 
//  	{
//  		sprintf(log_tmp,"[get_video_total_length]:get_video_total_time fail\n");
//  	  logfile(log_tmp);
//  		printf("[get_video_total_length]:get_video_total_time fail\n");
//  		return -1;
//  	}
//  	
//	
//}

int get_video_total_length(char *video_name,char *video_path)
{
        char result[128];
        char cmd[256];

        int length;

        sprintf(cmd,"mplayer -vo null -ao null -frames 0 -identify %s/%s 2>/dev/null |grep -A 0 ID_LENGTH |awk '{print substr($0,11,2)}' ",video_path,video_name);
       // printf("[get_video_total_time]:cmd=%s\n",cmd);
       my_system(cmd,result,128);
       trim(result);
       if (strlen(result) !=0)
       {
             length = atol(result);
             printf("[get_video_total_length]:length=%d\n",length);
      
             sprintf(log_tmp,"[get_video_total_length]:length=%d",length);
             logfile(log_tmp);
      
             return length;
       }
       else
        {
                sprintf(log_tmp,"[get_video_total_length]:get_video_total_length fail\n");
                logfile(log_tmp);
                printf("[get_video_total_length]:get_video_total_length fail\n");
                return -1;
        }


}



/*仅仅调整开始播放时间:17:07:53:000;
 节目开播时间star_play = 节目开播时间star_play + Adjust_time
*/
int AdjustStartPlayTime(Linklist *p,int Adjust_time)
{
    char tmp[16];
    char *pp;
    char hh[3],mm[3],ss[3];
    unsigned long total_ss;
    
    strcpy(tmp,p->star_play);
    pp=tmp;
  
    strncpy(hh,pp,2);
    strncpy(mm,pp+3,2);
    strncpy(ss,pp+6,2);
    hh[2]=mm[2]=ss[2]='\0';
    total_ss= atol(hh)*3600 + atol(mm)*60 + atol(ss);
    
/*    printf("[AdjustStartPlayTime]: before:hh=%s,mm=%s,ss=%s,total_ss=%d\n",hh,mm,ss,total_ss);
  */  
    total_ss=total_ss+Adjust_time;
 
    sprintf(hh,"%2d",total_ss/3600);
    sprintf(mm,"%2d",(total_ss%3600)/60);
    sprintf(ss,"%2d",(total_ss%3600)%60);
    if (hh[0]==' ')  hh[0]='0';
    if (hh[1]==' ')  hh[1]='0';
    if (mm[0]==' ')  mm[0]='0';
    if (mm[1]==' ')  mm[1]='0';
    if (ss[0]==' ')  ss[0]='0';
    if (ss[1]==' ')  ss[1]='0';
    
 /*   printf("[AdjustStartPlayTime]: after: hh=%s,mm=%s,ss=%s,total_ss=%d\n",hh,mm,ss,total_ss);
   */ sprintf(p->star_play,"%s:%s:%s:%s\0",hh,mm,ss,pp+9);
   
    return 0;
}

/* 
  找到的记录只调整节目总时长video_length、节目结束时间end_play
  video_length = video_length+Adjust_time
  end_play = video_length - star_play_offset
  
*/
AdjustValOneRecord(Linklist *p,int Adjust_time)
{
    
 //  AdjustStartPlayTime(p,Adjust_time);
    
    sprintf(p->video_length,"%d\0",atol(p->video_length)+Adjust_time);
	  sprintf(p->end_play,"%d\0",atol(p->video_length)-atol(p->star_play_offset));
    return 0;
}



AdjustVal(Linklist *p_find_point,int video_total_time)
{	 
        Linklist *p;
        int Adjust_time;
        
        p=p_find_point;
        
        if(p != NULL)
        {
           Adjust_time = get_Adjust_time(p,video_total_time);
           
          /* printf("[AdjustVal]:Adjust_time=%d\n",Adjust_time);
           printf("[AdjustVal]:before %s;%s;%s;%s;%s;%s\n",p->video_type,p->star_play,p->star_play_offset,p->end_play,p->video_length,p->video_name);		
           AdjustValOneRecord(p,Adjust_time);
           printf("[AdjustVal] :after %s;%s;%s;%s;%s;%s\n",p->video_type,p->star_play,p->star_play_offset,p->end_play,p->video_length,p->video_name);		
          */
           AdjustValOneRecord(p,Adjust_time);
           p=p->next;
        }
        
        while(p != NULL)
        {
        	         	 
             AdjustStartPlayTime(p,Adjust_time);
 
            p=p->next;
        }
        
}

FindLinkList(Linklist *Lnode,char *video_name,char *video_path)
{
        Linklist *p,*q;
        int count=0;
        int video_total_time;
        
        if (-1 == (video_total_time=get_video_total_length(video_name,video_path)))
        	{
        		return -1;
        	}
        
        p=Lnode;
        
        
        /*确定*/
        while(p != NULL)
        {
//            printf("==========video_name=%s\n",video_name);
//            printf("=====link_video_name=%s\n",p->video_name);
            trim(video_name);
            trim(p->video_name);
            if (strcmp(video_name,p->video_name) == 0)
            {
            	  //printf("     video_name=  %s\n",video_name);
            	  //printf("link_video_name=  %s\n",p->video_name);
               	AdjustVal(p,video_total_time);
            	count++;
            }
            
            p=p->next;
        }
        
        if (count == 0)
         {
           printf("[FindLinkList]:not find:%s\n",video_name);
            sprintf(log_tmp,"[FindLinkList]:not find:%s",video_name);
  	        logfile(log_tmp);
           return  -1;
         }else
         {
         	  sprintf(log_tmp,"[FindLinkList]:====find:%s[count=%d]",video_name,count);
  	        logfile(log_tmp);
           printf("[FindLinkList]:====find:%s[count=%d]\n",video_name,count);
           return 0;
         }
        
        
}


int LengthLinkList(Linklist *Lnode)
{
   int i=0;
   Linklist *p;
   p=Lnode;
   while(p)
   {
       i++;
     
       p=p->next;
   }
   return i;
}





DestroyLinkList(Linklist *Lnode)
{
   Linklist *p,*q;
   p=Lnode;
   while(p)
   {
      q=p->next;
      free(p);
      p=q;
   }
}


int  handle_video_list(char *video_list_path,char *video_path)
{
	  Linklist *L;
	  char path_tmp[128],cmd[128];
	  int count;
	  char tmp[128];
    char filename[56];
      FILE *fp;
	    
	    printf("[handle_video_list]:handle video_list_path:%s.....\n",video_list_path);
	     
	    sprintf(log_tmp,"[handle_video_list]:handle video_list_path:%s.....",video_list_path);
  	  logfile(log_tmp);    
     // strcpy(path_tmp,"tmp.txt");
     strcpy(path_tmp,video_list_path);//直接调整播放列表
      
     
     #ifdef FROMPIPE 
      sprintf(cmd,"ls %s/*.mpg 2>&1|grep -v such",video_path);
	   #else
	    sprintf(cmd,"t.txt");
	   #endif
	    
     InitLinkList(&L);
     
     if ((L=readfile(video_list_path)) == -1)
     	{
         printf("[handle_video_list]:init %s  link fail\n",video_list_path);
	     
	        sprintf(log_tmp,"[handle_video_list]:init %s  link fail",video_list_path);
  	     logfile(log_tmp); 
     		 return -1;
     		
     	}
     count=LengthLinkList(L);

     #ifdef FROMPIPE 
       fp = popen(cmd,"r");
	   #else
	      fp = fopen(cmd,"r");
	   #endif
	
    if(fp==NULL)	   
	  {
	    	
	    	printf("[handle_video_list]:fopen error:%s\n",cmd);
	    	sprintf(log_tmp,"[handle_video_list]:fopen error:%s",cmd);
  	            logfile(log_tmp);
	    	perror("[handle_video_list]");
	    	goto handle_err;
	  }
       
	    while(1)
	    {	  
	    	  	 
	    	  fgets(tmp,128,fp);

	    	  
	    	  //if(feof(fp)) break;
          if (strlen(tmp)!=0)
          {	
	    	   
	    	    trim(tmp);
	    	    getfilename(tmp,filename);
	    	    printf("[handle_video_list]:update video:%s.....\n",filename);	    	    
	    	    if (-1 == FindLinkList(L,filename,video_path))
	    	    	{
	    	    		printf("[handle_video_list]:FindLinkList fail,not find: %s\n",filename);
	    	    		 sprintf(log_tmp,"[handle_video_list]:FindLinkList fail,not find: %s",filename);
  	            logfile(log_tmp);
//	               #ifdef FROMPIPE 
//                     pclose(fp);;
//	               #else
//	                   fclose(fp);
//	               #endif
//	               goto handle_err;
	    	    	}
	    	  }
          strcpy(tmp,"");
	    	  if(feof(fp)) break;
          
	    } 
	    
	    #ifdef FROMPIPE 
        pclose(fp);;
	   #else
	       fclose(fp);
	   #endif
	   
	    
	
     writefile(path_tmp,L);
     DestroyLinkList(L);
     return count;
handle_err:
     DestroyLinkList(L);
     return -1;
}



//void main()
//{
//	char video_list_path[128],video_path[128];
//	int ret;
//	  
//    strcpy(video_list_path,"T34D1.txt");
//    strcpy(video_path,"");
//    
//	printf("[auto_cp]:video_list_path=%s\n",video_list_path); 
//	
//	if ((ret=handle_video_list(video_list_path,video_path)) >= 0)
//	{
//		printf("[auto_cp]:video_list update success,record num =%d\n",ret);
//	}
//
//}






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -